前言
gulp-changed插件的作用,是用來過濾未被修改過的文件,只有修改后的文件才能通過管道。這樣做的好處時,只處理修改后的文件,減少后續程序的執行時間。
根據官方給出的例子:
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文件夾中,然后繼續進行后續的操作。在這之前,我寫的代碼是這樣子的,沒有傳入參數,也沒有輸出到某文件夾中(gulp.dest(DEST) ):
gulp.task('default', () => { return gulp.src('src/*.js')  .pipe(changed())  .pipe( /* 其他操作 */ );});然后發現,每次執行時,所有的文件都會通過管道,根本沒有過濾的作用。看了源代碼之后才知道,傳遞參數和文件輸出是必須的,因為程序里是拿兩個文件夾SRC和DEST里的文件進行對比的。
每當檢測一個程序時,都會去DEST里的文件夾里尋找這個對應的文件,若DEST最后修改時間發生變化或內容已更新,則表明這是一個新文件,通過管道,否則保留。程序里目前使用的是兩個文件最后修改時間的對比,若SRC里的文件的最后修改時間比DEST里文件的最后修改時間要大,說明該文件被修改過。
當然,gulp-changed還提供了一種比較函數:內容的對比。將源文件和目標文件的內容進行sha1加密后,比較兩者的加密串,若不相同,則通過管道。
可通過傳遞參數修改比對函數:
gulp.task('default', () => { return gulp.src(SRC)  .pipe(changed(DEST, {hasChanged: changed.compareSha1Digest}))  .pipe(gulp.dest(DEST))  .pipe( /* 其他操作 */ );});當然,你可以傳遞自己定義的函數,但是需支持以下4個參數:
源碼講解
這個方法里,是對兩個文件最后修改時間的對比
function compareLastModifiedTime(stream, cb, sourceFile, targetPath) { // 獲取目標文件的狀態 fs.stat(targetPath, function (err, targetStat) { // 若源文件存在 if (!fsOperationFailed(stream, sourceFile, err)) { // 對比兩者的最后修改時間 if (sourceFile.stat.mtime > targetStat.mtime) { stream.push(sourceFile); } } cb(); });}這里有個疑問的地方:
mtime, atime, ctime
上面中的mtime表示修改時間,此外,文件還幾個跟時間有關的屬性,這里也稍微的講解一下。
ATIME-ACCESS TIME
該字段表示文件中的數據最后一次被訪問的時間 主站蜘蛛池模板: 巨野县| 望城县| 沭阳县| 石屏县| 彰武县| 松桃| 团风县| 鄂托克旗| 扶风县| 综艺| 炎陵县| 浠水县| 明水县| 香港| 朔州市| 泸州市| 霞浦县| 岚皋县| 永城市| 巫山县| 安义县| 新绛县| 永川市| 德江县| 墨玉县| 河东区| 温州市| 同仁县| 清水河县| 迁西县| 冀州市| 哈巴河县| 五原县| 乌鲁木齐市| 永城市| 类乌齐县| 淅川县| 错那县| 曲麻莱县| 庐江县| 龙江县|