【发布时间】:2016-03-21 16:54:03
【问题描述】:
我已经创建了一个 React 组件,我想分发这个组件的内置版本(使用 gulp 构建),所以在 gulpfile.js 我有:
var gulp = require('gulp');
var browserify = require('browserify');
var babelify = require('babelify');
var source = require('vinyl-source-stream');
gulp.task('build-js', function() {
return browserify('./src/Foo.js')
.transform(babelify)
.bundle()
.pipe(source('bundle.js'))
.pipe(gulp.dest('./dist'));
});
gulp.task('build', ['build-js']);
在.babelrc:
{
"presets": ["es2015", "react", "stage-0"],
}
这些是package.json中的依赖:
"dependencies": {
"react": "^0.14.7"
}
"devDependencies": {
"babel-polyfill": "^6.3.14",
"babel-preset-es2015": "^6.3.13",
"babel-preset-react": "^6.3.13",
"babel-preset-stage-0": "^6.3.13",
"babelify": "^7.2.0",
"browserify": "^13.0.0",
"gulp": "^3.9.1",
"react": "^0.14.7",
"react-dom": "^0.14.7",
"vinyl-source-stream": "^1.1.0"
}
当我运行gulp build(在npm install 之后)build.js 文件是在/dist 下创建的,但是当我尝试从其他 React 应用程序中使用这个组件时,我得到了错误:
错误:找不到模块“./emptyFunction”。
如果我深入研究这个文件 (build.js),我可以看到这些行:
var emptyFunction = require('./emptyFunction');
...
var camelize = require('./camelize');
./dist 下不存在这些文件,所以当我尝试构建调用该组件的新 React 应用时会抛出错误:
import Foo from 'my-components-in-node-modules';
我错过了什么?
编辑:
正如我所见,奇怪的 requires 来自于在组件文件中要求 React:
var React = require('react');
// or import React from 'react';
class Foo extends React.Component {
static propTypes = {...};
static defaultProps = {...};
render() {...}
}
export default Foo;
如果我删除 var React = require('react');,那些 requires (emptyFunction, camelize) 就会消失,显然错误是 React is not defined。
编辑2:
正如@JMM 建议的那样,我应该在dist 文件夹中拥有依赖项(在我的情况下为React),但我应该如何实现呢?如果我的组件有更多的依赖项怎么办?我以为我只需要在package.json 中定义依赖项。
编辑3:
我终于意识到我不需要browserify,只需要gulp-babel:
var gulp = require('gulp');
var babel = require('gulp-babel');
gulp.task('bundle', bundle);
function bundle () {
gulp.src('./src/*.js')
.pipe(babel())
.pipe(gulp.dest('./dist'));
}
gulp.task('build', ['bundle']);
仅此而已。完整示例在这里:react-svg-components。
【问题讨论】:
-
你有什么问题?
-
@JMM 当我尝试使用 react 应用程序中的组件时,gulp 会抛出错误
Error: Cannot find module ' ./emptyFunction'。 -
错误是在编译时还是在运行时?你得到一个文件
dist/bundle.js,对吧?所有依赖项都应该在该包中。因此,您突出显示的require()调用应解析为捆绑包中的某些内容。 -
@JMM 在运行时。是的,我得到一个文件
dist/bundle.js。好的,所以如果所有依赖项都应该在那个包中,如何处理呢?我只需要 React 作为依赖项。 -
好的,所以这不是 gulp 抛出错误。我不知道 - 从示例中不清楚您为什么会收到该错误。
标签: reactjs gulp browserify babeljs