监视文件#

watch() API 使用文件系统观察器将glob连接到任务。它监视与 glob 匹配的文件的更改,并在发生更改时执行任务。如果任务未发出异步完成信号,则永远不会再次运行该任务。

此 API 基于最常用的默认值提供内置延迟和排队。

const { watch, series } = require('gulp');
函数 clean(cb) {
// 省略正文
cb();
}
函数 javascript(cb) {
// 省略正文
cb();
}
函数 css(cb) {
// 省略正文
cb();
}
exports.default = 函数() {
// 您可以使用单项任务
watch('src/*.css', css);
// 或一个复合任务
watch('src/*.js', series(clean, javascript));
};

警告:避免同步#

观察者的任务不能是同步的,就像注册到任务系统中的任务一样。如果您传递一个同步任务,则无法确定完成,并且任务将不会再次运行 - 它被认为仍在运行。

没有提供错误或警告消息,因为文件观察器使您的 Node 进程保持运行。由于进程不会退出,因此无法确定任务是否已完成或只是花费了很长时间来运行。

观察的事件#

默认情况下,无论何时创建、更改或删除文件,观察者都会执行任务。如果您需要使用不同的事件,可以在调用 watch() 时使用 events 选项。可用的事件有 'add''addDir''change''unlink''unlinkDir''ready''error'。此外,'all' 也可用,它表示除 'ready''error' 之外的所有事件。

const { watch } = require('gulp');
exports.default = 函数() {
// 所有事件都将被监视
watch('src/*.js', { events: 'all' }, function(cb) {
// 省略正文
cb();
});
};

初始执行#

调用 watch() 时,任务不会被执行,而是等待第一个文件更改。

要在第一个文件更改前执行任务,将 ignoreInitial 选项设置为 false

const { watch } = require('gulp');
exports.default = 函数() {
// 任务将在启动时执行
watch('src/*.js', { ignoreInitial: false }, function(cb) {
// 省略正文
cb();
});
};

排队#

每个 watch() 保证其当前运行的任务不会再次并发执行。当监视器任务正在运行时,如果文件发生更改,另一个执行将排队,以便在任务完成后运行。一次只能排队一个运行。

要禁用排队,将 queue 选项设置为 false

const { watch } = require('gulp');
exports.default = 函数() {
// 任务将(并发地)针对所做的每个更改运行
watch('src/*.js', { queue: false }, function(cb) {
// 省略正文
cb();
});
};

延迟#

在文件更改后,监视器任务在 200 毫秒延迟时间过去之前不会运行。这是为了避免在一次更改很多文件时(例如查找和替换)过早启动任务。

要调整延迟时间,将 delay 选项设置为一个正整数。

const { watch } = require('gulp');
exports.default = 函数() {
// 任务在自首次更改后经过 500 毫秒后才会运行
watch('src/*.js', { delay: 500 }, function(cb) {
// 省略正文
cb();
});
};

使用观察器实例#

你可能不会使用此功能,但如果你需要完全控制已更改的文件(例如访问路径或元数据),请使用从 watch() 返回的 chokidar 实例。

注意:返回的 chokidar 实例没有排队、延迟或异步完成功能。

可选依赖#

Gulp 有一个称为 fsevents 的可选依赖,它是一个 Mac 特定的文件观察器。如果你看到 fsevents 的安装警告 - “npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents” - 这不是问题。如果跳过 fsevents 安装,将使用后备观察器,并且 gulpfile 中发生的任何错误都与此警告无关。