gulp api 中的 watch() 方法利用文件系統(tǒng)的監(jiān)控程序(file system watcher)將 globs 與 任務(wù)(task) 進(jìn)行關(guān)聯(lián)。它對(duì)匹配 glob 的文件進(jìn)行監(jiān)控,如果有文件被修改了就執(zhí)行關(guān)聯(lián)的任務(wù)(task)。如果被執(zhí)行的任務(wù)(task)沒有觸發(fā) 異步完成 信號(hào),它將永遠(yuǎn)不會(huì)再次運(yùn)行了。
此 API 的默認(rèn)設(shè)置是基于通常的使用場景的,而且提供了內(nèi)置的延遲和排隊(duì)機(jī)制。
const { watch, series } = require('gulp');
function clean(cb) {
// body omitted
cb();
}
function javascript(cb) {
// body omitted
cb();
}
function css(cb) {
// body omitted
cb();
}
// 可以只關(guān)聯(lián)一個(gè)任務(wù)
watch('src/*.css', css);
// 或者關(guān)聯(lián)一個(gè)任務(wù)組合
watch('src/*.js', series(clean, javascript));
就像注冊到任務(wù)系統(tǒng)中的任務(wù)(task)一樣,與文件監(jiān)控程序關(guān)聯(lián)的任務(wù)(task)不能是同步任務(wù)(synchronous taks)。如果你將同步任務(wù)(task)關(guān)聯(lián)到監(jiān)控程序,則無法確定任務(wù)(task)的完成情況,任務(wù)(task)將不會(huì)再次運(yùn)行(假定當(dāng)前正在運(yùn)行)。
由于文件監(jiān)控程序會(huì)讓你的 Node 進(jìn)程保持持續(xù)運(yùn)行,因此不會(huì)有錯(cuò)誤或警告產(chǎn)生。由于進(jìn)程沒有退出,因此無法確定任務(wù)(task)是否已經(jīng)完成還是運(yùn)行了很久很久了。
默認(rèn)情況下,只要?jiǎng)?chuàng)建、更改或刪除文件,文件監(jiān)控程序就會(huì)執(zhí)行關(guān)聯(lián)的任務(wù)(task)。 如果你需要使用不同的事件,你可以在調(diào)用 watch() 方法時(shí)通過 events 參數(shù)進(jìn)行指定。可用的事件有 'add'、'addDir'、'change'、'unlink'、'unlinkDir'、'ready'、'error'。此外,還有一個(gè) 'all' 事件,它表示除 'ready' 和 'error' 之外的所有事件。
const { watch } = require('gulp');
// 所有事件都將被監(jiān)控
watch('src/*.js', { events: 'all' }, function(cb) {
// body omitted
cb();
});
調(diào)用 watch() 之后,關(guān)聯(lián)的任務(wù)(task)是不會(huì)被立即執(zhí)行的,而是要等到第一次文件修之后才執(zhí)行。
如需在第一次文件修改之前執(zhí)行,也就是調(diào)用 watch() 之后立即執(zhí)行,請(qǐng)將 ignoreInitial 參數(shù)設(shè)置為 false。
const { watch } = require('gulp');
// 關(guān)聯(lián)的任務(wù)(task)將在啟動(dòng)時(shí)執(zhí)行
watch('src/*.js', { ignoreInitial: false }, function(cb) {
// body omitted
cb();
});
watch() 方法能夠保證當(dāng)前執(zhí)行的任務(wù)(task)不會(huì)再次并發(fā)執(zhí)行。當(dāng)文件監(jiān)控程序關(guān)聯(lián)的任務(wù)(task)正在運(yùn)行時(shí)又有文件被修改了,那么所關(guān)聯(lián)任務(wù)的這次新的執(zhí)行將被放到執(zhí)行隊(duì)列中等待,直到上一次關(guān)聯(lián)任務(wù)執(zhí)行完之后才能運(yùn)行。每一次文件修改只產(chǎn)生一次關(guān)聯(lián)任務(wù)的執(zhí)行并放入隊(duì)列中。
如需禁止隊(duì)列,請(qǐng)將 queue 參數(shù)設(shè)置為 false。
const { watch } = require('gulp');
// 每次文件修改之后關(guān)聯(lián)任務(wù)都將執(zhí)行(有可能并發(fā)執(zhí)行)
watch('src/*.js', { queue: false }, function(cb) {
// body omitted
cb();
});
文件更改之后,只有經(jīng)過 200 毫秒的延遲之后,文件監(jiān)控程序所關(guān)聯(lián)的任務(wù)(task)才會(huì)被執(zhí)行。這是為了避免在同使更改許多文件時(shí)(例如查找和替換操作)過早啟動(dòng)任務(wù)(taks)的執(zhí)行。
如需調(diào)整延遲時(shí)間,請(qǐng)為 delay 參數(shù)設(shè)置一個(gè)正整數(shù)。
const { watch } = require('gulp');
// 文件第一次修改之后要等待 500 毫秒才執(zhí)行關(guān)聯(lián)的任務(wù)
watch('src/*.js', { delay: 500 }, function(cb) {
// body omitted
cb();
});
你可能不會(huì)使用到此功能,但是如果你需要對(duì)被修改的文件進(jìn)行完全的掌控 (例如訪問文件路徑或元數(shù)據(jù))請(qǐng)使用從 watch() 返回的 chokidar 實(shí)例。
注意: 返回的 chokidar 實(shí)例沒有隊(duì)列、延遲和異步完成(async completion)這些功能。
Gulp 有一個(gè)名為 fsevents 的可選依賴項(xiàng),他是一個(gè)特定于 Mac 系統(tǒng)的文件監(jiān)控程序。如果你看到安裝 fsevents 時(shí)出現(xiàn)的警告信息 - "npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents" - 這并不是什么問題,忽略即可。 如果跳過 fsevents 的安裝,將使用一個(gè)備用文件監(jiān)控程序,后續(xù)在 gulpfile 中產(chǎn)生的任何錯(cuò)誤都將與此警告無關(guān)。
更多建議: