我怎样才能得到browserify的“捆绑”function发出结束事件?

说我有一些相对普通的browserify脚手架打算用于吞咽:

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'事件,或者根据API文档获取.pipe() 4来识别任务完成?

你面临的问题是传递callback ,而不是调用它。 如果callback未定义,则只需返回一个stream。

以下应该做的伎俩:

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

应该如此:

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

您要么返回调用callback ,不要混合两者。

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

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