webpack4.0各個擊破(7)—— plugin篇

      網友投稿 629 2025-03-31

      一. plugin概述


      1.1 Plugin的作用

      plugin機制是webpack中另一個核心概念,它基于事件流框架tapable,你可以參考瀏覽器環境中的【DOM事件模型】,【SPA模型中的生命周期鉤子】或是node環境中的【EventEmitter模塊】來理解其作用。plugin系統提供給開發者監聽webpack生命周期并在特定事件觸發時執行指定操作的能力。

      webpack4.0各個擊破(7)—— plugin篇

      當然,要寫一個真正能實現一定功能的插件,你還需要了解Compiler和Compilation這兩個概念,網上可以找到非常多相關的文章(《webpack-docs/plugin》)。

      1.2 Compiler

      從表現上看,Compiler暴露了和webpack整個生命周期相關的鉤子,通過如下的方式訪問:

      //基本寫法compiler.hooks.someHook.tap(...)//如果希望在entry配置完畢后執行某個功能compiler.hooks.entryOption.tap(...)//如果希望在生成的資源輸出到output指定目錄之前執行某個功能compiler.hooks.emit.tap(...)

      webpack在重要的生命周期節點上都提供了事件鉤子,我們可以借此加入一些自定義的功能。我們來編寫一個插件,直觀地看看webpack中涉及的鉤子:

      //check-compiler-hooks-plugin.jsconst?pluginName?=?'checkCompilerHooksPlugin';module.exports?=?class?checkCompilerHooksPlugin?{ ????apply(compiler){????????//打印出entryOption執行完畢時Compiler暴露的鉤子 ????????for(var?hook?of?Object.keys(compiler.hooks)){????????????console.log(hook); ????????} ????} }

      可以看到Compiler上可以使用的鉤子(當然這種方式看到的鉤子和實際觸發順序無關):

      注意上圖中Compiler.hooks暴露的事件鉤子中有一個compilation,下一小節將解釋它。

      1.3 Compilation

      Compilation暴露了與模塊和依賴有關的粒度更小的事件鉤子,官方文檔中的說法是模塊會經歷加載(loaded),封存(sealed),優化(optimized),分塊(chunked),哈希(hashed)和重新創建(restored)這幾個典型步驟,從上面的示例可以看到,compilation是Compiler生命周期中的一個步驟,使用compilation相關鉤子的通用寫法為:

      compiler.hooks.compilation.tap('SomePlugin',function(compilation,?callback){ ????compilation.hooks.someOtherHook.tap('SomeOtherPlugin',function(){ ????????.... ????}) });

      我們仿照上面的方法就可以查看到compilation對象上(compilation事件觸發時,在回調函數中取得的引用)暴露的事件鉤子。

      Compiler和Compilation暴露的事件鉤子總數超過30個,具體信息可以直接在官方文檔直接查詢API,在特定的階段鉤入想要添加的自定義功能。想要更好地理解plugin的作用機制,還需要了解webpack的整個生命周期以及事件流框架tapable.

      二. 如何寫一個plugin

      根據webpack官方文檔的說明,一個自定義的plugin需要包含:

      一個javaScript命名函數

      插件函數的prototype上要有一個apply方法

      指定一個綁定到webpack自身的事件鉤子

      注冊一個回調函數來處理webpack實例中的指定數據

      處理完成后調用webpack提供的回調

      官網給出了一個基本的結構示例:

      //console-log-on-build-webpack-plugin.jsconst?pluginName?=?'ConsoleLogOnBuildWebpackPlugin';class?ConsoleLogOnBuildWebpackPlugin?{ ????apply(compiler){ ????????compiler.hooks.run.tap(pluginName,?compilation=>{???????????console.log('webpack構建過程開始');? ????????}); ????} }

      將其添加到webpack插件中后可以看到運行中觸發了傳入的回調函數:

      三. 實戰

      在《webpack4.0各個擊破(4)——javaScript & splitChunks》一文中,我們使用splitChunks功能對初始模塊進行代碼分割,在為多頁面應用模型的html入口插入script標簽時遇到了無法自動插入的問題,那么本節我們用一個webpack-dispatch-chunk-plugin來解決一下這個問題。

      處理的邏輯就是利用html-webpack-plugin暴露的更改資源標簽的事件鉤子htmlWebpackPluginAlterAssetTags來進行資源處理,此時資源已經離過模塊化和代碼分割并已經在名稱中加入了hash標記,只需要此時過濾掉名稱中含有vendors且不包含相應入口名稱的新的chunk即可,當然這只是一個基本功能,想要動態實現功能,還需要將上例中checkMap部分變為對Compiler或是Compilation上對應屬性的引用,本篇不再贅述。

      【參考】

      [1]?webpack之內部運行機制》

      webpack npm

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel如何使用widechar函數
      下一篇:功能區被隱藏后如何讓它顯示(文件功能區隱藏后如何打開)
      相關文章
      91在线精品亚洲一区二区| 亚洲va久久久噜噜噜久久| 亚洲国产成人精品久久| 久久亚洲国产视频| 亚洲色精品88色婷婷七月丁香| 亚洲国产香蕉人人爽成AV片久久| 亚洲av乱码一区二区三区按摩| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲精品无播放器在线播放| 亚洲色偷偷综合亚洲AV伊人蜜桃| 91在线亚洲综合在线| 久久亚洲精品国产亚洲老地址 | 亚洲精品黄色视频在线观看免费资源| 麻豆亚洲AV成人无码久久精品| 亚洲丰满熟女一区二区哦| 久久亚洲精品高潮综合色a片| 国产精品亚洲AV三区| 国产成人精品亚洲一区| 国产成人+综合亚洲+天堂| 国产亚洲蜜芽精品久久| 亚洲国产精品无码久久久久久曰 | 国产精品亚洲二区在线| 亚洲av无码天堂一区二区三区| 亚洲人成网站观看在线播放| 国产亚洲人成A在线V网站| 国产亚洲福利精品一区| 亚洲爆乳无码专区| 2022年亚洲午夜一区二区福利| 亚洲国产高清美女在线观看| 中国china体内裑精亚洲日本| 亚洲av成人中文无码专区| 国产亚洲精品国产福利在线观看| 亚洲精品无码久久久久AV麻豆| 中文字幕中韩乱码亚洲大片| 国产亚洲成av人片在线观看| 亚洲日本va午夜中文字幕一区| 亚洲精品综合久久中文字幕 | 久久久久久亚洲精品不卡| 亚洲日本va中文字幕久久| 亚洲精品免费在线观看| 亚洲av永久无码精品天堂久久 |