The content of this section is derived from the content of the following links and is subject to the CC BY 4.0 license.
The following contents can be assumed to be the result of modifications and deletions based on the original contents if not specifically stated.
Enable and try out some experimental features.
object
In minor releases, Rspack may make changes to the APIs of these experimental features and provide detailed explanations of these changes in the release notes. So if you are using experimental features, please pay attention to the minor release notes.
boolean
false
Support the new WebAssembly according to the updated specification, it makes a WebAssembly module an async module.
And it is enabled by default when experiments.futureDefaults is set to true
.
boolean
false
Once enabled, Rspack will output ECMAScript module syntax whenever possible. For instance, import()
to load chunks, ESM exports to expose chunk data, among others.
boolean
false
Once enabled, Rspack will enable native CSS support, and CSS related parser and generator options.
module.parser["css/auto"]
module.parser.css
module.parser["css/module"]
module.generator["css/auto"]
module.generator.css
module.generator["css/module"]
Basic example:
boolean
false
Use defaults of the next major Rspack and show warnings in any problematic places.
This option has been deprecated and will be removed in Rspack v2.0.
Top-level await will be always enabled in the future. Please remove this option from your Rspack configuration."
boolean
true
Enable support for Top-level await, Top-level await
can only be used in modules with ModuleType is javascript/esm
.
Enabled by default and can be disabled with this configuration:
This configuration has been deprecated. Please use lazyCompilation instead.
boolean
false
Controls whether to enable the layer feature. Layers can add an identifier prefix to all modules in a subgraph starting from a module in the module graph, to distinguish them from modules in different layers. For example:
The layer
of the index.js
module is by default null
, and its identifier
is ./index.js
. If we set layer = 'client'
for it, its identifier
will become (client)/./index.js
. At this point, the index.js
modules in these two different layers will be treated as distinct modules, because their unique identifier
s are different. As a result, the final output will include the artifacts of both modules.
By default, a module's layer is null
, and it will inherit its parent module's layer. You can add a layer to an entry module using entryOptions.layer
, and you can add a layer to matched modules using module.rule[].layer
. Additionally, you can match based on the parent module's layer using module.rule[].issuerLayer
.
boolean | 'none' | 'safe' | 'advance' | 'advance-silent' | Incremental
'advance-silent'
Whether to enable incremental build, which significantly speeds up rebuilds and HMR by only rebuilding the changed parts. Two configuration ways are provided:
Presets: including boolean | 'none' | 'safe' | 'advance' | 'advance-silent'
false | 'none'
: Disable incremental, and it will not be enabled for any stage.'safe'
: Enable incremental for make
and emitAssets
stages, This is also the current default behavior of Rspack.true | 'advance-silent'
: Enable incremental for all stages to maximize performance for rebuilds and HMR. After these stages become stable in the future, we will make this option the default behavior for Rspack.'advance'
: The same as above, but it will detect cases that are unfriendly to incremental and throw warnings to users (e.g., incorrect configurations). This option can help you to identify potential issues affecting incremental build performance.Detailed object configuration: Incremental
, which allows fine-grained control over whether the incremental is enabled for each stage.
Incremental
Usually, we recommend configuring in the preset way, and the detailed object configuration is only provided to facilitate bug troubleshooting.
Incremental only improves the rebuild performance and have no impact on the initial build. However, when persistent cache is available, initial builds are also treated as rebuilds too, and can benefit from incremental for performance.
The table below shows the results of incremental in different scenarios:
how to build | incremental speed up |
---|---|
hot build | ✅ |
cold build | ❌ |
hot start | ✅ |
cold start | ❌ |
rebuild/HMR | ✅ |
Starting from v1.4.0, Rspack enables incremental builds for all phases by default using 'advance-silent'
mode. In previous versions, it only activated incremental builds for the make
and emitAssets
phases by default with 'safe'
mode.
boolean
false
Enabling this configuration will activate a new multi-threaded code splitting algorithm. If your project includes many dynamic imports and doesn't have cyclic chunks, this can greatly reduce the time spent on the code splitting process.
Enabled by default in versions 1.3.0 to 1.4.8, and disabled by default in version 1.4.9 and later.
When parallelCodeSplitting
is enabled, ensure that 'optimization.removeAvailableModules' is also enabled (this has been enabled by default since version 1.3.0).
This maintains consistency with the previous code splitting algorithm, which enforced removeAvailableModules
internally and ignored the optimization.removeAvailableModules
configuration.
boolean
false
Enable parallel loader execution. You need to manually enable parallel mode for each loader using Rule.use.parallel
. When enabled, the corresponding loaders will be executed in worker threads.
Type: object
Default: See options down below for details
Used to control whether to enable Rspack future default options, check out the details here.
Type:
Used to inject the currently used Rspack information into the generated asset:
version
: Used to specify the Rspack version, defaults to the version
field in @rspack/core/package.json
.bundler
: Used to specify the name of the packaging tool, defaults to rspack
.force
: Whether to force the injection of Rspack information, which will be added to chunk as a runtime module, and defaults to true
to force injection. An array can be used to select the items to be forced injected.The default injection can be disabled by setting force
to false
. Then injection will only occur when __rspack_version__
and __rspack_unique_id__
are detected in the code:
__rspack_version__
: Inject version information.__rspack_unique_id__
: Inject the unique ID of the bundler.Type: ExperimentCacheOptions
Default: production mode is false
, development mode is true
Control experimental caching behavior. This will only work if config.cache is set to true
.
In production mode, the default value of config.cache
is false
, which will cause this configuration item invalid. It is recommended to directly configure config.cache
to true
.
Configuring experiment.cache
to false
to disable cache, which is no different from configuring the config.cache to false
.
Configuring experiment.cache
to true
or { "type": "memory" }
to enable memory cache.
Configuring experiment.cache
to { "type": "persistent" }
to enable persistent cache.
Type: string[]
Default: []
cache.buildDependencies
is an array of files containing build dependencies, Rspack will use the hash of each of these files to invalidate the persistent cache.
It's recommended to set cache.buildDependencies
: [__filename] in your rspack configuration to get the latest configuration.
Type: string
Default: ""
Cache versions, different versions of caches are isolated from each other.
In addition to buildDependencies and version configurations that affect persistent cache invalidation, Rspack also invalidates persistent cache when the following fields change.
Configure snapshot strategy. Snapshot is used to determine which files have been modified during shutdown. The following configurations are supported:
Type: (RegExp | string)[]
Default: []
An array of paths to immutable files, changes to these paths will be ignored during hot restart.
Type: (RegExp | string)[]
Default: [/\/node_modules\//]
An array of paths managed by the package manager. During hot start, it will determine whether to modify the path based on the version in package.json.
Type: (RegExp | string)[]
Default: []
Specifies an array of paths in snapshot.managedPaths
that are not managed by the package manager
Type: { type: 'filesystem', directory: string }
Default: { type: 'filesystem', directory: 'node_modules/.cache/rspack' }
Configure cache storage. Currently only file system storage is supported. The cache directory can be set through directory
. The default is node_modules/.cache/rspack
.
Rspack will generate a cache folder in the storage.directory
based on config.name, config.mode, the file contents in buildDependencies and version.
Rspack will automatically clean up cache folders that have not been accessed for a long time (7 days) at startup.
The Rspack cache configuration is different from the webpack cache configuration. You can refer to the following steps to migrate the webpack cache configuration.
cache.buildDependencies
cache.version
and cache.name
snapshot
cache.cacheDirectory
Sample migration code:
HttpUriOptions
undefined
After enabling this feature, Rspack can build remote resources that start with the http(s):
protocol. Rspack will download the resources to the local machine and then bundle them.
By default, Rspack will generate rspack.lock
and rspack.lock.data
in the context folder as the locations of the Lockfile and the cache respectively. You can also configure them through lockfileLocation
and cacheLocation
.
You should commit the files at lockfileLocation
and cacheLocation
to the version control system so that no network requests will be made during the production build.
For example:
With this feature enabled, you can import modules directly from URLs:
false | RegExp[]
false
By default, Rspack reads files from disk using a native file system. However, it is possible to change the file system using a different kind of file system. To accomplish this, one can change the inputFileSystem. For example, you can replace the default inputFileSystem with memfs to virtual Modules.
But due to the overheads calling file system implemented in Node.js side, it will slow down Rspack a lot.
So we make a trade off by providing the useInputFileSystem
config, to tell rspack to read file from the native file system or from modified inputFileSystem.
In below example, you can simply replace the default input file system to any file system satisfied the InputFileSystem
interface.
The replacing of compiler.inputFileSystem
will only take effect before compiler.run
called; Replacing after compiler.run
will not take effect.
More detailed case can be found here
When access to virtual_entry.js
and src/another_virtual.js
which match the regular expressions of experiments.useInputFileSystem
,
Rspack will use the input file system wrapped by VirtualModulesPlugin
; other than that, src/disk_file.js
will be accessed by the native file system.
boolean
false
Whether to enable the experimental feature module.parser.javascript.inlineConst
, which will perform cross-module inline optimization for constant exports in leaf modules of the module graph.
A common optimization case is constants.js
, for example:
Please refer to inline const example
boolean
false
The switch for the experimental feature builtin:swc-loader rspackExperiments.collectTypeScriptInfo.exportedEnum
. Must be enabled to use the feature.
Please refer to inline enum example for more details.
boolean
false
The switch for the experimental feature module.parser.javascript.typeReexportsPresence
. Must be enabled to use the feature.
Please refer to type reexports presence example for more details.
boolean
false
By default, Rspack uses Watchpack to monitor file changes, which generally works well in most scenarios. However, in certain specific environments, issues may arise. For example, Watchpack may experience performance problems when there are a large number of file changes. More detail see: Watchpack issue #233.
If you encounter performance issues with the default watcher, you can try enabling nativeWatcher.
After enabling nativeWatcher
, Rspack will use the Rust Native file system to monitor file changes, enabling incremental file change detection, which provides better performance and stability.
boolean
false
Whether to skip building unused re-export modules in side-effect-free barrel files to optimize build performance.
A side-effect-free module is a module that meets one of the following conditions:
package.json
file of its package declares "sideEffects": false
, see Side effects analysisfalse
through the module.rule.sideEffects optionCan this also supports CommonJS?
Yes, theoretically this can also support CommonJS, but before that we need to improve Rspack's CJS tree shaking first, the static analyze part specifically, so currently we will only support ESM, and support CJS in the future PR.
Why depend on "sideEffects": false
in package.json, can Rspack automatically analyze a module is side effects free or not?
Rspack has the ability to analyze a module is side effects free or not of course, it's already used by optimization.sideEffects
to tree shaking side effects free modules. But these analyzed modules still require checking whether their dependencies have side effects - only when all dependencies are also side effects free can the module be considered truly side effects free. However, during the make phase, dependencies must first be built before their side effects can be analyzed, and the lazyBarrel
is intend to avoid to build those dependencies. "sideEffects": false
in package.json or module.rule.sideEffects
doesn't require dependency checking, as it signifies the entire package is side effects free. Therefore, lazyBarrel
can only rely on this marker rather than automatic analysis.
So export * from "./x"
is not a problem any more?
No, export * from "./x"
is still a bad practice for your build performance, lazyBarrel
won't build the star re-export only when you import a specifier, and the side effects free barrel file's named exports contains the specifier (export { x as A } from "./a";
, export * as A from "./a"
, export { a, b }
, export const A
, export default A (the name is default)
), which means the star re-export is not used. So Rspack will still build the star re-export if:
For more details, see RFC: Lazy make for reexports in side effects free barrel file