编译器钩子

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

在为 webpack 开发插件时,你可能想知道每个钩子在哪里被调用。为此,请在 webpack 源代码中搜索 hooks.<hook name>.call

监听

Compiler 支持监听模式,它会监控文件系统并在文件更改时重新编译。在监听模式下,编译器会触发额外的事件,例如 watchRunwatchCloseinvalid。这通常用于开发环境,通常在 webpack-dev-server 等工具的内部使用,这样开发者无需每次手动重新编译。监听模式也可以通过命令行界面(CLI)进入。

钩子

以下生命周期钩子由 compiler 暴露,可以通过以下方式访问:

compiler.hooks.someHook.tap('MyPlugin', (params) => {
  /* ... */
});

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

有关钩子类型的描述,请参阅Tapable 文档

environment

SyncHook

在准备编译器环境时,紧接着在配置文件中初始化插件之后调用。

afterEnvironment

SyncHook

environment 钩子之后立即调用,当编译器环境设置完成时。

entryOption

SyncBailHook

在处理完 webpack 选项中的entry 配置之后调用。

compiler.hooks.entryOption.tap('MyPlugin', (context, entry) => {
  /* ... */
});

afterPlugins

SyncHook

在设置完初始内部插件集之后调用。

  • 回调参数:compiler

afterResolvers

SyncHook

在解析器设置完成后触发。

  • 回调参数:compiler

initialize

SyncHook

当编译器对象初始化时调用。

beforeRun

AsyncSeriesHook

在运行编译器之前添加一个钩子。

  • 回调参数:compiler

run

AsyncSeriesHook

在编译器开始读取`records`之前,接入(Hook into)编译器。

  • 回调参数:compiler

watchRun

AsyncSeriesHook

在监听模式下,当新的编译被触发但实际编译开始之前,执行插件。

  • 回调参数:compiler

normalModuleFactory

SyncHook

在创建 NormalModuleFactory 之后调用。

  • 回调参数:normalModuleFactory

contextModuleFactory

SyncHook

在创建 ContextModuleFactory 之后运行插件。

  • 回调参数:contextModuleFactory

beforeCompile

AsyncSeriesHook

在编译参数创建后执行插件。

  • 回调参数:compilationParams

compilationParams 变量初始化如下:

compilationParams = {
  normalModuleFactory,
  contextModuleFactory,
};

此钩子可用于添加/修改编译参数。

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

在完成并封存编译之后调用。

  • 回调参数:compilation

shouldEmit

SyncBailHook

在输出(emitting)资产之前调用。应返回一个布尔值,指示是否输出。

  • 回调参数:compilation
compiler.hooks.shouldEmit.tap('MyPlugin', (compilation) => {
  // return true to emit the output, otherwise false
  return true;
});

emit

AsyncSeriesHook

在将资产输出到输出目录之前立即执行。此钩子**不会**复制到子编译器。

  • 回调参数:compilation

afterEmit

AsyncSeriesHook

在将资产输出到输出目录之后调用。此钩子**不会**复制到子编译器。

  • 回调参数:compilation

assetEmitted

AsyncSeriesHook

当资产已输出时执行。提供对已输出资产的信息访问,例如其输出路径和字节内容。

  • 回调参数:file, info

例如,您可以通过 info.content 访问资产的内容缓冲区。

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.loggingstats.loggingDebugstats.loggingTrace 选项

  • 回调参数:origin, logEntry

8 贡献者

rishantagarwalbyzykmadhavarshneymisterdevEugeneHlushkosuperburritochenxsansnitin315