如何自己開發gulp插件?

因為項目需要,如何自己開發gulp插件


在開發gulp插件前,要先了解下gulp插件的結構

gulp插件結構

// 引入插件需要的包
var through = require("through2");

// 定義gulp插件主函數
// prefix_text:調用插件傳入的參數
module.exports = function gulp_prefix(prefix_text){

// 創建stream對象,每個文件都會經過這個stream對象
var stream = through.obj(function(file, encoding, callback){
// 文件經過stream時要執行代碼
});

// 返回stream對象
return stream;
};

gulp插件的主函數需要返回一個stream對象。創建stream對象的方法有很多種,這裡我使用through.obj來創建一個stream對象

調用through.obj時傳入的函數參數最終會覆蓋stream._transform函數,這裡有必要講解下這個函數怎麼使用。

transform._transform(file, encoding, callback)

  • file:stream對象接收到的文件數據,該文件類型有三種:

stream:流數據,可以用file.isStream判斷

buffer:二進位數據,gulp.src讀取文件默認就是這個類型,可以用file.isBuffer判斷

null:為空,表示沒有數據,可以用file.isNull判斷

  • encoding:表示編碼方式,一般不用,可以不管
  • callback(error,data):回調函數,執行完代碼後都要調用這個函數,告訴stream引擎,我們已經處理完了;這裡說下callback(error,data)的使用:

error:錯誤信息;可省略

data:文件數據,可以傳入file參數,或者undefined;可省略。

好了,gulp插件的結構就是這麼簡單,現在介紹編寫一個簡單的插件來加深理解:gulp-prefix。

開始編寫gulp插件

現在我們實現一個能在每個文件開頭加上一段字元串功能的gulp插件,寫插件之前先創建一個package.json

npm init

詢問你name時,可以取名為:gulp-prefix,執行成功後,package.json的內容為:

{
"name": "gulp-prefix",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" exit 1"
},
"author": "",
"license": "ISC"
}

在本地創建一個插件入口文件index.js文件,內容為:

var through = require("through2");

module.exports = function gulp_prefix(prefix){
if(!prefix){
prefix = "";
}
// 引入插件需要的包
var through = require("through2");

// 定義gulp插件主函數
// prefix_text:調用插件傳入的參數
module.exports = function gulp_prefix(prefix_text){

// 創建stream對象,每個文件都會經過這個stream對象
var stream = through.obj(function(file, encoding, callback){
// 文件經過stream時要執行代碼
});

// 返回stream對象
return stream;
};
var prefix = new Buffer(prefix);

var stream = through.obj(function(file, encoding, callback){
// 如果file類型不是buffer 退出不做處理
if(!file.isBuffer()){
return callback();
}

// 將字元串加到文件數據開頭
file.contents = Buffer.concat([prefix, file.contents]);

// 確保文件會傳給下一個插件
this.push(file);

// 告訴stream引擎,已經處理完成
callback();
});

return stream;
};

現在插件的目錄結構為:

.
├── index.js
├── package.json

現在可以使用該插件了,將插件複製到你的gulp項目下node_modules/gulp-prefix目錄中,編寫gulpfile.js

var gulp = require("gulp"),
prefix = require("gulp-prefix");

gulp.task("default", function(){
gulp.src("src/*.js")
.pipe(prefix("prefix data"))
.pipe(gulp.dest("js"));
});

運行

gulp

可以看到所有的js文件內容的前面都加上prefix data字元串

現在插件已經開發好了,接下來介紹下關於如何測試插件的問題。

gulp插件測試

像很多項目需要單元測試一樣,我們在開發gulp插件時,也需要有測試功能,接下來我教大家如何測試剛剛寫的gulp-prefix插件

很多gulp插件使用的測試工具是mocha,首先將package.jsonscripts欄位的test值修改為mocha,修改後package.json為:

{
"name": "gulp-prefix",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "mocha"
},
"author": "",
"license": "ISC"
}

這樣當我們執行npm test,就能運行mocha測試工具。現在在本地創建一個測試腳本test.js:

var assert = require("assert");
var File = require("vinyl");
var prefix = require("./");

describe("gulp-prefix", function() {
it("prefix test", function(done) {

// 創建一個文件
var file = new File({
contents: new Buffer("file data")
});

// 創建一個 prefix流
var stream = prefix("prefix ");

// 將文件寫入prefix流中
stream.write(file);

// 等文件重新出來a
stream.once("data", function(file) {
// 檢查內容是否一致
assert.equal(file.contents.toString("utf8"), "prefix file data");
done();
});

});
});

安裝測試需要的包

npm install assert mocha through2 vinyl --save-dev

運行測試

[root@localhost gulp-prefix]# npm test
&> gulp-prefix@1.0.0 test /root/gulp-prefix
&> mocha
gulp-prefix
? prefix test
1 passing (18ms)

更多內容:https://www.beibq.cn/book/eddl866


推薦閱讀:

編譯同樣的scss,為什麼gulp的速度幾乎是grunt的兩倍?
有沒有好的gulp+webpack的例子啊?求指教,分開來都是會用的,但是結合起來就有些懵。。
在前端打包時,加入了source map之後文件變大如何處理?
gulp或者grunt中有哪些神一般的task?

TAG:前端開發 | 前端入門 | 前端開發工具 | gulp |