如何让 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。
假设我有一些相对通用的 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。