自動化構建工具gulp入門(三)

  相信在看過前兩篇文章以後你已經對gulp有了比較深入的瞭解。但是,雖然開發者們已經爲gulp官網貢獻了豐富多樣的gulp插件,但在實際開發中現有的插件也許並不能完美的滿足我們的需求。所有學會自己開發gulp插件也是我們深入掌握gulp使用的必修課程。

  當然,我們知道gulp是基於nodeJs流的自動化工具,這意味着要想獨立開發gulp的插件我們需要有一定的nodejs基礎。如果你之前並不瞭解nodejs,或者你是個服務端小白,對文件操作,buffer等這些概念還很陌生,下面的學習內容理解起來可能會有一定難度。

  gulp插件開發

  我們先來看一段gulp官網示例的插件代碼:


// through2 是一個對 node 的 transform streams 簡單封裝
var through = require('through2');
var gutil = require('gulp-util');
var PluginError = gutil.PluginError;

// 常量
const PLUGIN_NAME = 'gulp-prefixer';

function prefixStream(prefixText) {
  var stream = through();
  stream.write(prefixText);
  return stream;
}

// 插件級別函數 (處理文件)
function gulpPrefixer(prefixText) {

  if (!prefixText) {
    throw new PluginError(PLUGIN_NAME, 'Missing prefix text!');
  }
  prefixText = new Buffer(prefixText); // 預先分配

  // 創建一個讓每個文件通過的 stream 通道
  return through.obj(function(file, enc, cb) {
    if (file.isNull()) {
      // 返回空文件
      cb(null, file);
    }
    if (file.isBuffer()) {
      file.contents = Buffer.concat([prefixText, file.contents]);
    }
    if (file.isStream()) {
      file.contents = file.contents.pipe(prefixStream(prefixText));
    }

    cb(null, file);

  });

};

// 暴露(export)插件主函數
module.exports = gulpPrefixer;

  我們使用commonjs規範引入了through2和gulp-util兩個npm包進行使用。through用於做流處理,gulp-util是gulp官網爲我們提供的gulp開發工具包。gulpPrefixer是我們自定義的中間件函數,它藉助through創建一個讓每個文件通過的stream通道,傳入的內容可以是null、buffer和stream 返回處理過的文件內容。 這個插件的主要功能是支持修改文件內容,在文件內容前添加自定義內容。

  我們可以將以上代碼內容保存爲plugin.js ,它現在已經是一個獨立的插件了,我們可以在我們的gulpfile.js中將它引入並使用。

let prefixer = require("./plugin");

gulp.task("prefixer",()=>{
    return gulp.src("readme.txt").pipe(prefixer("123")).pipe(gulp.dest("dist"));
});

執行命令

gulp  prefixer

我們可以看到處理後的文件內容已經發生了變化,會在原來內容之前寫入123。

  這樣,一個簡單的插件就已經開發好了。如果你覺得自己的插件確實很有用,官網又沒有類似的插件提供的話,你可以將自己的插件發佈到npm,供更多的開發者使用。

  將插件發佈到npm

  要想發佈自己的npm包,首先要註冊自己的npm賬號。你可以到 npm官網 進行註冊,填寫自己的賬號,密碼和郵箱信息,註冊成功後需要在自己的郵箱進行認證。

  註冊成功後,首先在本地文件夾執行 npm init 命令

  執行完命令後我們需要填寫自己包的信息,name 是的你要發佈的包名,version是包的版本號。首次發佈默認爲1.0.0. 如果之後要重新發布自己的包,一定要修改自己的版本號,否則發佈無法成功。entry point指的是包的入口文件,一般默認都是index.js,當然也可以修改成自定義的文件。author可以寫自己的名字,其他內容都可以直接回車。

  在當前目錄下新建lib文件夾,將plugin.js複製到lib下,並在根目錄下新建index.js(入口文件), 內容如下:

module.exports = require("./lib/plugin");

  當然,爲了便於別人使用你的包,還需要在當前目錄下新建readme.md介紹自己包的功能已經使用方法.

  好了,在將自己的包發佈到npm之前我們最好在本地做下測試。 將文件夾拷貝到node_modules目錄下,在gulpfile.js中通過 require(“你的包名”) 引入進行測試。如果發現代碼可以正常運行,我們就可以正式發佈自己的npm包了.

  自定義npm包根目錄下執行命令:

npm login

  輸入自己的賬號密碼以及郵箱,登錄成功。

  執行命令

npm  publish

  npm 包發佈成功。你可以登錄 https://www.npmjs.com/ 搜索到自己的npm包。之後,自己或別人使用你的插件的時候就可以使用 npm install 你的包名 進行下載了。

  不過,由於現在npm 官網還沒有檢查機制對你發佈的包進行審覈,所以一些質量不高的包也會被發上去。如果你真的有意開發自己的gulp插件,請一定要遵守gulp插件開發的相關規範。

  開發一個有實際價值的gulp插件你需要仔細閱讀相關的規範說明。gulp插件規範.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章