編寫一個 webpack plugins

創(chuàng)建插件

webpack 插件由以下組成:

  • 一個 JavaScript 命名函數(shù)。
  • 在插件函數(shù)的 prototype 上定義一個 apply 方法。
  • 指定一個綁定到 webpack 自身的事件鉤子宋欺。
  • 處理 webpack 內(nèi)部實例的特定數(shù)據(jù)胸墙。
  • 功能完成后調(diào)用 webpack 提供的回調(diào)寸痢。
// 一個 JavaScript 命名函數(shù)囊榜。
function MyWebpackPlugin() {

};

// 在插件函數(shù)的 prototype 上定義一個 `apply` 方法。
MyWebpackPlugin.prototype.apply = function(compiler) {
  // 指定一個掛載到 webpack 自身的事件鉤子尼变。
  compiler.plugin('webpacksEventHook', function(compilation /* 處理 webpack 內(nèi)部實例的特定數(shù)據(jù)利凑。*/, callback) {
    console.log("This is an example plugin!!!");

    // 功能完成后調(diào)用 webpack 提供的回調(diào)。
    callback();
  });
};

Compiler 和 Compilation

  • Compiler 和 Compilation 是插件開發(fā)中最重要的兩個資源

  • Compiler 對象代表了完整的 webpack 環(huán)境配置嫌术。這個對象在啟動 webpack 時被一次性建立哀澈,并配置好所有可操作的設(shè)置,包括 options度气,loader 和 plugin割按。當在 webpack 環(huán)境中應(yīng)用一個插件時,插件將收到此 compiler 對象的引用磷籍∈嗜伲可以使用它來訪問 webpack 的主環(huán)境。

  • compilation 對象代表了一次資源版本構(gòu)建院领。當運行 webpack 開發(fā)環(huán)境中間件時弛矛,每當檢測到一個文件變化,就會創(chuàng)建一個新的 compilation比然,從而生成一組新的編譯資源丈氓。一個 compilation 對象表現(xiàn)了當前的模塊資源、編譯生成資源、變化的文件万俗、以及被跟蹤依賴的狀態(tài)信息鱼鼓。compilation 對象也提供了很多關(guān)鍵時機的回調(diào),以供插件做自定義處理時選擇使用该编。

編寫一個基礎(chǔ)插件

  • 插件是由「具有 apply 方法的 prototype 對象」所實例化出來的。這個 apply 方法在安裝插件時硕淑,會被 webpack compiler 調(diào)用一次课竣。apply 方法可以接收一個 webpack compiler 對象的引用,從而可以在回調(diào)函數(shù)中訪問到 compiler 對象.
module.exports = class MyPlugin {
  constructor(options) {
    this.options = options
  }

  apply(compiler) {
    // 這里會打印在 調(diào)用此插件傳遞的參數(shù)
    console.log('options', this.options)
  }
}
  • 安裝插件 在 webpack.config 配置 plugins
const path = require('path')
const MyPlugin = require('./plugins/plugin-demo')

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'main.js'
  },
  mode: 'production',
  plugins: [
    new MyPlugin({
      name: 'webpack'
    })
  ]
}

編寫一個壓縮構(gòu)建資源為 zip 包的插件

  • 安裝相關(guān)依賴
npm i jszip webpack-sources 
  • 代碼
const JSZip = require('jszip')
const path = require('path')
const RawSource = require('webpack-sources').RawSource
const zip = new JSZip
module.exports = class ZipPLugin {
  constructor(options) {
    this.options = options
  }

  apply(compiler) {
    console.log('compiler', this.options)
    compiler.hooks.emit.tapAsync('ZipPlugin', (compilation, callback) => {
      // 創(chuàng)建一個目錄
      const folder = zip.folder(this.options.filename)

      for(let filename in compilation.assets) {
        // 獲取 source 也就是文件的內(nèi)容
        const source = compilation.assets[filename].source()
        // 把內(nèi)容添加到文件中
        folder.file(filename, source)
      }

      zip.generateAsync({
        type: 'nodebuffer'
      }).then((content) => {
        // 獲取文件路徑地址
        const outPutPath = path.join(compilation.options.output.path, this.options.filename + '.zip')
        // 文件路徑的絕對定位改成相對定位置媳,
        const outPutRelativePath = path.relative(
          compilation.options.output.path,
          outPutPath
        )
        compilation.assets[outPutRelativePath] = new RawSource(content)
        callback()
      })
    })
  }
}

github plugins-learn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末于樟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拇囊,更是在濱河造成了極大的恐慌迂曲,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寥袭,死亡現(xiàn)場離奇詭異路捧,居然都是意外死亡,警方通過查閱死者的電腦和手機传黄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門杰扫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膘掰,你說我怎么就攤上這事章姓。” “怎么了识埋?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵凡伊,是天一觀的道長。 經(jīng)常有香客問我窒舟,道長系忙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任辜纲,我火速辦了婚禮笨觅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耕腾。我一直安慰自己见剩,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布扫俺。 她就那樣靜靜地躺著苍苞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羹呵,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天骂际,我揣著相機與錄音,去河邊找鬼冈欢。 笑死歉铝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凑耻。 我是一名探鬼主播太示,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼香浩!你這毒婦竟也來了类缤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤邻吭,失蹤者是張志新(化名)和其女友劉穎餐弱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囱晴,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡膏蚓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了速缆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片降允。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艺糜,靈堂內(nèi)的尸體忽然破棺而出剧董,到底是詐尸還是另有隱情,我是刑警寧澤破停,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布翅楼,位于F島的核電站,受9級特大地震影響真慢,放射性物質(zhì)發(fā)生泄漏毅臊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一黑界、第九天 我趴在偏房一處隱蔽的房頂上張望管嬉。 院中可真熱鬧,春花似錦朗鸠、人聲如沸蚯撩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胎挎。三九已至沟启,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犹菇,已是汗流浹背德迹。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揭芍,地道東北人胳搞。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像称杨,于是被迫代替她去往敵國和親流酬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容