跳到主要内容

监视文件

watch() API 使用文件系统监视器将 globs 连接到任务。它监视与 globs 匹配的文件变化,并在发生变化时执行任务。如果任务没有发出异步完成信号,它将永远不会被第二次运行。

此 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 进程运行。由于进程不会退出,无法确定任务是否完成或者只是花费了非常非常长的时间来运行。

监视的事件

默认情况下,监视器会在文件被创建、更改或删除时执行任务。 如果你需要使用不同的事件,可以在调用 watch() 时使用 events 选项。可用的事件有 '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();
});
};

使用监视器实例

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

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

可选依赖

Gulp 有一个名为 fsevents 的可选依赖,它是一个 Mac 特定的文件监视器。如果你看到 fsevents 的安装警告 - "npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents" - 这不是问题。 如果跳过 fsevents 安装,将使用备用监视器,而 gulpfile 中出现的任何错误与此警告无关。