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
只是代表了一次新的编译。