0

我正在将 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)会尊重这一点。

4

2 回答 2

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 毫秒)没有事件之后,处理程序将被调用。

几点注意事项:

  1. 列表项确保你 npm install 并且需要 lodash。
  2. 在';'中结束您的退货声明 :-)
  3. 选择一个适当的延迟,这样您的处理程序将进入“饥饿”状态,即永远不会因为正在进行的事件而触发,或者包括maxWait选项以确保它在合理的时间(例如 3000 毫秒)后触发,而不管传入的事件如何。
于 2015-10-16T19:41:02.023 回答
0

我最终做的是制作一个小类来缓冲流

https://gist.github.com/bryanerayner/cc2bb9b4da243d94f0f8

吞咽文件:

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'
    ]
));

我对此并不完全满意,但它确实有效。如果有人有更合适的 Node 方式来做到这一点,我会全力以赴。

于 2015-10-16T20:17:28.637 回答