Plugin
Tapable
增强版的发布订阅模式
plugin
在 Webpack 构建过程中会触发部分钩子函数,并传入上下文参数(例如 compilation),插件可以通过调用上下文接口、修改上下文状态等方式篡改构建逻辑
函数签名:
class MyPlugin {
apply(compiler) {
compiler.hooks.thisCompilation.tap("MyPlugin", (compilation) => {
compilation.addModule(/* ... */);
});
}
}
部分 Hook
- compiler.hooks.compilation。Webpack 刚启动完,创建出 compilation 对象后触发;参数是当前编译的 compilation 对象
- compiler.hooks.make。正式开始构建时触发;参数是当前编译的 compilation 对象
- compilation.hooks.optimizeChunks。 seal 函数中,chunk 集合构建完毕后触发;参数是 chunks 与 chunkGroups
- compiler.hooks.done。编译完成后触发;参数是 stats 对象,包含编译过程中的各类统计信息
常见 plugins
- HotModuleReplacementPlugin。注入 HMR runtime
- imagemin-webpack-plugin。图片压缩
- eslint-webpack-plugin
- 使用多个 Hook,在不同时间点执行 Lint 检查
- 复用 Webpack 内置的 error/warn 方法提交代码风格问题
- DefinePlugin
自定义 plugin【WIP】
- https://github.com/DIVIBEAR/webpack-loader/blob/master/docs/webpack-plugin.md
- https://juejin.cn/post/6844904162405138445
插件架构
- 接口:需要提供一套逻辑接入方法,让开发者能够将代码插入特定环节,变更原始逻辑
- 输入:如何将上下文信息高效传导给插件
- 输出:插件内部通过何种方式影响整套运行体系