钩子
2024年04月06日
一、认识
1.1 compiler
Compiler
全局构建管理器,Webpack
启动后会首先创建 compiler
对象,负责管理配置信息、Loader
、Plugin
等。从启动构建到结束。compiler
大致上会触发如下钩子:
Preview
1.2 compilation
Compilation
单次构建过程的管理器,负责遍历模块,执行编译操作;当 watch = true
时,每次文件变更触发重新编译,都会创建一个新的 compilation
对象。compilation
生命周期中主要触发如下钩子:
Preview
二、compiler.hooks.run
class RunPlugin{
apply(compiler){
compiler.hooks.run.tap('Plugin Run', (compiler)=>{
console.log("compiler")
});
}
}
二、compiler.hooks.emit
class EmitPlugin{
apply(compiler){
compiler.hooks.emit.tap('Plugin Emit', (compilation)=>{
console.log("compilation")
});
}
}
三、compiler.hooks.done
class DonePlugin{
apply(compiler){
compiler.hooks.done.tap('Plugin Don', (stats)=>{
console.log("stats")
});
}
}
四、compiler.hooks.make
compiler.hooks.make
是在正式开始构建时触发。参数为当前编译的 compilation
对象。
class MakePlugin{
apply(compiler){
compiler.hooks.done.tap('Plugin Make', (compilation)=>{
console.log("compilation",compilation)
});
}
}
五、compiler.hooks.compile
class CompilePlugin{
apply(compiler){
compiler.hooks.compiler.tap('Plugin Compiler', (params)=>{
console.log("params",params)
});
}
}
六、compiler.hooks.compilation
compiler.hooks.compilation
是在 Webpack
刚启动完,创建出 compilation
对象后触发。参数为当前编译的 compilation
对象。
class CompilationPlugin{
apply(compiler){
compiler.hooks.compilation.tap('Plugin Compilation', (compilation,params)=>{
console.log("params",params)
});
}
}
七、compiler.hooks.normalModuleFactory
Compiler
使用 NormalModuleFactory
模块生成各类模块。从入口点开始,此模块会分解每个请求,解析文件内容以查找进一步的请求,然后通过分解所有请求以及解析新的文件来爬取全部文件。在最后阶段,每个依赖项都会成为一个模块实例。
我们可以通过 NormalModuleFactory Hook
来注入 Plugin
逻辑从而控制 Webpack
中对于默认模块引用时的处理,比如 ESM
、CJS
等模块引入前后时注入对应逻辑。