我又重新認識了Gulp

2021-09-17 18:49:01 字數 3584 閱讀 6416

之前我寫過一篇 gulp入門筆記

其實那是對這個工具的第一次認知, 讓我知道了這個工具可以用來幹嘛.

但是隨著使用它的時間變長了, 我發現, 僅僅使用npm上所提供的gulp外掛程式, 遠遠不能滿足我日常的需求.

過了一段時間以後, 已經能夠大致理解這個字的含義了.

先看一段**

gulp.task("copyfiles",function());
這段**的作用是將/src資料夾下的檔案不經任何處理拷貝到/dist資料夾下

如果要對這些檔案進行操作,比如說 壓縮,就在中間加多乙個外掛程式

var minify = require("gulp-***x"); //這是我假想的

var minify2 = require("gulp-ssss"); //這是我假想的

gulp.task("copyfiles",function());

也就是說,你只需要告訴 gulp:

這個過程比較像生產零件一樣一步又一步,最終裝倉庫.

相關基礎不夠紮實的我總覺得,上面這段**為什麼不是像這樣的:

//--------這是乙個錯誤的示範!

var minify = require("gulp-***x");

var minify2 = require("gulp-ssss");

gulp.task("copyfiles",function());

其實就是少了中間的pipe()函式. 為什麼非得要這個東西呢?

假設一家咖啡店的咖啡沖泡是以 流水線的形式 生產的....(奇葩

你會發現,上圖中有乙個傳送帶,也就是說,a員工處理完之後,把它放到傳送帶上,b員工自己在傳送帶上拿到a員工處理完的咖啡豆,b員工再處理,再放回傳送帶上...以此類推直至顧客從傳送帶上拿到泡好的咖啡

也就是說,如果沒有這個傳送帶..a員工處理完咖啡豆後,他不會自己拿給b員工..b員工也不會自己去a員工那裡要加了咖啡豆的杯子

然而在 gulp 中,pipe()傳送的東西是什麼樣的呢?

我們可以通過監聽data事件來檢視所謂的 "流" 當中,到底流的是什麼.

gulp.task('streamtest',function());

});

執行上面這個 task 會在命令列輸出乙個這樣的東西:

,

"_contents":

}

這是乙個虛擬檔案物件(vinyl), 上面這個東西就是在pipe()中流動的東西!

它記載了需要處理的檔案路徑,工作目錄,檔案狀態,還有檔案內容等等的資訊.

(嗯..就是記載了你從**拿的杯子..用了什麼咖啡豆..還有目前那個杯子裡面裝了什麼東西)

vinyl專案位址:

仔細觀察一下_contents下面的data,

我說test.txt的內容就是 "hello gulp!",你數一數字元數就會發現和data中的數字一樣多.

那其實,_contents下面的data就是這個檔案的源資料(buffer)

gulp 中預設的資料型別都是 buffer ,也記載在了_contents下面的type裡面

一般我們只關心 杯子裡的咖啡 已經變成什麼樣了.

但是現在是buffer型別的資料,看不懂,怎麼辦?

我們可以利用以下的語句來實現 源資料(buffer)轉為字串(string),或者反過來.

string = buffer.tostring("utf-8"); //使用utf-8編碼來將buffer變為string

buffer = new buffer(string); //將string轉化為buffer

嘗試輸出到控制台吧:

gulp.task('streamtest',function());

});

現在大部分的外掛程式都依賴於 through2

有了這個東西,做很多事情都會很方便,而且不需要再去苦苦地找外掛程式啦!自己就能完成!

我們現在要做的事情就是利用它模擬這個圖!

嗯..就隨便弄乙個 coffee.txt ,把它裡面的內容變一下再輸出到原來的地方!

我們建立乙個專案,在src的目錄下放乙個 coffee.txt, 內容為 "glass"

如下:

var through = require("through2");

gulp.task('makecoffee',function());

//加咖啡豆

function addcoffeebean());

}//加咖啡豆

function addwater());

}//加奶

function addmilk());

}

在命令列輸入gulp makecoffee就會發現我們原來那乙份文字已經變了:

通過上面的觀察,我們會發現我們自己寫的函式返回了乙個through.obj()

它幫助我們返回vinyl物件, 只不過這個函式為我們提供了很多功能

它的三個引數分別是

上面的例子中有一句話

this.push(file);
不新增這句話的話,他不會把你處理好的東西再放回我所說的傳送帶上.所以你可以利用一些條件判斷,來決定乙個檔案到底要不要繼續放到傳送帶上.

(不是咖啡?!倒掉倒掉)

每當你對這個檔案操作完成之後,必須執行cb()來告訴系統你做完了!

上面兩個小語句還可以改寫成這樣:

this.push(file);

cb();

// 改寫成這樣-->

cb(null,file); //其中第乙個引數是用來丟擲錯誤的

吶,來自我的部落格原文

重新認識container

我還清楚的記得,第一次從 那兒聽說container這個詞 結果他給我解釋了半天還是似懂非懂的。今天,偷閒翻了下posa4,發現裡面對container的解釋特別清楚。粗略的理解下來是,為了分離關注點,而實現的對系統資源的封裝。豁然開朗的發現,os就是應用程式的container。突發奇想的,開發乙...

重新認識測試

以前總覺得測試是軟體開發的邊緣職位,開發人員才是軟體生命週期的核心人員。隨著對網際網路公司的了解,逐步了解到測試的重要性。以bat為例,三家公司均設定了測試開發工程師崗位,該崗位的主要職責就是編寫自動化測試案例,通過對 的邏輯進行分析,設計出能夠覆蓋大部分 的測試用例。如阿里的測試開發工程師的崗位描...

重新認識ARC

雖然用了很久的arc,感受了 簡潔。但是對arc底層實現並不了解。今天抽空研究了下,做些簡單地總結。一 strong 1.區域性變數 對於區域性變數來說,在超出作用域的地方由編譯器自動插入release。大概轉化為 在非arc返回的autorelease型別的方法 在blog手碼大概 如有錯誤還望指...