如何让browserify的“捆绑”功能发出结束事件?

时间:2016-01-12 20:02:31

标签: javascript node.js gulp browserify browser-sync

假设我有一些相对通用的browserify脚手架,旨在与gulp一起使用:

var browserSync = require('browser-sync').create();
var browserify  = require('browserify');
var gutil = require('gulp-util');
var exorcist = require('exorcist');

var bundler = browserify('app.jsx', {
  debug: false,
  extensions: ['.jsx'],
  cache: {},
  packageCache: {}
});

function bundle() {
  return bundler.bundle()
    .on('error', function(err) {
        gutil.log(err.message);
        browserSync.notify('Browserify error!');
        this.emit('end');
    })
    .pipe(source('app.js'))
    .pipe(transform(function () {
      return exorcist('public/js/app.js.map');
    }))
    .pipe(gulp.dest('public/js'))
    .pipe(browserSync.stream({ once: true }))
}

我的问题是gulp 4需要明确通知完成任务,bundle()如上所述:

gulp.task('js', function(callback) {
  return bundle();
})

Gulp 4输出:

  

[timestamp] The following tasks did not complete: js

     

[timestamp] Did you forget to signal async completion?

但是,bundle()不会自行发出'end'事件,因此下面会出现同样的错误:

gulp.task('js', function(callback) {
  bundle().on('end', callback);
});

如何让这个函数在上一次.pipe()调用后发出'结束'事件,或者让gulp 4认识到任务已完成according to the API docs

2 个答案:

答案 0 :(得分:1)

您遇到的问题是传递callback而不是调用它。如果callback未定义,则您需要做的就是返回一个流。

以下应该可以解决问题:

gulp.task('js', function () { return bundle(); });

应该这样:

gulp.task('js', function (cb) { bundle().on('end', cb); });

返回调用回调,不要混淆两者。

我可能在这里错了,但我认为一般建议是返回。

答案 1 :(得分:0)

我不知道底层的问题是什么,但删除管道中的驱魔线可以解决我的问题。