Tapable
webpack
本质上是一种事件流的机制,它的工作流程就是将各个插件串联起来,而实现这一切的核心就是Tapable
。Tapable
暴露出挂载plugin
的方法,使我们能将plugin
控制在webapack
事件流上运行, Compiler
、Compilation
等都是继承于Tabable
类。
它有很多Hook(钩子)类,为插件提供挂载的钩子
1 | exports.__esModule = true; |
- tapable 暴露出来的都是类方法,new 一个类方法获得我们需要的钩子。类方法会根据传参,接受同样数量的参数。
- 使用 tap/tapAsync/tapPromise 绑定钩子
- call/callAsync 执行绑定事件
Hook类
1 | /* |
同步钩子
SyncHook(同步钩子)
1 | const { SyncHook } = require("./lib/index.js"); |
- 通过new关键字调用SyncHook,返回Hook的实例,并且重写了 tapAsync、tapPromise、compile 三个方法
1 | /* |
- queue.tap调用,其实就是把名称、类型与回调设置在taps数组里
- queue.call调用,这里通过new Function生成了匿名函数,之后匿名函数被调用
1 | create(options) { |
在这里生成fn
1 | anonymous(name |
之后调用这个函数
SyncBailHook(同步保险钩子)
1 | const { |
生成的fn
1 | (function anonymous(name) { |
如果执行结果不等于undefined,就停止并返回执行结果,否则继续往下执行。
SyncLoopHook(同步循环钩子)
1 | const { |
生成的fn
1 | (function anonymous(name) { |
如果执行结果不等于undefined,就会一直执行
SyncWaterfallHook(同步瀑布钩子)
1 | const { |
生成的fn
1 | (function anonymous(name) { |
前面的 handler 返回值作为下一个 handler 的输入值
异步钩子
所有的异步钩子支持 tap、tapAsync、tapPromise 方法来注册各种类型的 handler,但是不支持 call 方法来触发 handler,只支持 promise、callAsync。
AsyncParallelBailHook(异步并行保险钩子)
1 | const { |
生成的fn
1 | (function anonymous(_callback) { |
每个 handler 的最后一位形参是 next,它是一个函数,用户必须手动执行并且传参,这样 callback 会拿到该参数并且执行。从例子可以看出,callback 的执行是取决于注册的 handler 的顺序。
AsyncParallelHook(异步并行钩子)
1 | const { |
生成的fn
1 | (function anonymous(_callback) { |
callback 的执行是取决先执行 next 函数的