假设我有一些相对通用的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?
答案 0 :(得分:1)
您遇到的问题是传递callback
而不是调用它。如果callback
未定义,则您需要做的就是返回一个流。
以下应该可以解决问题:
gulp.task('js', function () { return bundle(); });
应该这样:
gulp.task('js', function (cb) { bundle().on('end', cb); });
你返回或调用回调,不要混淆两者。
我可能在这里错了,但我认为一般建议是返回。
答案 1 :(得分:0)
我不知道底层的问题是什么,但删除管道中的驱魔线可以解决我的问题。