Compiler
Compiler 对象方法
run
启动一次编译流程,编译流程完成或因错误中止时触发回调。
run(callback: (
error: Error, // 仅包含构建器相关错误,如配置错误等,不包含编译错误
stats: Stats, // 编译过程中产生的信息
) => void): void;
WARNING
这个 API 一次仅支持一个编译。请在 compiler.run
回调中调用 compiler.close
,并等待它完成后再次执行 compiler.run
。并发编译将破坏输出文件。
compiler.run((err, stats) => {
// 处理构建器错误
handlerCompilerError(err);
// 处理编译错误
handlerModuleErrors(stats.toJson().errors);
// 处理构建结果
handleBuildResult(stats);
// 结束本次编译
compiler.close(closeErr => {
// 重新启动一次编译
compiler.run((err, stats) => {});
});
});
watch
启动持续监听,在文件变化后自动启动一次编译流程,每次编译流程完成或因错误中止时触发回调。
watch(
watchOptions: WatchOptions, // 启动监听的配置
handler: (error: Error, stats: Stats) => void // 每次编译流程完成或因错误中止时触发回调
): Watching; // 监听控制实例
警告
这个 API 一次仅支持一个监听。请在 compiler.watch
回调中调用 compiler.close
,并等待它完成后再次执行 compiler.watch
。并发编译将破坏输出文件。
const watching = compiler.watch(
{
aggregateTimeout: 300,
poll: undefined,
},
(err, stats) => {
// 处理构建结果
handleBuildResult(stats);
},
);
Watching 对象提供如下方法:
watch
:
- 类型:
(files: string[], dirs: string[], missing: string[]): void
- 用途: 添加需要被监听的文件和目录
invalidate
:
- 类型:
(callback: () => void): void
- 用途: 立即结束本轮监听,并以当前记录的文件变更启动一次编译流程,不会停止整个监听器。
suspend
:
- 类型:
(): void
- 用途: 进入仅监听状态,不会启动新的编译流程
resume
:
- 类型:
(): void
- 用途: 退出仅监听状态,并以当前记录的文件变更启动一次编译流程
close
:
- 类型:
(callback: () => void): void
- 用途: 停止整个监听器
compile
创建 Compilation 并执行编译流程,是 compiler.run
和 compiler.watch
依赖的底层方法。
compile(
callback: (compilation: Compilation) => void // 编译流程完成后回调
): void
close
关闭当前构建器,在此期间处理低优先级任务,如缓存等。
close(
callback: (err: Error) => void // 关闭完成后回调
): void;
getInfrastructureLogger
创建一个不与 Compilation 关联的全局日志对象,用于打印全局信息。
getInfrastructureLogger(name: string): Logger;
getCache
创建一个缓存对象,以在构建流程中共享数据。
getCache(name: string): CacheFacade;
purgeInputFileSystem
停止对文件系统的读取循环,它内部包含定时器,可能会导致 compiler.close
后进程依然无法退出。
purgeInputFileSystem(): void;
createChildCompiler
允许在 Rspack 中运行另一个 Rspack 实例。但是,子编译器会应用不同的设置和配置。他会从父 Compiler(或者顶级 Compiler)中复制所有的钩子(hook)和插件(plugin),并且创建一个子 Compiler 实例。 返回值为创建好的 Compiler 实例。
createChildCompiler(
compilation: Compilation,
compilerName: string,
compilerIndex: number,
outputOptions: OutputOptions,
plugins: RspackPlugin[]
): Compiler;
runAsChild
启动子 Compiler 的构建流程,会进行一次完整的构建流程并生成产物。
runAsChild(
callback(
err: Error, // 子 Compiler 执行的构建器错误
entries: Chunk[], // 子 Compiler 执行产生的 Chunk 信息
compilation: Compilation, // 子 Compiler 所创建的 Compilation 对象
): void;
): void;
isChild
当前是否为子 Compiler。
Compiler 对象属性
hooks
详见 Compiler 钩子
rspack
获取当前的 @rspack/core
的导出,以此来获取关联的内部对象。当你无法直接引用 @rspack/core
,或者存在多个 Rspack 实例时很有用。
一个常见的例子是在 Rspack 插件中获取 sources 对象:
const { RawSource } = compiler.rspack.sources;
const source = new RawSource('console.log("Hello, world!");');
webpack
等同于 compiler.rspack
,该属性用于兼容 webpack 插件。
如果你开发的 Rspack 插件需要兼容 webpack,可以使用该属性代替 compiler.rspack
。
console.log(compiler.webpack === compiler.rspack); // true
name
获取名称:
- 对于根 Compiler 等同于
name
- 对于子 Compiler 时为
createChildCompiler
传入的值
- 对于 MultiCompiler 且为 KV 形式时为 Key 的值
context
当前的项目根目录:
- 通过
new Compiler
时为传入的值
- 通过
rspack({})
等创建时同于 context 配置
root
获取根 Compiler 实例。
options
- 类型:
RspackOptionsNormalized
获取根 Compiler 所使用的完整构建配置。
watchMode
是否通过 watch 启动。
watching
获取 watch 启动下的监听控制对象,详见 watch 方法
running
当前是否正在执行构建流程。
inputFileSystem
获取用于从文件系统读取的代理对象,其内部有缓存等优化,以降低对同一文件的重复读取。
outputFileSystem
获取用于输出到文件系统的代理对象,默认使用 fs
。
watchFileSystem
获取用于持续监听文件/目录变化的代理对象,提供一个 watch
方法来启动监听,并在回调中传入变更和移除的项目。
MultiCompiler
MultiCompiler
可以让 Rspack 同时执行多份配置。如果传给 Rspack 的 JavaScript API 的配置为多个配置对象构成的数组,Rspack 会创建多个 compiler 实例,并且在所有 compiler 执行完毕后调用回调方法。
const rspack = require('@rspack/core');
rspack(
[
{ entry: './index1.js', output: { filename: 'bundle1.js' } },
{ entry: './index2.js', output: { filename: 'bundle2.js' } },
],
(err, stats) => {
process.stdout.write(stats.toString() + '\n');
},
);
也可以通过 new MultiCompiler
创建:
const compiler1 = new Compiler({
/* */
});
const compiler2 = new Compiler({
/* */
});
new MultiCompiler([compiler1, compiler2]);
new MultiCompiler([compiler1, compiler2], {
parallelism: 1, // 控制最大并行数量
});
new MultiCompiler({
name1: compiler1,
name2: compiler2,
});
MultiCompiler 也提供了部分 Compiler 的方法和属性。
MultiCompiler 方法
setDependencies
指定 compiler 之间的依赖关系,以 compiler.name
作为标识,以此保证 compiler 执行顺序。
setDependencies(compiler: Compiler, dependencies: string[]): void;
validateDependencies
检测 compiler 之间的依赖关系是否合法,若成环或缺失会触发回调。
validateDependencies(
callback: (err: Error) => void; // 错误时回调,若多个错误会回调多次
): boolean
run
根据依赖关系执行各个 compiler 的 run
方法,启动编译流程。
run(callback: (err: Error, stats: MultiStats) => void): void;
watch
根据依赖关系执行各个 compiler 的 watch
方法,启动持续监听,在文件变化后自动启动一次编译流程。
watch(
watchOptions: WatchOptions,
handler: (err: Error, stats: MultiStats) => void,
): MultiWatching
close
执行各个 compiler 的 close
方法,关闭构建器,并在此期间处理低优先级任务,如缓存等。
close(callback: (err: Error) => void): void;
purgeInputFileSystem
执行各个 compiler 的 purgeInputFileSystem
,停止对文件系统的读取循环。
purgeInputFileSystem(): void;
getInfrastructureLogger
创建一个不与 Compilation 关联的全局日志对象,用于打印全局信息。
getInfrastructureLogger(name: string): Logger;
等同于 compilers[0].getInfrastructureLogger()
MultiCompiler 属性
compilers
获取包含的所有 Compiler 实例。
options
只读
- 类型:
RspackOptionsNormalized[]
获取各个 Compiler 所使用的完整构建配置。
inputFileSystem
只写
为各个 Compiler 设置用于从文件系统读取的代理对象。
outputFileSystem
只写
为各个 Compiler 设置用于输出到文件系统的代理对象。
watchFileSystem
只写
为各个 Compiler 设置用于持续监听文件/目录变化的代理对象。
running
当前是否正在执行构建流程。