我正在将Grunt构建任务转换为Gulp实现。我正在使用gulp-watch
,这就是我为编写任务而编造的内容:
gulp.task('task', function(){
return watch('glob/**/*', function(){
var stream = doTask();
return stream;
})
});
问题是,如果更改了许多文件,则任务运行次数过多。我需要找到一种去除输入的方法,并取消在新的更改进入时已经启动的任何任务。
如何取消Node.JS / Gulp流?我还没有找到关于此的好文档。我目前正在尝试.end()
,但我无法保证Gulp任务(SASS,Autoprefixer和CleanCSS)会尊重这一点。
答案 0 :(得分:1)
似乎gulp watch debounce和interval选项只处理特定文件,即如果同一文件被更改,则防止重复调用。我找到的解决方案是使用和外部lodash debounce:
watch(GLOB_expression, _.decounce(handler, delay));
或具体而言,在您的情况下:
gulp.task('task', function(){
return watch('glob/**/*', _.debounce(function(){
var stream = doTask();
return stream;
}, 1000));
});
默认情况下,lodash decounce设置为在后沿触发,这意味着只要事件继续进入,它就会等待,并且只有在指定时间段内没有事件之后(示例中为1000 ms)上面),将调用处理程序。
一些注意事项:
答案 1 :(得分:0)
我最终做的是制作一个小类来缓冲流
https://gist.github.com/bryanerayner/cc2bb9b4da243d94f0f8
gulp文件:
function setupQuickSassJob(sourceGlob, watchGlob) {
function job() {
function taskFactory() {
return jobs.processSassStyles(
gulp.src([].concat(sourceGlob), { base: '.' }),
'.');
}
gUtil.log('Listening for changes');
var queue = new StreamQueue();
var watchtask = watch([].concat(watchGlob), function (file) {
gUtil.log('Changed: ' + file.path);
return queue.queueTask(taskFactory);
});
return watchtask;
}
return job;
}
gulp.task('desktopSASS', setupQuickSassJob([
'Globs',
],
[
'Globs'
]
));
我对此并不完全满意,但它确实有效。如果有人有更合适的节点方式,那么我全都是耳朵。