如何使用'gulp-babel'和'gulp-browserify'

时间:2015-11-25 18:12:00

标签: javascript gulp browserify babeljs

我尝试编写这些代码

 gulp.task('script', function() {
  'use strict'
  return gulp.src(['app.js', 'components/**/*.jsx'])
    .pipe(babel())
    .pipe(browserify())
    .pipe(gulp.dest("dist"));
});

但它显示了一些错误:

SyntaxError: 
/Users/Zizy/Programming/learn-react-js/components/CommentBox.jsx:58
    <div className="commentBox">
    ^
ParseError: Unexpected token
    at wrapWithPluginError (/Users/Zizy/Programming/learn-react-js/node_modules/gulp-browserify/index.js:44:10)

似乎在.pipe(browserify())之前gulp没有改变jsx代码。但是如果我只是删除.pipe(browserify())我发现它确实发生了转变,就不能让babel和browserify一起工作。

我知道也许我可以像babelifybrowserify plugin for babel一样使用,我只想找出原因。

3 个答案:

答案 0 :(得分:18)

gulp-browserify并不像那样工作。你不会给它收集一堆缓冲区来收集和捆绑。

你给它一个文件 - 它传入Browserify的条目文件。 Browserify检查以查看条目文件引用的其他文件,然后直接从文件系统加载这些文件,这意味着您无法事先使用gulp插件修改它们。

所以,实际上,如果我们假装您不想在源文件上使用Babel,那么您的gulpfile应该如下所示,只传入条目文件:

 gulp.task('script', function() {
  'use strict'
  return gulp.src('app.js')
    .pipe(browserify())
    .pipe(gulp.dest("dist"));
});

但请注意,不再维护gulp-browserify,这正是原因所在。 gulp插件不应该直接从文件系统中读取。这就是为什么你应该直接使用Browserify(或者,在你的情况下,Babelify)使用vinyl-source-stream as recommended in the gulp recipes。它更具惯用性,也不那么令人困惑。

这包含了我对你的问题的回答,但是我想补充一点:如果您使用ES2015模块语法(并且您可能应该这样做),那么还有更好的方法这个。 Browserify将所有模块分别包装在一堆代码中,以使编程的CommonJS API正常工作,但ES2015模块具有声明性语法,这使得工具更容易静态地对它们进行操作。有一个名为Rollup的工具可以利用这一功能,允许它生成比Browserify更小,更快,更简洁的包。

以下是如何使用gulp:

var gulp = require('gulp'),
    rollup = require('rollup-stream'),
    babel = require('gulp-babel'),
    source = require('vinyl-source-stream'),
    buffer = require('vinyl-buffer');

gulp.task('script', function() {
  return rollup({entry: 'app.js'})
    .pipe(source('app.js'))
    .pipe(buffer())
    .pipe(babel())
    .pipe(gulp.dest('dist'));
});

答案 1 :(得分:0)

从Babel 6开始,您需要手动声明预设,请检查this

基本上,在项目的根目录中,您需要.babelrc,其中包含以下内容:

{
  "presets": [ "es2015", "react" ]
}

package.json中相应的npm模块:

// package.json

{
  "devDependencies": {
    ...
    "babel-preset-es2015": "^6.1.18",
    "babel-preset-react": "^6.1.18",
    ...
  }
}

答案 2 :(得分:0)

这是一个sample repository,其中有gulpbabelbrowserify

以下是代码段

gulp.task("js", (done) => {
  const bundler = browserify({ entries: paths.js.source }, { debug: true }).transform(babel);
  bundler.bundle()
    .on("error", function (err) { console.error(err); this.emit("end"); })
    .pipe(source(paths.build.destMinJSFileName))
    .pipe(buffer())
    .pipe(sourcemaps.init({ loadMaps: true }))
    .pipe(uglify())
    .pipe(sourcemaps.write(paths.js.destMapFolder))
    .pipe(gulp.dest(paths.build.destBuildFolder));

  done();
});