我试图为watchify
编写一个gulp插件,允许我将文件传输到其中。问题是我的任务实际上从未完成"因为它位于那里并监视一堆文件并在必要时重新构建。
那么如何发送代码"通过"这个插件?
现在,我调用插件的任务简化为:
gulp.src( '/path/to/js/*.js' )
.pipe( watchifyPlugin() )
.pipe( cfg.gulp.dest( '/path/to/build' ) )
我的watchifyPlugin
是:
module.exports = function( opts ){
return through.obj( function( file, enc, cb ){
// watchify file
self.push( data ); // whenever any .js files are updated
// never call cb()
}
}
现在这适用于我的glob找到的第一个.js
文件。但是,任何其他文件实际上都没有进入我的插件,而且我假设它是因为我从不打电话给cb()
。
那我该怎么做?有没有办法继续写入流而不调用cb()
,关闭它,但仍然允许以前的管道继续?
:
watchify()
dest()
就好了,即使我一次又一次地拨打self.push()
cb()
从未调用watchify()
在cb()
呼叫index.js
之前从未致电,但此"关闭" index.js
管道答案 0 :(得分:0)
您正在以错误的方式使用,当您完成文件('data'事件)时,必须调用回调。但是,关闭流不是cb()
,即使这样做也会发出end
。
您可以延迟结束事件并继续致电this.push
发送新文件。
像
这样的东西var Through = require('through2').obj;
var my_plugin = function() {
var last_file = null; // as an example, last emitted file
function handle_data = function(file, enc, done) {
this.push(file); // emit the file
this.push(file); // just for kicks, emit it again
last_file = file;
done(); // done handling *this* file
}
function handle_end = function(done) {
if(last_file) this.push(last_file); // emit the last file again
done(); // handled the 'end' event
}
return Through(handle_data, handle_end);
}
这将在处理下一个文件之前两次发出每个文件,然后当它完成所有文件(收到end
事件)时,它会再次发出最后一个文件,然后发出end
事件
但是你为什么不使用gulp.watch
而只是在某些事情发生变化时再次运行任务?甚至使用gulp-watch插件,当它们发生变化时会发出文件?
答案 1 :(得分:0)
这是一个非常糟糕的主意。并不是gulp中的所有东西都需要成为插件,特别是,browerify和watchify插件一直被禁止。 (请参阅https://github.com/gulpjs/plugins/blob/master/src/blackList.json。)如果您想运行watchify,只需直接使用watchify即可。来自https://github.com/gulpjs/gulp/blob/master/docs/recipes/fast-browserify-builds-with-watchify.md:
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var watchify = require('watchify');
gulp.task('watch', function() {
var bundler = watchify('./src/index.js');
// Optionally, you can apply transforms
// and other configuration options on the
// bundler just as you would with browserify
bundler.transform('brfs');
bundler.on('update', rebundle);
function rebundle () {
return bundler.bundle()
.pipe(source('bundle.js'))
.pipe(gulp.dest('./dist'))
}
return rebundle();
});