61讲 Tapable插件架构与Hooks设计
Webpack本质
Webpack可以将其理解是一种基于事件流的编程范例,一系列的插件运行
Tapable是什么?
Tapable是一个类似于Node.js的EventEmitter的库,主要是控制钩子函数的发布与订阅,控制着webpack插件系统。
Tapable库暴露了很多Hook(钩子)类,为插件提供挂载钩子
Tapable hooks类型
Tapable 的使用-new Hook新建钩子
Tapable暴露出来的都是类方法,new一个类方法获得我们需要的钩子。
class接受数组参数options,非必传。类方法会根据传参,接受同样数量的参数。
const hook1 = new SyncHook({"arg1","arg2","arg3"})
Tapable 的使用-钩子的绑定与执行
Tabpack提供了同步&异步绑定钩子的方法,并且他们都有绑定事件和执行事件对应的方法。
Tapable 的使用-hook基本用法示例
Tapable 的使用-实际例子演示
62讲 Tapable是如何和webpack进行关联起来的?
插件有个apply方法,接受参数,参数是一个对象
内部插件注入进去
模拟Compiler.js
同步hook:
异步hook:
插件my-plugin.js
监听hook:
模拟插件执行
63讲 Webpack流程篇:准备阶段
Webpack流程篇
准备阶段看这个:
WebpackOptionsApply
64讲 Webpack流程篇:模块构建和chunk生成阶段(打包)
Compiler hooks
从流程.make讲
Compilation
seal 内容输出,资源生成优化
ModuleFactory
Module
NormalModule
关注doBuild 和 Module.build代码逻辑,result = parser.parse
result 存放到Compilation的 this.Module = []
Compilation hooks
Chunk生成算法
- webpack先将entry中对应module都生成一个新的chunk
- 遍历module的依赖列表,将依赖的module也加入到chunk中
- 如果一个依赖module是动态引入的模块,那么就会根据这个module创建一个新的chunk,继续遍历依赖
- 重复上面过程,直到得到所有chunks
65讲 Webpack流程篇:文件生成(输出到磁盘)
seal和emit阶段
seal阶段会createHash,然后进入createModuleAssets,放到this.assets[]中保存
进入emit阶段,在compile.js中,获取getPath,mkdir,输入文件
modifyHash根据传入Hash进行修改
参考
程柳峰 《极客时间》 《玩转webpack》 第六章 61-65讲