website/docs/en/api/javascript-api/compiler.mdx
import StatsType from '../../types/stats.mdx'; import CompilerType from '../../types/compiler.mdx'; import LoggerType from '../../types/logger.mdx'; import CacheType from '../../types/cache.mdx'; import ChunkType from '../../types/cache.mdx'; import InputFileSystemType from '../../types/input-file-system.mdx'; import OutputFileSystemType from '../../types/output-file-system.mdx'; import WatchFileSystemType from '../../types/watch-file-system.mdx'; import CompilationType from '../../types/compilation.mdx'; import { Collapse, CollapsePanel } from '@components/Collapse'; import { Badge } from '@theme';
The Compiler is a core object in Rspack. A Compiler instance is created when you call Rspack's JavaScript API or CLI.
It provides methods like run and watch to start builds, and exposes Compiler hooks that allow plugins to hook into different stages of the build process.
Starts a compilation and calls the callback when compilation completes or fails with an error.
function run(
callback: (
error: Error, // Only includes compiler-related errors, such as configuration errors, not compilation errors
stats: Stats, // Detailed information generated during compilation
) => void,
options?: {
modifiedFiles?: ReadonlySet<string>; // Modified files included in this compilation
removedFiles?: ReadonlySet<string>; // Deleted files included in this compilation
},
): void;
:::warning
If you need to call the run method on the same compiler object multiple times, note the following:
compiler.close() in the compiler.run callback and wait for it to finish before calling compiler.run again. Running multiple compilations simultaneously can produce unexpected output files.modifiedFiles and removedFiles parameters. When caching is enabled and you're using a custom watcher, pass these values to Rspack via the options parameter.:::
compiler.run((err, stats) => {
// Deal with the compiler errors
handleCompilerError(err);
// Deal with the compilation errors
handleModuleErrors(stats.toJson().errors);
// Deal with the result
handleBuildResult(stats);
// End this compilation
compiler.close((closeErr) => {
// Start a new compilation
compiler.run((err, stats) => {});
});
});
Watches files and directories, starting a compilation after they change. Calls the handler after each compilation completes or fails.
function watch(
watchOptions: WatchOptions, // Options for starting the watcher
handler: (error: Error, stats: Stats) => void, // Callback after each compilation
): Watching; // Watching controller
:::warning Warning
This API only supports one compilation at a time. Call compiler.close in the compiler.watch callback and wait for it to finish before calling compiler.watch again. Concurrent compilations will corrupt output files.
:::
const watching = compiler.watch(
{
aggregateTimeout: 300,
poll: undefined,
},
(err, stats) => {
// Deal with the result
handleBuildResult(stats);
},
);
The Watching object provides the following methods:
watch:
(files: string[], dirs: string[], missing: string[]): voidinvalidate:
(callback: () => void): voidsuspend:
(): voidresume:
(): voidclose:
(callback: () => void): void> See [watch options](/config/watch#watchoptions) for more details.
Closes the compiler and handles low-priority tasks like caching.
function close(
callback: (err: Error) => void, // Callback after closing
): void;
Create a logger object that is not associated with any compilation, which is used to print global logs.
function getInfrastructureLogger(name: string): Logger;
Creates a cache object to share data during the build process.
function getCache(name: string): CacheFacade;
Stops the input file system read loop, which contains an internal timer that may prevent the process from exiting after calling compiler.close.
function purgeInputFileSystem(): void;
Runs another Rspack instance inside Rspack as a child compiler with different settings. Copies all hooks and plugins from the parent (or top-level) compiler and creates a child Compiler instance. Returns the created Compiler.
function createChildCompiler(
compilation: Compilation,
compilerName: string,
compilerIndex: number,
outputOptions: OutputOptions,
plugins: RspackPlugin[],
): Compiler;
> See [output options](/config/output) for more details.
> See [plugins options](/config/plugins) for more details
Runs the child compiler, performing a complete compilation and generating assets.
function runAsChild(
callback(
err: Error, // Error related to the child compiler
entries: Chunk[], // Chunks generated by the child compiler
compilation: Compilation, // The compilation created by the child compiler
): void;
): void;
Whether this compiler is a child compiler.
function isChild(): boolean;
See compiler hooks for more details.
typeof rspackGet the exports of @rspack/core to obtain the associated internal objects. This is especially useful when you cannot directly reference @rspack/core or there are multiple Rspack instances.
A common example is accessing the sources object in a Rspack plugin:
const { RawSource } = compiler.rspack.sources;
const source = new RawSource('console.log("Hello, world!");');
typeof rspackEquivalent to compiler.rspack, this property is used for compatibility with webpack plugins.
If the Rspack plugin you are developing needs to be webpack compatible, you can use this property instead of compiler.rspack.
console.log(compiler.webpack === compiler.rspack); // true
stringGet the name:
name.createChildCompiler.Current project root directory:
new Compiler, it is the value passed in.rspack({}), it is context configuration.CompilerGet the root of the child compiler tree.
RspackOptionsNormalizedGet the full options used by this compiler.
type CompilerTarget = {
// ECMAScript version
esVersion?: number | null;
// Platform names with versions
targets?: Record<string, string> | null;
};
Get the target information derived from the target configuration. This is useful for plugin and loader authors who need to access the target environment information.
targets: An object of platform names and their versions (e.g., { 'chrome': '87', 'firefox': '78', 'node': '18' }).esVersion: The ECMAScript version number (e.g., 5, 2015, 2022).For example, access compiler.target in a plugin:
class ExamplePlugin {
apply(compiler) {
compiler.hooks.initialize.tap('ExamplePlugin', () => {
const { targets, esVersion } = compiler.target ?? {};
console.log(targets, esVersion);
});
}
}
Or access compiler.target in a custom loader:
export default function myLoader(source) {
const options = this.getOptions();
const compilerTarget = this._compiler.target ?? {};
// Use user-specified targets, or fall back to Rspack's derived targets
const targets = options.targets ?? compilerTarget.targets;
// Fall back to Rspack's derived ECMAScript version when needed
const ecmaVersion = options.ecmaVersion ?? compilerTarget.esVersion;
// Use targets for transformation...
return transform(source, { targets, ecmaVersion });
}
booleanWhether started through compiler.watch.
WatchingGet the watching object, see watch method for more details.
booleanWhether the compilation is currently being executed.
InputFileSystemGet the proxy object used for reading from the file system, which has optimizations such as caching inside to reduce duplicate reading of the same file.
<Collapse> <CollapsePanel className="collapse-code-panel" header="InputFileSystem.ts" key="InputFileSystem" > <InputFileSystemType /> </CollapsePanel> </Collapse>OutputFileSystemGet the proxy object used for writing to the file system, fs by default.
WatchFileSystemGet the proxy object used for watching files or directories changes, which provides a watch method to start watching, and passes in the changed and removed items in the callback.
The MultiCompiler module allows Rspack to run multiple configurations in separate compilers. If the options parameter in the Rspack's JavaScript API is an array of options, Rspack applies separate compilers and calls the callback after all compilers have been executed.
import { rspack } from '@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');
},
);
It can also be created through new MultiCompiler:
const compiler1 = new Compiler({
/* */
});
const compiler2 = new Compiler({
/* */
});
new MultiCompiler([compiler1, compiler2]);
new MultiCompiler([compiler1, compiler2], {
parallelism: 1, // the maximum number of parallel compilers
});
new MultiCompiler({
name1: compiler1,
name2: compiler2,
});
MultiCompiler also provides some methods and attributes of the Compiler.
Specify the dependency relationship between the compilers, using compiler.name as the identifier, to ensure the execution order of the compilers.
setDependencies(compiler: Compiler, dependencies: string[]): void;
Check whether the dependency relationship between the compilers is legal. If there is a cycle or a missing dependency, it will trigger the callback.
validateDependencies(
callback: (err: Error) => void; // callback when there is an error
): boolean
Execute the run method of each compiler according to the dependency relationship to start the compilation process.
run(
callback: (err: Error, stats: MultiStats) => void,
options?: {
modifiedFiles?: ReadonlySet<string>; // Modified files included in this compilation
removedFiles?: ReadonlySet<string>; // Deleted files included in this compilation
},
): void;
Execute the watch method of each compiler according to the dependency relationship to start watching, and start a compilation process after the file changes.
function watch(
watchOptions: WatchOptions | WatchOptions[],
handler: (err: Error, stats: MultiStats) => void,
): MultiWatching;
Execute the close method of each compiler to close them, and handle low-priority tasks such as caching during this period.
close(callback: (err: Error) => void): void;
Execute the purgeInputFileSystem of each compiler to stop the read loop of the file system
purgeInputFileSystem(): void;
Create a logger object that is not associated with any compilation, which is used to print global logs.
getInfrastructureLogger(name: string): Logger;
<Collapse> <CollapsePanel className="collapse-code-panel" header="Logger.ts" key="Logger" > <LoggerType /> </CollapsePanel> </Collapse>Same with
compilers[0].getInfrastructureLogger()
Compiler[]Get all included compilers.
<Collapse> <CollapsePanel className="collapse-code-panel" header="Compiler.ts" key="Compiler" > <CompilerType /> </CollapsePanel> </Collapse>RspackOptionsNormalized[]Get all the full options used by the compilers.
InputFileSystemSet the proxy object used for reading from the file system for each compiler.
<Collapse> <CollapsePanel className="collapse-code-panel" header="InputFileSystem.ts" key="InputFileSystem" > <InputFileSystemType /> </CollapsePanel> </Collapse>OutputFileSystemSet the proxy object used for writing from the file system for each compiler.
<Collapse> <CollapsePanel className="collapse-code-panel" header="OutputFileSystem.ts" key="OutputFileSystem" > <OutputFileSystemType /> </CollapsePanel> </Collapse>WatchFileSystemSet the proxy object used for watching files or directories changes for each compiler.
<Collapse> <CollapsePanel className="collapse-code-panel" header="WatchFileSystem.ts" key="WatchFileSystem" > <WatchFileSystemType /> </CollapsePanel> </Collapse>booleanWhether the compilation is currently being executed.