tapable 創(chuàng)建鉤子

tapable 是一個類似于 nodejs 的 EventEmitter 的庫, 主要是控制鉤子函數(shù)的發(fā)布與訂閱,控制著 webpack 的插件系 webpack 的本質(zhì)就是一系列的插件運行。
tapable 包導出了很多 Hook 鉤子類,這些 Hook 鉤子類可用于為 webpack 插件創(chuàng)建鉤子。
const {SyncHook,SyncBailHook,SyncWaterfallHook,SyncLoopHook,AsyncParallelHook,AsyncParallelBailHook,AsyncSeriesHook,AsyncSeriesBailHook,AsyncSeriesWaterfallHook} = require("tapable");
所有 Hook 鉤子構(gòu)造函數(shù)都接受一個可選參數(shù),該參數(shù)是一個字符串列表。
const hook = new SyncHook(["arg1", "arg2", "arg3"]);在 webpack 源碼中,Compiler 構(gòu)造函數(shù)中定義了 hooks 屬性暴露了所有的鉤子:
class Compiler {constructor() {this.hooks = {done: new AsyncSeriesHook(["stats"]),afterDone: new SyncHook(["stats"]),emit: new AsyncSeriesHook(["compilation"]),};}/* ... */}
現(xiàn)在可以使用這些 Hook 鉤子了:
const?compiler?=?new?Compiler();// 使用tap方法添加一個訂閱函數(shù)compiler.hooks.afterDone.tap("WarningLampPlugin", () => {console.log('Warning')});
鉤子類型
每一個鉤子都可以 tap 一個或者多個函數(shù), 他們?nèi)绾芜\行,取決于他們的鉤子類型。
基本的鉤子, (鉤子類名沒有 waterfall, Bail, 或者 Loop 的 ), 這個鉤子只會簡單的調(diào)用每個 tap 進去的函數(shù)。
Waterfall, 一個 waterfall 鉤子,也會調(diào)用每個 tap 進去的函數(shù),不同的是,他會從每一個函數(shù)傳一個返回的值到下一個函數(shù)。
Bail, Bail 鉤子允許更早的退出,當任何一個 tap 進去的函數(shù),返回任何值,bail 類會停止執(zhí)行其他的函數(shù)執(zhí)行.(類似 Promise.race())。
此外,鉤子可以是同步的,也可以是異步的,Sync, AsyncSeries 和 AsyncParallel,從名字就可以看出,哪些是可以綁定異步函數(shù)的。
Sync, 一個同步鉤子只能tap同步函數(shù), 不然會報錯。
AsyncSeries, 一個 async-series 鉤子,可以 tap 同步鉤子,基于回調(diào)的鉤子和一個基于promise 的鉤子(使用 myHook.tap(),myHook.tapAsync() 和 myHook.tapPromise().),他會按順序的調(diào)用每個方法。
AsyncParallel, 一個 async-parallel 鉤子跟上面的 async-series 一樣,不同的是他會把異步鉤子并行執(zhí)行(并行執(zhí)行就是把異步鉤子全部一起開啟,不按順序執(zhí)行)。
