<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          tapable 創(chuàng)建鉤子

          共 1629字,需瀏覽 4分鐘

           ·

          2022-01-03 13:19


          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í)行)。


          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  69av网站 | 91作爱视频 | 少妇大战黑人无套A片 | 欧美日韩在线一区 | 五月天婷婷伊人 |