Compiler 钩子
Compiler 钩子
Compiler 模块是主要引擎,它通过 CLI 或 Node API 传入的所有选项来创建编译实例。它扩展了 Tapable 类以注册和调用插件。大多数面向用户的插件首先注册在 Compiler 上。
在为 webpack 开发插件时,您可能想知道每个钩子在何处被调用。要了解这一点,请在 webpack 源码中搜索 hooks.<hook name>.call。
注意: 自 webpack 5 起,
hooks不再可扩展。请使用WeakMap来添加自定义钩子。
Watching(监听)
Compiler 支持 watching,它会监视文件系统并在文件变化时重新编译。在监听模式下,编译器会触发额外的 watchRun、watchClose 和 invalid 事件。这通常用于 开发环境,通常由 webpack-dev-server 等工具在底层使用,这样开发人员无需每次手动重新编译。监听模式也可以通过 CLI 进入。
钩子
compiler 暴露了以下生命周期钩子,可以这样访问:
js
compiler.hooks.someHook.tap("MyPlugin", (params) => {
/* ... */
});
根据钩子类型的不同,tapAsync 和 tapPromise 也可能可用。
关于钩子类型的说明,请参阅 Tapable 文档。
environment
SyncHook
在准备编译器环境时调用,即在配置文件中初始化插件之后。
afterEnvironment
SyncHook
在 environment 钩子之后调用,此时编译器环境设置已完成。
entryOption
SyncBailHook
在 webpack 选项中的 entry 配置 处理完成后调用。
js
compiler.hooks.entryOption.tap("MyPlugin", (context, entry) => {
/* ... */
});
afterPlugins
SyncHook
在设置完初始内部插件集之后调用。
- 回调参数:
compiler
afterResolvers
SyncHook
在 resolver 设置完成后触发。
- 回调参数:
compiler
validate
SyncHook
5.106.0+
调用以注册对 webpack 配置、插件和 loader 的验证工作。插件作者可以订阅此钩子并使用 compiler.validate(...) 参与 webpack 的内置验证流程。
注意: 该钩子始终可用。当设置
validate: false时,compiler.validate(...)会跳过验证。使用experiments.futureDefaults时,webpack 在开发模式下默认保持验证启用,在生产模式下默认禁用验证。
js
compiler.hooks.validate.tap("MyPlugin", () => {
compiler.validate(
() => require("./schema/MyPlugin.json"),
options,
{ name: "My Plugin", baseDataPath: "options" },
(validatedOptions) => require("./schema/MyPlugin.check")(validatedOptions),
);
});
initialize
SyncHook
当 compiler 对象初始化时调用。
beforeRun
AsyncSeriesHook
在运行编译器之前添加一个钩子。
- 回调参数:
compiler
run
AsyncSeriesHook
在编译器开始读取 records 之前钩入。
- 回调参数:
compiler
watchRun
AsyncSeriesHook
在监听模式下,新的编译被触发后、编译实际开始前执行插件。
- 回调参数:
compiler
normalModuleFactory
SyncHook
在创建 NormalModuleFactory 之后调用。
- 回调参数:
normalModuleFactory
contextModuleFactory
SyncHook
在创建 ContextModuleFactory 之后运行插件。
- 回调参数:
contextModuleFactory
beforeCompile
AsyncSeriesHook
在编译参数创建后执行插件。
- 回调参数:
compilationParams
compilationParams 变量按如下方式初始化:
js
compilationParams = {
normalModuleFactory,
contextModuleFactory,
};
此钩子可用于添加/修改编译参数:
js
compiler.hooks.beforeCompile.tapAsync("MyPlugin", (params, callback) => {
params["MyPlugin - data"] = "important stuff my plugin will use later";
callback();
});
compile
SyncHook
在 beforeCompile 之后、创建新编译之前调用。此钩子 不会 被复制到子编译器。
- 回调参数:
compilationParams
thisCompilation
SyncHook
在初始化编译时执行,恰好在触发 compilation 事件之前。此钩子 不会 被复制到子编译器。
- 回调参数:
compilation、compilationParams
compilation
SyncHook
在编译创建后运行插件。
- 回调参数:
compilation、compilationParams
make
AsyncParallelHook
在完成编译之前执行。此钩子 不会 被复制到子编译器。
- 回调参数:
compilation
afterCompile
AsyncSeriesHook
在编译完成并密封(seal)后调用。
- 回调参数:
compilation
shouldEmit
SyncBailHook
在发出资源之前调用。应返回一个布尔值,指示是否发出。
- 回调参数:
compilation
js
compiler.hooks.shouldEmit.tap(
"MyPlugin",
(compilation) =>
// return true to emit the output, otherwise false
true,
);
emit
AsyncSeriesHook
在将资源发出到输出目录之前执行。此钩子 不会 被复制到子编译器。
- 回调参数:
compilation
afterEmit
AsyncSeriesHook
在将资源发出到输出目录后调用。此钩子 不会 被复制到子编译器。
- 回调参数:
compilation
assetEmitted
AsyncSeriesHook
当资源已被发出时执行。提供有关已发出资源的信息,例如其输出路径和字节内容。
- 回调参数:
file、info
例如,您可以通过 info.content 访问资源的内容 buffer:
js
compiler.hooks.assetEmitted.tap(
"MyPlugin",
(file, { content, source, outputPath, compilation, targetPath }) => {
console.log(content); // <Buffer 66 6f 6f 62 61 72>
},
);
done
AsyncSeriesHook
当编译完成时执行。此钩子 不会 被复制到子编译器。
- 回调参数:
stats
additionalPass
AsyncSeriesHook
此钩子允许您对构建再执行一次额外的编译过程。
failed
SyncHook
如果编译失败则调用。
- 回调参数:
error
invalid
SyncHook
当监听编译失效时执行。此钩子 不会 被复制到子编译器。
- 回调参数:
fileName、changeTime
watchClose
SyncHook
当监听编译停止时调用。
shutdown
AsyncSeriesHook
当编译器关闭时调用。
infrastructureLog
SyncBailHook
当通过配置中的 infrastructureLogging 选项 启用时,允许使用基础设施日志。
- 回调参数:
name、type、args
log
SyncBailHook
当启用时,允许记录到 stats 中,参见 stats.logging、stats.loggingDebug 和 stats.loggingTrace 选项。
- 回调参数:
origin、logEntry
帮助我们改进文档
发现翻译问题或内容错误?请告诉我们。
