总之有这么多钩子可以用:
- entryOption:在entry配置项处理前被调用,可以修改entry配置项;
- beforeRun:在运行编译器前被调用;
- run:在开始读取记录时被调用;
- emit:生成资源到output目录之前被调用;
- afterEmit:生成资源到output目录之后被调用;
- thisCompilation:在compilation创建之前被调用,可以用于注册额外的插件等;
- compilation:在compilation创建时被调用,用于注册一些回调等;
- normalModuleFactory:在normal module工厂创建之后被调用,可以在模块加载前完成一些准备工作;
- contextModuleFactory:类似于normalModuleFactory,但是用于动态上下文模块;
- beforeCompile:编译器开始编译之前被调用;
- compile:编译器开始编译时被调用;
- afterCompile:编译器完成编译之后被调用;
- watchRun:在watch模式编译器运行之前被调用;
- failed:当编译失败时被调用;
- done:同时编译和重新编译完成后被调用。
案例1.entryOption
class MyEntryOptionPlugin {
apply(compiler) {
compiler.hooks.entryOption.tap("MyEntryOptionPlugin", (context, entry) => {
// 遍历所有入口配置
for (const entryName in entry) {
const entryPath = entry[entryName];
// 处理入口路径
const newEntryPath = modifyEntryPath(entryPath);
// 更新入口配置
entry[entryName] = newEntryPath;
}
});
}
}
function modifyEntryPath(path) {
// 在路径前添加前缀
return `./src/${path}`;
}