Compiler
Compiler 是 Rspack 内部的核心对象,当你调用 Rspack 的 JavaScript API 或 CLI 时,都会创建一个 Compiler 实例。
它提供了 run 和 watch 等方法来启动构建,同时暴露了丰富的 Compiler 钩子,使 Rspack 插件能够干预构建的各个阶段。
Compiler 对象方法
run
启动一次编译流程,编译流程完成或因错误中止时触发回调。
如果你需要多次调用同一个 compiler 对象的 run 方法,请注意以下事项:
- 该 API 不支持并发编译操作。在启动新的编译任务之前,必须在
compiler.run的回调函数中调用compiler.close()并等待其执行完成,之后才能进行下一次compiler.run调用。若同时运行多个编译进程,可能会导致输出文件产生不可预期的结果。 - Rspack 的缓存失效检测机制依赖于
modifiedFiles和removedFiles参数。在启用缓存的情况下,如果你使用了自定义的 watcher 来监听文件变化,需要通过options参数将这两个值传递给 Rspack。
watch
启动持续监听,在文件变化后自动启动一次编译流程,每次编译流程完成或因错误中止时触发回调。
这个 API 一次仅支持一个监听。请在 compiler.watch 回调中调用 compiler.close,并等待它完成后再次执行 compiler.watch。并发编译将破坏输出文件。
Watching 对象提供如下方法:
watch:- 类型:
(files: Iterable<string>, dirs: Iterable<string>, missing: Iterable<string>): void - 用途: 添加需要被监听的文件和目录
- 类型:
invalidate:- 类型:
(callback: () => void): void - 用途: 立即结束本轮监听,并以当前记录的文件变更启动一次编译流程,不会停止整个监听器。
- 类型:
suspend:- 类型:
(): void - 用途: 进入仅监听状态,不会启动新的编译流程
- 类型:
resume:- 类型:
(): void - 用途: 退出仅监听状态,并以当前记录的文件变更启动一次编译流程
- 类型:
close:- 类型:
(callback: () => void): void - 用途: 停止整个监听器
- 类型:
close
关闭当前构建器,在此期间处理低优先级任务,如缓存等。
getInfrastructureLogger
创建一个不与 Compilation 关联的全局日志对象,用于打印全局信息。
getCache
创建一个缓存对象,以在构建流程中共享数据。
purgeInputFileSystem
停止对文件系统的读取循环,它内部包含定时器,可能会导致 compiler.close 后进程依然无法退出。
createChildCompiler
创建并返回一个子 Compiler,可以为其指定输出选项和额外插件。钩子和插件的继承规则见 compilation.createChildCompiler。
runAsChild
启动子 Compiler 的构建流程,会进行一次完整的构建流程并生成产物。
isChild
当前是否为子 Compiler。
Compiler 对象属性
hooks
详见 Compiler 钩子
rspack
- 类型:
typeof rspack
获取当前的 @rspack/core 的导出,以此来获取关联的内部对象。当你无法直接引用 @rspack/core,或者存在多个 Rspack 实例时很有用。
一个常见的例子是在 Rspack 插件中获取 sources 对象:
webpack
- 类型:
typeof rspack
等同于 compiler.rspack,该属性用于兼容 webpack 插件。
如果你开发的 Rspack 插件需要兼容 webpack,可以使用该属性代替 compiler.rspack。
name
- 类型:
string
获取名称:
- 对于根 Compiler 等同于
name - 对于子 Compiler 时为
createChildCompiler传入的值 - 对于 MultiCompiler 且为 KV 形式时为 Key 的值
context
当前的项目根目录:
- 通过
new Compiler时为传入的值 - 通过
rspack({})等创建时同于 context 配置
root
- 类型:
Compiler
获取根 Compiler 实例。
options
- 类型:
RspackOptionsNormalized
获取根 Compiler 所使用的完整构建配置。
target
- 类型:
从 target 配置中推断出。这对需要访问目标环境信息的插件和 loader 作者非常有用。
targets: 包含平台名称及其版本的对象(例如:{ 'chrome': '87', 'firefox': '78', 'node': '18' })。esVersion: ECMAScript 版本号(例如:5,2015,2022)。
例如,在插件中访问 compiler.target:
或是在自定义 loader 中访问 compiler.target:
watchMode
- 类型:
boolean
是否通过 watch 启动。
watching
- 类型:
Watching
获取 watch 启动下的监听控制对象,详见 watch 方法
running
- 类型:
boolean
当前是否正在执行构建流程。
inputFileSystem
- 类型:
InputFileSystem
获取用于从文件系统读取的代理对象,其内部有缓存等优化,以降低对同一文件的重复读取。
outputFileSystem
- 类型:
OutputFileSystem
获取用于输出到文件系统的代理对象,默认使用 fs。
watchFileSystem
- 类型:
WatchFileSystem
获取用于持续监听文件/目录变化的代理对象,提供一个 watch 方法来启动监听,并在回调中传入变更和移除的项目。
MultiCompiler
MultiCompiler 可以让 Rspack 同时执行多份配置。如果传给 Rspack 的 JavaScript API 的配置为多个配置对象构成的数组,Rspack 会创建多个 compiler 实例,并且在所有 compiler 执行完毕后调用回调方法。
也可以通过 new MultiCompiler 创建:
MultiCompiler 也提供了部分 Compiler 的方法和属性。
MultiCompiler 方法
setDependencies
指定 compiler 之间的依赖关系,以 compiler.name作为标识,以此保证 compiler 执行顺序。
validateDependencies
检测 compiler 之间的依赖关系是否合法,若成环或缺失会触发回调。
run
根据依赖关系执行各个 compiler 的 run 方法,启动编译流程。
watch
根据依赖关系执行各个 compiler 的 watch 方法,启动持续监听,在文件变化后自动启动一次编译流程。
close
执行各个 compiler 的 close 方法,关闭构建器,并在此期间处理低优先级任务,如缓存等。
purgeInputFileSystem
执行各个 compiler 的 purgeInputFileSystem,停止对文件系统的读取循环。
getInfrastructureLogger
创建一个不与 Compilation 关联的全局日志对象,用于打印全局信息。
等同于
compilers[0].getInfrastructureLogger()
MultiCompiler 属性
compilers
- 类型:
Compiler[]
获取包含的所有 Compiler 实例。
options
只读- 类型:
RspackOptionsNormalized[]
获取各个 Compiler 所使用的完整构建配置。
inputFileSystem
只写- 类型:
InputFileSystem
为各个 Compiler 设置用于从文件系统读取的代理对象。
outputFileSystem
只写- 类型:
OutputFileSystem
为各个 Compiler 设置用于输出到文件系统的代理对象。
watchFileSystem
只写- 类型:
WatchFileSystem
为各个 Compiler 设置用于持续监听文件/目录变化的代理对象。
running
- 类型:
boolean
当前是否正在执行构建流程。

