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