webpack本质上是一种事件流的机制,核心是Tapable。
webpack中最核心的负责编译的Compiler和负责创建bundles的Compilation都是Tapable的实例。
Tapable是什么?
Tapable暴露了很多Hook(钩子)类,为插件提供挂载。
1 | const { |
Tapable用法
- 新建钩子
new Hook(); - 使用
tap/tapAsync/tapPromise绑定钩子 call/callAsync执行绑定事件
1 | // 1 |
举个例子
1 | const { SyncHook, AsyncParallelHook } = require('tapable'); |
进阶一下
上面学习了Tapable的用法,但它和webpack/plugin有什么关系呢?
我们将刚才但代码稍作改动,拆成两个文件:Compiler.js、MyPlugin.js.
1 | const { |
1 | const Compiler = require('./Compiler'); |
Plugin基础
webpack通过plugin机制让其更加灵活,以适应各种应用场景。在webpack运行的生命周期中会广播出许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的API改变输出结果。
一个最基础的plugin的代码是这样的:
1 | class PluginDemo { |
在使用这个plugin时,相关代码如下:
1 | const PluginDemo = require('./PluginDemo'); |
Compiler和Compilation
在开发plugin时最常用的两个对象就是Compiler和Compilation,它们是Plugin和webpack之间的桥梁。
Compiler
Compiler对象包含了webpack环境所有的配置信息,包含options,loaders,plugins等,这个对象在webpack启动的时候被实例化,它在全局是唯一的。
Compilation
Compilation对象包含了当前的模块资源、编译生成资源、变化的文件等。当webpack以开发模式运行时,每当检测到一个文件变化,一次新的Compilation将被创建。Compilation对象也提供了很多事件回调供插件做扩展。通过Compilation对象也可以读取到Compiler对象。
它们的区别在于:Compiler代表了整个webpack从启动到关闭的生命周期,而Compilation只是代表了一次新的编译。