知海

Compiler 钩子

webpackjsorg-mainAPI 参考

Compiler 钩子

Compiler 模块是主要引擎,它通过 CLINode API 传入的所有选项来创建编译实例。它扩展了 Tapable 类以注册和调用插件。大多数面向用户的插件首先注册在 Compiler 上。

在为 webpack 开发插件时,您可能想知道每个钩子在何处被调用。要了解这一点,请在 webpack 源码中搜索 hooks.<hook name>.call

注意: 自 webpack 5 起,hooks 不再可扩展。请使用 WeakMap 来添加自定义钩子。

Watching(监听)

Compiler 支持 watching,它会监视文件系统并在文件变化时重新编译。在监听模式下,编译器会触发额外的 watchRunwatchCloseinvalid 事件。这通常用于 开发环境,通常由 webpack-dev-server 等工具在底层使用,这样开发人员无需每次手动重新编译。监听模式也可以通过 CLI 进入。

钩子

compiler 暴露了以下生命周期钩子,可以这样访问:

js 复制代码
compiler.hooks.someHook.tap("MyPlugin", (params) => {
  /* ... */
});

根据钩子类型的不同,tapAsynctapPromise 也可能可用。

关于钩子类型的说明,请参阅 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 事件之前。此钩子 不会 被复制到子编译器。

  • 回调参数:compilationcompilationParams

compilation

SyncHook

在编译创建后运行插件。

  • 回调参数:compilationcompilationParams

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

当资源已被发出时执行。提供有关已发出资源的信息,例如其输出路径和字节内容。

  • 回调参数:fileinfo

例如,您可以通过 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

当监听编译失效时执行。此钩子 不会 被复制到子编译器。

  • 回调参数:fileNamechangeTime

watchClose

SyncHook

当监听编译停止时调用。

shutdown

AsyncSeriesHook

当编译器关闭时调用。

infrastructureLog

SyncBailHook

当通过配置中的 infrastructureLogging 选项 启用时,允许使用基础设施日志。

  • 回调参数:nametypeargs

log

SyncBailHook

当启用时,允许记录到 stats 中,参见 stats.loggingstats.loggingDebugstats.loggingTrace 选项

  • 回调参数:originlogEntry

帮助我们改进文档

发现翻译问题或内容错误?请告诉我们。