使用browserify、gulp和react.js时收到“错误:找不到模块”

14

所以我一直在尝试着使用React.js、gulp和browserify。一切都很顺利,直到我尝试在我的main.js文件中引用一个模块时出现了问题。我可以毫无问题地在其他文件中引用组件/模块(见下文),但是当我尝试在我的main.js文件中引用一个模块时,在运行gulp serve时会收到以下错误:

Error: Cannot find module './components/Feed' from '/Users/kevin/Documents/MyWork/web/react/app/src/js' at /Users/kevin/Documents/MyWork/web/react/node_modules/browserify/node_modules/resolve/lib/async.js:55:21 at load (/Users/kevin/Documents/MyWork/web/react/node_modules/browserify/node_modules/resolve/lib/async.js:69:43) at onex (/Users/kevin/Documents/MyWork/web/react/node_modules/browserify/node_modules/resolve/lib/async.js:92:31) at /Users/kevin/Documents/MyWork/web/react/node_modules/browserify/node_modules/resolve/lib/async.js:22:47 at Object.oncomplete (fs.js:107:15)

如果我从main.js中删除对于Feed.js的require语句,一切都能正常编译并被放置在适当的dist文件夹中,并且能够正常运行(当然,除了react.js会抱怨缺少一个模块)。

首先,我的文件夹结构看起来像这样:

app
│-- gulpfile.js
│-- package.json
│
└───src
│   │
│   ├───js
│       │-- main.js
│       └───components
│            │-- Feed.js
│            │-- FeedList.js
│            │-- FeedItem.js
│            │-- FeedForm.js
│            │-- ShowAddButton.js
│            └
│   
└───dist

我的gulpfile看起来像这样:

var gulp = require('gulp'),
    connect = require('gulp-connect'),
    open = require("gulp-open"),
    browserify = require('browserify'),
    reactify = require('reactify'),
    source = require("vinyl-source-stream"),
    concat = require('gulp-concat'),
    port = process.env.port || 3031;

// browserify and transform JSX
gulp.task('browserify', function() {
    var b = browserify();
    b.transform(reactify);
    b.add('./app/src/js/main.js');
    return b.bundle()
        .pipe(source('main.js'))
        .pipe(gulp.dest('./app/dist/js'));
});

// launch browser in a port
gulp.task('open', function(){
    var options = {
        url: 'http://localhost:' + port,
    };
    gulp.src('./app/index.html')
    .pipe(open('', options));
});

// live reload server
gulp.task('connect', function() {
    connect.server({
        root: 'app',
        port: port,
        livereload: true
    });
});

// live reload js
gulp.task('js', function () {
    gulp.src('./app/dist/**/*.js')
        .pipe(connect.reload());
});

// live reload html
gulp.task('html', function () {
    gulp.src('./app/*.html')
    .pipe(connect.reload());
});

// watch files for live reload
gulp.task('watch', function() {
    gulp.watch('app/dist/js/*.js', ['js']);
    gulp.watch('app/index.html', ['html']);
    gulp.watch('app/src/js/**/*.js', ['browserify']);
});

gulp.task('default', ['browserify']);

gulp.task('serve', ['browserify', 'connect', 'open', 'watch']);

我的main.js文件长这样:

var React = require('react'),
    Feed = require('./components/Feed');

React.renderComponent(
    <Feed />,
    document.getElementById('app')
);

Feed.js文件看起来像:

var React = require('react');
var FeedForm = require('./FeedForm');
var ShowAddButton = require('./ShowAddButton');
var FeedForm = require('./FeedForm');
var FeedList = require('./FeedList');

var Feed = React.createClass({

    getInitialState: function() {
        var FEED_ITEMS = [
            { key: '1', title: 'Just something', description: 'Something else', voteCount: 49 },
            { key: '2', title: 'Some more stuff', description: 'Yeah!', voteCount: 34 },
            { key: '3', title: 'Tea is good', description: 'yepp again', voteCount: 15 },
        ];

        return {
            items: FEED_ITEMS
        };
    },

    render: function() {
        return (
            <div>
                <div className="container">
                    <ShowAddButton />
                </div>

                <FeedForm />

                <br />
                <br />

                <FeedList items={this.state.items} />
            </div>
        );
    }

});

module.exports = Feed;

我肯定是忽略了某些非常简单的东西...但是我已经做了好几个小时,似乎无法解决它。非常感谢您的任何帮助。(显然,为了尽可能简洁,我没有发布其他组件的代码...但它们不是问题所在。)


var Feed.js?那是打错了吗? - elclanrs
抱歉...是的...已经更正了。 - kevindeleon
2
你能否创建一个 Github 仓库,将所有代码放进去?我用你提供的代码创建了一个项目,并且它成功构建了。 - SteveLacy
@SteveLacy 好的...github仓库在这里 https://github.com/kevindeleon/react-test基本上这是一些我在网上找到的测试代码,但这就是我在我的系统上运行失败的确切代码。如果有任何区别,我的操作系统是OS X Yosemite。 - kevindeleon
@SteveLacy -- 另外...显然,需要运行 npm i 来安装所有必需的 node_modules...但我假设任何阅读此文的人都已经知道了。 - kevindeleon
啊,有了下面的正确答案,我通过手动创建没有空格名称的文件来使我的构建成功。 - SteveLacy
3个回答

30

你的文件名并不是你想象的那样。请注意:

$ find app -type f | awk '{print "_"$0"_"}'
_app/dist/js/main.js_
_app/index.html_
_app/src/js/components/Feed.js _
_app/src/js/components/FeedForm.js _
_app/src/js/components/FeedItem.js_
_app/src/js/components/FeedList.js_
_app/src/js/components/ShowAddButton.js_
_app/src/js/main.js_

您的Feed.js文件实际上是Feed.js<SPACE>。对于FeedForm.js也是如此。将它们重命名可以使您的示例存储库成功构建。


2
我的天啊...非常感谢!我不知道怎么发生了那个问题。你帮我省了好多时间!我感觉自己像个傻瓜 :( - kevindeleon
4
哇!我非常好奇你是如何注意到这个的 :-) - Brigand
1
如果我要猜的话...他可能只是有一种直觉,然后运行了他上面留下的命令($ find app -type f | awk '{print "_"$0"_"}')来确认。 - kevindeleon
我很幸运。当我在输入文件名时,zsh的标签自动完成了文件名,并在末尾添加了一个空格,然后我运行了上面的命令以查看是否还有其他文件。 - loganfsmyth

2
请尝试以下代码:
var React = require('react');
var FeedForm = require('./FeedForm.jsx');
var ShowAddButton = require('./ShowAddButton.jsx');
var FeedForm = require('./FeedForm.jsx');
var FeedList = require('./FeedList.jsx');

在添加文件扩展名(.jsx)后,我的问题得到解决。

谢谢, Sulok


请解释一下...? - Giridhar Karnik
他的解释是你需要明确指定文件扩展名。对我有用。 - s2t2
在gulpfile.js中,您可以指定var bundler = browserify({ entries:['./scripts/jsx/app.jsx'], transform:[reactify], extensions:['.jsx'], debug:true, cache:{}, packageCache:{}, fullPaths:true }); extensions属性很重要,然后您可以删除.jsx扩展名。 - Jasmin

0

也许快速解决方案是...

  "start": "watchify ./src/js/* ./src/jsx/*.jsx -v -t babelify -o ./build/app/bundle.js"

在你的脚本中添加 *.jsx。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接