webpack插件探索

看了官網(wǎng)和一些其它技術(shù)文章,我覺(jué)得webpack插件主要搞清楚幾個(gè)問(wèn)題:1. 他用來(lái)做為什么腔呜。2叁温,什么時(shí)候做。3.怎么做核畴。

webpack做了什么

監(jiān)聽(tīng)編譯中的事件膝但,把功能嵌入到webpack的編譯流程中

功能包括很多,比如說(shuō)谤草,輸出一些信息跟束,修改文件,或者修改文件名等等丑孩。

什么時(shí)候做

借一張圖說(shuō)話冀宴。


20200616220856437.png

webpack編譯流程的每一步都會(huì)觸發(fā)事件,而plugin就是處理這些事件的温学。

那么它到底包括哪些事件略贮?這需要了解webpack的構(gòu)建流程;

  1. 校驗(yàn)配置文件 :讀取命令行傳入或者webpack.config.js文件仗岖,初始化本次構(gòu)建的配置參數(shù)
  2. 生成Compiler對(duì)象:執(zhí)行配置文件中的插件實(shí)例化語(yǔ)句new MyWebpackPlugin()逃延,為webpack事件流掛上自定義hooks
  3. 進(jìn)入entryOption階段:webpack開(kāi)始讀取配置的Entries,遞歸遍歷所有的入口文件
  4. run/watch:如果運(yùn)行在watch模式則執(zhí)行watch方法轧拄,否則執(zhí)行run方法
  5. compilation:創(chuàng)建Compilation對(duì)象回調(diào)compilation相關(guān)鉤子揽祥,依次進(jìn)入每一個(gè)入口文件(entry),使用loader對(duì)文件進(jìn)行編譯檩电。通過(guò)compilation我可以可以讀取到module的resource(資源路徑)拄丰、loaders(使用的loader)等信息府树。再將編譯好的文件內(nèi)容使用acorn解析生成AST靜態(tài)語(yǔ)法樹(shù)。然后遞歸料按、重復(fù)的執(zhí)行這個(gè)過(guò)程奄侠, 所有模塊和和依賴分析完成后,執(zhí)行 compilation 的 seal 方法對(duì)每個(gè) chunk 進(jìn)行整理站绪、優(yōu)化遭铺、封裝webpack_require來(lái)模擬模塊化操作.
  6. emit:所有文件的編譯及轉(zhuǎn)化都已經(jīng)完成丽柿,包含了最終輸出的資源恢准,我們可以在傳入事件回調(diào)的compilation.assets上拿到所需數(shù)據(jù),其中包括即將輸出的資源甫题、代碼塊Chunk等等信息馁筐。

怎么做

提供一個(gè)class或原型方法,必須包含apply方法坠非,該方法只在安裝插件被Webpack compiler執(zhí)行一次

class HelloPlugin{
  // 在構(gòu)造函數(shù)中獲取用戶給該插件傳入的配置
  constructor(options){
  }
  // Webpack 會(huì)調(diào)用 HelloPlugin 實(shí)例的 apply 方法給插件實(shí)例傳入 compiler 對(duì)象
  apply(compiler) {
    // 在emit階段插入鉤子函數(shù)敏沉,用于特定時(shí)機(jī)處理額外的邏輯;
    compiler.hooks.emit.tap('HelloPlugin', (compilation) => {
      // 在功能流程完成后可以調(diào)用 webpack 提供的回調(diào)函數(shù)炎码;
    });
    // 如果事件是異步的盟迟,會(huì)帶兩個(gè)參數(shù),第二個(gè)參數(shù)為回調(diào)函數(shù)潦闲,在插件處理完任務(wù)時(shí)需要調(diào)用回調(diào)函數(shù)通知webpack攒菠,才會(huì)進(jìn)入下一個(gè)處理流程。
    compiler.plugin('emit',function(compilation, callback) {
      // 支持處理邏輯
      // 處理完畢后執(zhí)行 callback 以通知 Webpack 
      // 如果不執(zhí)行 callback歉闰,運(yùn)行流程將會(huì)一直卡在這不往下執(zhí)行 
      callback();
    });
  }
}

module.exports = HelloPlugin;

webpack中最核心的負(fù)責(zé)編譯的Compiler和負(fù)責(zé)創(chuàng)建bundles的Compilation都是Tapable的實(shí)例辖众,可以直接在 Compiler 和 Compilation 對(duì)象上廣播和監(jiān)聽(tīng)事件,方法如下:

/**
* 廣播事件
* event-name 為事件名稱和敬,注意不要和現(xiàn)有的事件重名
*/
compiler.apply('event-name',params);
compilation.apply('event-name',params);
/**
* 監(jiān)聽(tīng)事件
*/
compiler.plugin('event-name',function(params){});
compilation.plugin('event-name', function(params){});

apply方法中插入鉤子的一般形式如下:

// compiler提供了compiler.hooks凹炸,可以根據(jù)這些不同的時(shí)刻去讓插件做不同的事情。
compiler.hooks.階段.tap函數(shù)('插件名稱', (階段回調(diào)參數(shù)) => {

});
compiler.run(callback)

Compiler 和 Compilation 的區(qū)別

Compiler 代表了整個(gè) Webpack 從啟動(dòng)到關(guān)閉的生命周期昼弟,而 Compilation 只是代表了一次新的編譯啤它,只要文件有改動(dòng),compilation就會(huì)被重新創(chuàng)建舱痘。

Compiler鉤子

https://webpack.docschina.org/api/compiler-hooks/

Compilation鉤子
https://webpack.docschina.org/api/compilation-hooks/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末变骡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衰粹,更是在濱河造成了極大的恐慌锣光,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铝耻,死亡現(xiàn)場(chǎng)離奇詭異誊爹,居然都是意外死亡蹬刷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門频丘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)办成,“玉大人,你說(shuō)我怎么就攤上這事搂漠∮芈” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵桐汤,是天一觀的道長(zhǎng)而克。 經(jīng)常有香客問(wèn)我,道長(zhǎng)怔毛,這世上最難降的妖魔是什么员萍? 我笑而不...
    開(kāi)封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮拣度,結(jié)果婚禮上碎绎,老公的妹妹穿的比我還像新娘。我一直安慰自己抗果,他們只是感情好筋帖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著冤馏,像睡著了一般日麸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宿接,一...
    開(kāi)封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天赘淮,我揣著相機(jī)與錄音,去河邊找鬼睦霎。 笑死梢卸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的副女。 我是一名探鬼主播蛤高,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼碑幅!你這毒婦竟也來(lái)了戴陡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沟涨,失蹤者是張志新(化名)和其女友劉穎恤批,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體裹赴,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喜庞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年诀浪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片延都。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雷猪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晰房,到底是詐尸還是另有隱情求摇,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布殊者,位于F島的核電站与境,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏幽污。R本人自食惡果不足惜嚷辅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望距误。 院中可真熱鬧,春花似錦扁位、人聲如沸准潭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刑然。三九已至,卻和暖如春暇务,著一層夾襖步出監(jiān)牢的瞬間泼掠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工垦细, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留择镇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓括改,卻偏偏與公主長(zhǎng)得像腻豌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘱能,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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