由于webpack底层使用Tapable创建和执行钩子,所以也大致了解下tapable的原理
Tapable使用es6语法翻新了一遍,目前都是基于类的方式编写的。我们先看下目录结构:
我们其实主要看Hook.js和HookCodeFactory.js就够了,其他的基本都是大同小异的,都是依赖于这两个基类,然后扩展Hook的compile方法和HookCodeFactory的content方法,下面直接上代码。
因为几乎是大同小异,所以我们这里以最简单的SyncHook为实例:
1 | ; |
正如上面的代码所以,直观来看就是集成了两个基类,然后导出钩子函数,先从Hook说起:
1 | ; |
我们需要用tap、tapAsync、tapPromise往队列中添加函数,然后使用call来调用,不过call会根据不同类型的钩子产出不同的函数,这也是tapable做的优化,而这些函数的产出这来自HookCodeFactory:
1 | ; |
核心内容都在这里,剩下的方法基本都大同小异,具体的代码细节并没有仔细去看,毕竟是别人写的,就好像你通过答案接触题目一样,感觉时间成本太高,所以仅仅是简单了解一下。
有一点很重要,比如SyncHook和SyncLoopHook这两种方法,他们的区别仅仅就是产出的函数内容不一样,前者是直接获取钩子函数然后调用,后者是一个do-while循环调用钩子函数,可想而知剩余的方法的区别也是方法内体,也就是说你需要更多的关注content方法的onResult这个参数