Compiler 钩子

Overview

rspack()

rspack()

创建 Compiler 实例

执行 NodeEnvironmentPlugin

合并默认配置

执行自定义插件

执行内部插件

获取路径解析配置(resolveOptions)

返回 compiler 实例


compiler.compile()

compiler.compile(callback)

创建模块工厂

hooks.normalModuleFactory

hooks.contextModuleFactory

创建 Compilation 实例

创建模块图

执行 loader 编译模块

compilation.finish()

compilation.seal()

callback()

compiler.watch/run/close()

compiler.watch(options, callback)

创建 Watching 实例

compiler.run(callback)

hooks.readRecords

compiler.compile()

生成产物文件

hooks.assetEmitted

hooks.needAdditionalPass

hooks.done

hooks.additionalPass

hooks.emitRecords

callback(err, stats)

watching.watch()

收集文件变更

compiler.close(callback)

watching.close()

callback()

environment

在编译器准备环境时,初始化插件之后调用。

  • 类型: SyncHook<[]>

afterEnvironment

当编译器环境准备完成后,在 environment 钩子后直接调用。

  • 类型: SyncHook<[]>

entryOption

在 Rspack 选项中的 entry 被处理过之后调用。

  • 类型: SyncBailHook<[string, EntryNormalized]>
  • 参数:
    • string: 等同于 context 配置
    • EntryNormalized: 处理后的 entry 配置

afterPlugins

在初始化内部插件完成之后调用。

  • 类型: SyncHook<[Compiler]>
  • 参数:
    • Compiler: 当前 Compiler 实例

afterResolvers

resolver 设置完成之后触发。

  • 类型: SyncHook<[Compiler]>
  • 参数:
    • Compiler: 当前 Compiler 实例

initialize

当编译器被初始化时调用。

  • 类型: SyncHook<[]>

beforeRun

在开始执行一次构建之前调用。

NOTE

这个钩子仅在调用 compiler.run() 时触发(对应 rspack build 命令),在监听模式(watch mode)下不会执行。在监听模式下,你可以使用 watchRun 钩子。

  • 类型: AsyncSeriesHook<[Compiler]>
  • 参数:
    • Compiler: 当前 Compiler 实例
  • 示例: 同步操作
class ExamplePlugin {
  apply(compiler) {
    compiler.hooks.beforeRun.tap('ExamplePlugin', compiler => {
      console.log('Build is about to start...');
    });
  }
}
  • 示例: 异步操作
class ExamplePlugin {
  apply(compiler) {
    compiler.hooks.beforeRun.tapPromise(
      'ExamplePlugin',
      (compiler) => {
        console.log('Build is about to start...');

        await someAsyncOperation();
      },
    );
  }
}

run

在开始执行一次构建时调用。

NOTE

这个钩子仅在调用 compiler.run() 时触发(对应 rspack build 命令),在监听模式(watch mode)下不会执行。在监听模式下,你可以使用 watchRun 钩子。

  • 类型: AsyncSeriesHook<[Compiler]>
  • 参数:
    • Compiler: 当前 Compiler 实例
  • 示例: 同步操作
class ExamplePlugin {
  apply(compiler) {
    compiler.hooks.beforeRun.tap('ExamplePlugin', compiler => {
      console.log('Build start...');
    });
  }
}
  • 示例: 异步操作
class ExamplePlugin {
  apply(compiler) {
    compiler.hooks.beforeRun.tapPromise(
      'ExamplePlugin',
      (compiler) => {
        console.log('Build start...');

        await someAsyncOperation();
      },
    );
  }
}

watchRun

在监听模式下,开始执行一次构建时调用。

你可以通过 compiler.modifiedFilescompiler.removedFiles 获取变更的文件路径和删除的文件路径。

NOTE

这个钩子仅在调用 compiler.watch() 时触发,在非监听模式下不会执行。在非监听模式下,你可以使用 runbeforeRun 钩子。

  • 类型: AsyncSeriesHook<[Compiler]>
  • 参数:
    • Compiler: 当前 Compiler 实例
  • 示例: 同步操作
class ExamplePlugin {
  apply(compiler) {
    compiler.hooks.watchRun.tap('ExamplePlugin', compiler => {
      const { modifiedFiles, removedFiles } = compiler;
      if (modifiedFiles) {
        console.log('Changed files:', Array.from(modifiedFiles));
      }
      if (removedFiles) {
        console.log('Removed files:', Array.from(removedFiles));
      }
    });
  }
}
  • 示例: 异步操作
class ExamplePlugin {
  apply(compiler) {
    compiler.hooks.watchRun.tapPromise('ExamplePlugin', compiler => {
      await someAsyncOperation();
    });
  }
}

beforeCompile

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

  • 类型: AsyncSeriesHook<[]>

compile

在一个新的 compilation 创建之前调用。

  • 类型: SyncHook<[]>

thisCompilation

创建 compilation 时调用,在触发 compilation 钩子之前调用。

  • 类型: SyncHook<[Compilation]>
  • 参数:

compilation

compilation 创建之后执行。

  • 类型: SyncHook<[Compilation]>
  • 参数:

make

在 make 阶段开始前调用,在 make 阶段会以 entry 为起点构建模块依赖图,并使用 loader 处理各个模块。

  • 类型: AsyncParallelHook<[Compilation]>
  • 参数:

finishMake

在 make 阶段结束后调用。在 make 阶段,Rspack 会以 entry 为起点构建模块依赖图,并使用 loader 处理各个模块,当这个过程完成时会触发此钩子。

  • 类型: AsyncSeriesHook<[Compilation]>
  • 参数:

afterCompile

在 make 阶段结束后 seal 阶段开始前调用,在 seal 阶段会从模块图优化并创建 chunk 图,以生成产物信息。

  • 类型: AsyncSeriesHook<[Compilation]>
  • 参数:

shouldEmit

返回值为一个布尔值,用于决定是否将资源写入到磁盘中。

  • 类型: SyncBailHook<[Compilation]>
  • 参数:

emit

在产物输出到结果目录前执行。

  • 类型: AsyncSeriesHook<[Compilation]>
  • 参数:

afterEmit

输出产物到结果目录后执行。

  • 类型: AsyncSeriesHook<[Compilation]>
  • 参数:

done

当前 Compilation 处理完成时执行。

  • 类型: AsyncSeriesHook<Stats>
  • 参数:
    • Stats: 生成的 Stats 对象

afterDone

当前 Compilation 处理完成且 done 钩子调用之后执行。

  • 类型: SyncHook<Stats>
  • 参数:
    • Stats: 生成的 Stats 对象

failed

当前 Compilation 失败时调用。

  • 类型: SyncHook<[Error]>

invalid

当监听模式下的编译因文件变更而失效时执行。这个 hook 不会被复制到 child compiler 中。

  • 类型: SyncHook<[string | null, number]>
  • 参数:
    • fileName: 失效的文件路径
    • changeTime: 失效的文件修改时间戳

在触发重新编译时,这个 hook 可以用于获取变更的文件路径和修改时间,例如:

compiler.hooks.invalid.tap('MyPlugin', (fileName, changeTime) => {
  console.log(`Changed file: ${fileName}, change time: ${changeTime}`);
});

watchClose

停止监听时调用。

  • 类型: SyncHook<[]>

shutdown

当前 Compiler 关闭时调用。

  • Type: AsyncSeriesHook<[]>