2道宅、webpack核心模塊——tapable
tapable 是 webpack 的一個(gè)核心工具湃交,但也可用于其他地方镀首,以提供類似的插件接口豹缀。tapable模塊中暴露了Hook類伯复,pugins都是注冊在Hook的實(shí)例化對象上,這個(gè)類暴露?tap,?tapAsync?和?tapPromise?方法邢笙,webpack中的插件會(huì)將所需執(zhí)行的函數(shù)通過tap 啸如、tapAsync 、tapPromise等方法注冊到對應(yīng)鉤子上鸣剪。這樣组底,webpack調(diào)用相應(yīng)鉤子時(shí),散落在各文件的插件就會(huì)自動(dòng)執(zhí)行
插件類型:同步事件(sync)筐骇、異步并行事件(asyncParallel)债鸡、同步串行事件(asyncSeries)
compiler對象——hooks(對應(yīng)的編譯周期詳情見https://www.webpackjs.com/api/compiler-hooks/)
sync插件用法及原理:
? ? ? 1、事件注冊
usage : compiler.hooks.beforeRun.tab( option , fn )?
option : String || Object = { name:xxx , before:String || [] , stage:number }
option支持String或Object格式铛纬,如果傳入對象厌均,必須寫name屬性,相當(dāng)于string告唆;before:注冊的插件在哪些插件的前面棺弊,值可為string=>xxxplugin.name或者 [xxxplugin.name,xxxplugin2.name,...arg];stage:權(quán)重晶密,權(quán)重大的排在事件管理中心的后面,默認(rèn)stage=0模她。
? ? ? 2稻艰、事件觸發(fā)
? ? ? compiler.hooks.beforeRun.callAsync(compiler,()=>{})
? ??基本原理:
? ??????