Как правильно завершить поток Gulp?

Я конвертирую задачу сборки 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) будут уважать это.

2 ответа

Решение

Похоже, что опции gounce watch debounce и interval будут обрабатывать только определенный файл, то есть предотвращать повторные вызовы, если тот же файл был изменен. Решение, которое я нашел для работы, заключается в использовании и отладке внешнего lodash:

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 и требуете lodash.
  2. Завершите свой возврат в ';':-)
  3. Выберите правильную задержку, чтобы ваш обработчик перешел в "голодание", т.е. никогда не запускался из-за происходящих событий или включал опцию maxWait, чтобы убедиться, что она срабатывает через разумное время (скажем, 3000 мс) независимо от входящих событий.

В итоге я создал небольшой класс для буферизации потоков.

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 сделать это, у меня все уши.

Другие вопросы по тегам