Наблюдение за файлами#

watch() API соединяет глобсы с задачами с помощью наблюдателя файловой системы. Он отслеживает изменения в файлах, которые соответствуют глобам, и выполняет задачу, когда происходит изменение. Если задача не сигнализирует о Async Completion, она никогда не будет запущена во второй раз.

Этот API обеспечивает встроенную задержку и постановку в очередь на основе наиболее часто используемых значений по умолчанию.

const { watch, series } = require('gulp');
function clean(cb) {
// тело опущено
cb();
}
function javascript(cb) {
// тело опущено
cb();
}
function css(cb) {
// тело опущено
cb();
}
exports.default = function() {
// Вы можете использовать одну задачу
watch('src/*.css', css);
// Или составную задача
watch('src/*.js', series(clean, javascript));
};

Предупреждение: избегайте синхронности#

Задача наблюдателя не может быть синхронной, как задачи, зарегистрированные в системе задач. Если вы передадите задачу синхронизации, завершение не может быть определено, и задача больше не будет запущена - предполагается, что она все еще выполняется.

Сообщение об ошибке или предупреждении отсутствует, поскольку средство отслеживания файлов поддерживает работу вашего процесса Node. Поскольку процесс не завершается, невозможно определить, выполнена ли задача или выполняется очень-очень много времени.

Наблюдаемые события#

По умолчанию наблюдатель выполняет задачи всякий раз, когда файл создается, изменяется или удаляется. Если вам нужно использовать разные события, вы можете использовать опцию events при вызове watch(). Доступные события: 'add', 'addDir', 'change', 'unlink', 'unlinkDir', 'ready', 'error'. Дополнительно доступно 'all', которое представляет все события, кроме 'ready' и 'error'.

const { watch } = require('gulp');
exports.default = function() {
// Наблюдение за всеми событиями
watch('src/*.js', { events: 'all' }, function(cb) {
// тело опущено
cb();
});
};

Первоначальное выполнение#

После вызова watch(), задачи не будут выполняться, вместо этого они будут ждать первого изменения файла.

Чтобы выполнять задачи до первого изменения файла, установите для параметра ignoreInitial значение false.

const { watch } = require('gulp');
exports.default = function() {
// Задача будет выполнена при запуске
watch('src/*.js', { ignoreInitial: false }, function(cb) {
// тело опущено
cb();
});
};

Очередь#

Каждый watch() гарантирует, что его текущая задача не будет выполняться снова одновременно. Когда изменение файла выполняется во время выполнения задачи-наблюдателя, другое выполнение будет помещено в очередь для выполнения, когда задача завершится. Только один запуск может быть поставлен в очередь за раз.

Чтобы отключить постановку в очередь, установите для параметра queue значение false.

const { watch } = require('gulp');
exports.default = function() {
// Задача будет запускаться (одновременно) для каждого внесенного изменения
watch('src/*.js', { queue: false }, function(cb) {
// тело опущено
cb();
});
};

Задержка#

При изменении файла задача-наблюдатель не запускается, пока не истечет задержка в 200 мс. Это сделано для того, чтобы не начинать задачу слишком рано, когда одновременно изменяется много файлов - например, поиск и замена.

Чтобы настроить длительность задержки, установите для параметра delay положительное целое число.

const { watch } = require('gulp');
exports.default = function() {
// Задача не будет запущена, пока не пройдет 500 мс с момента первого изменения
watch('src/*.js', { delay: 500 }, function(cb) {
// тело опущено
cb();
});
};

Использование экземпляра наблюдателя#

Скорее всего, вы не будете использовать эту функцию, но если вам нужен полный контроль над измененными файлами - например, доступ к путям или метаданным - используйте экземпляр chokidar, возвращенный из watch().

Будьте осторожны: Возвращенный экземпляр chokidar не имеет функций очереди, задержки или асинхронного завершения.

Необязательная зависимость#

У Gulp есть необязательная зависимость, называемая fsevents, которая является наблюдателем файлов для Mac. Если вы видите предупреждение об установке для - "npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents" - это не проблема. Если установка fsevents пропущена, будет использоваться резервный наблюдатель, и любые ошибки, возникающие в вашем gulpfile, не связаны с этим предупреждением.