webpack原理
Webpack本质基于事件流,流程就是将各个插件串联执行,实现此功能的核心就是tapable,webpack中负责编译的Compiler是基于tapable实现。
tapable
- 创建各种钩子
- 插件将自己的方法注册到对应钩子上,交给webpack
- webpack编译时,会适时地触发相应钩子,因此也就触发了tapable的方法
tabable api如下
SyncHook,
SyncBailHook,
SyncWaterfallHook,
SyncLoopHook,
AsyncParallelHook,
AsyncParallelBailHook,
AsyncSeriesHook,
AsyncSeriesBailHook,
AsyncSeriesWaterfallHook
SyncHook 基本使用
let { SyncHook } = require('tapable');
//触发此事件需传入name参数,然后监听函数可以获取name参数
let hooks = new SyncHook(["name", "age"]);
//注册监听
hooks.tap("a", function (name, age) {
console.log(name, age,'a');
});
hooks.tap("b", function (name, age) {
console.log(name, age,'b');
// 返回值无效
return 'error'
});
hooks.tap("c", function (name, age) {
console.log(name, age,'c');
});
// 触发事件
hooks.call("测试");
打印结果:
测试 100 a
测试 100 b
测试 100 c
SyncHook 实现原理
既然可以new,说明就是一个类,实现比较简单,代码定义如下:
class SyncHook {
constructor() {
this.hooks = [];
}
tap(name, fn) {
this.hooks.push(fn);
}
call() {
this.hooks.forEach((hook) => hook(...arguments));
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。