簡單談?wù)刧ulp-changed插件
前言
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ù):
- stream 文件通過對比后將sourceFile添加到隊列中
- callback 函數(shù)里的代碼執(zhí)行完畢后的回調(diào)函數(shù)
- sourceFile vinyl 文件對象
- destPath 與sourceFile文件對比的目標文件路徑
源碼講解
這個方法里,是對兩個文件最后修改時間的對比
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(); }); }
這里有個疑問的地方:
- 若目標文件不存在,則當前情況是無法進行比較的,只能在運行一次之后,產(chǎn)生了目標文件;再修改源文件才能進行對比;新添加的文件同理
mtime, atime, ctime
上面中的mtime表示修改時間,此外,文件還幾個跟時間有關(guān)的屬性,這里也稍微的講解一下。
ATIME-ACCESS TIME
該字段表示文件中的數(shù)據(jù)最后一次被訪問的時間–通過unix進行直接讀取或通過命令行和腳本讀取。
CTIME-CHANGE TIME
當您更改文件的所有權(quán)或訪問權(quán)限時,ctime也隨之變化。當然,內(nèi)容更新時,ctime也會發(fā)生改變。
MTIME-MODIFY TIME
最后修改時間顯示上次更改文件內(nèi)容的時間。它不與文件權(quán)限的變化而變化,并因此用于跟蹤文件內(nèi)容的實際變化。
通過LS顯示這三種時間
最簡單的確認這些時間的方式是使用ls命令,我現(xiàn)在用的是windows系統(tǒng),安裝了一個ConEmu。
使用ls -l顯示的時間就是當前文件最后一次修改的時間,即mtime:
-rw-r--r-- 1 root 1049089 2676 一月 20 03:06 gulpfile.js
使用ls -lu顯示的是文件最后一次被訪問的時間,即atime:
-rw-r--r-- 1 root 1049089 2676 十一 24 09:18 gulpfile.js
使用ls -lc顯示的是文件最后一次權(quán)限被修改的時間,即ctime:
-rw-r--r-- 1 root 1049089 2676 一月 20 03:06 gulpfile.js
通過STAT顯示這三種時間
使用stat命令可以顯示這個文件更加詳細的信息:
$ stat gulpfile.js File: ‘gulpfile.js' Size: 2676 Blocks: 4 IO Block: 65536 regular file Device: d6be5777h/3602798455d Inode: 844424930178810 Links: 1 Access: (0644/-rw-r--r--) Uid: (1435492/root) Gid: (1049089/ UNKNOWN) Access: 2015-11-24 09:18:34.008292400 +0000 Modify: 2016-01-20 03:06:34.035859700 +0000 Change: 2016-01-20 07:04:40.432046400 +0000 Birth: 2015-11-24 09:18:33.965292400 +0000
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
跟我學(xué)習(xí)javascript創(chuàng)建對象(類)的8種方法
跟我學(xué)習(xí)javascript創(chuàng)建對象(類)的8種方法,每一種方法都有詳細的介紹,不知道javascript如何創(chuàng)建對象的朋友,不要錯過這篇文章。2015-11-11Layui數(shù)據(jù)表格跳轉(zhuǎn)到指定頁的實現(xiàn)方法
今天小編就為大家分享一篇Layui數(shù)據(jù)表格跳轉(zhuǎn)到指定頁的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09通過js獲取上傳的圖片信息(臨時保存路徑,名稱,大?。┤缓笸ㄟ^ajax傳遞給后端的方法
最近有朋友向我請教,使用js獲取上傳圖片的信息然后通過ajax傳遞給后端,怎么實現(xiàn)呢?通過上網(wǎng)搜索大量資料,下面小編把我的解決辦法整理,分享給大家,需要的朋友可以參考下2015-10-10