前言
gulp-changed插件的作用,是用來過濾未被修改過的文件,只有修改后的文件才能通過管道。這樣做的好處時,只處理修改后的文件,減少后續(xù)程序的執(zhí)行時間。
根據(jù)官方給出的例子:
const SRC = 'src/*.js';const DEST = 'dist';gulp.task('default', () => { return gulp.src(SRC) .pipe(changed(DEST)) .pipe(gulp.dest(DEST)) .pipe( /* 其他操作 */ );});檢測SRC中的文件,然后把從changed()通過的文件輸出到DEST文件夾中,然后繼續(xù)進行后續(xù)的操作。在這之前,我寫的代碼是這樣子的,沒有傳入?yún)?shù),也沒有輸出到某文件夾中(gulp.dest(DEST) ):
gulp.task('default', () => { return gulp.src('src/*.js') .pipe(changed()) .pipe( /* 其他操作 */ );});然后發(fā)現(xiàn),每次執(zhí)行時,所有的文件都會通過管道,根本沒有過濾的作用。看了源代碼之后才知道,傳遞參數(shù)和文件輸出是必須的,因為程序里是拿兩個文件夾SRC和DEST里的文件進行對比的。
每當檢測一個程序時,都會去DEST里的文件夾里尋找這個對應(yīng)的文件,若DEST最后修改時間發(fā)生變化或內(nèi)容已更新,則表明這是一個新文件,通過管道,否則保留。程序里目前使用的是兩個文件最后修改時間的對比,若SRC里的文件的最后修改時間比DEST里文件的最后修改時間要大,說明該文件被修改過。
當然,gulp-changed還提供了一種比較函數(shù):內(nèi)容的對比。將源文件和目標文件的內(nèi)容進行sha1加密后,比較兩者的加密串,若不相同,則通過管道。
可通過傳遞參數(shù)修改比對函數(shù):
gulp.task('default', () => { return gulp.src(SRC) .pipe(changed(DEST, {hasChanged: changed.compareSha1Digest})) .pipe(gulp.dest(DEST)) .pipe( /* 其他操作 */ );});當然,你可以傳遞自己定義的函數(shù),但是需支持以下4個參數(shù):
源碼講解
這個方法里,是對兩個文件最后修改時間的對比
function compareLastModifiedTime(stream, cb, sourceFile, targetPath) { // 獲取目標文件的狀態(tài) fs.stat(targetPath, function (err, targetStat) { // 若源文件存在 if (!fsOperationFailed(stream, sourceFile, err)) { // 對比兩者的最后修改時間 if (sourceFile.stat.mtime > targetStat.mtime) { stream.push(sourceFile); } } cb(); });}這里有個疑問的地方:
新聞熱點
疑難解答
圖片精選