如何让 browserify 的 "bundle" 函数发出结束事件?

How can I get browserify's "bundle" function to emit an end event?

假设我有一些相对通用的 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() 调用后发出 'end' 事件,或者得到 gulp 4 以识别任务已完成 according to the API docs

我不知道潜在的问题是什么,但是移除管道中的驱魔线可以解决我的问题。

您面临的问题是传递 callback 而不是调用它。如果 callback 未定义,您需要做的就是 return 一个流。

以下应该可以解决问题:

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

应该这样:

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

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

我在这里可能是错的,但我 认为 一般建议是 return。