website/docs/en/config/module-parser.mdx
import { ApiMeta, Stability } from '../../../components/ApiMeta'; import PropertyType from '@components/PropertyType'; import WebpackLicense from '@components/WebpackLicense';
<WebpackLicense from="https://webpack.docschina.org/configuration/module/" />module.parser controls how Rspack reads modules after they are resolved. It affects how dependencies are collected, how syntax such as import.meta and dynamic import() is interpreted, and other parsing behavior for each module type.
Object{}Use module.parser to define parser options for each module type.
Available parser option groups:
asset: Asset parser optionsjavascript, javascript/auto, javascript/dynamic, javascript/esm: JavaScript parser optionsjson: JSON parser optionscss, css/auto, css/global, css/module: CSS parser optionsexport default {
module: {
parser: {
// Parser options for asset modules
asset: {
dataUrlCondition: {
maxSize: 16192,
},
},
// Parser options for javascript modules
javascript: {
dynamicImportMode: 'lazy',
dynamicImportPrefetch: false,
dynamicImportPreload: false,
url: true,
importMeta: true,
},
// Parser options for CSS modules
css: {
namedExports: true,
},
// Parser options for css/auto modules
'css/auto': {
namedExports: true,
},
// Parser options for css/module modules
'css/module': {
namedExports: true,
},
},
},
};
Parser options for asset modules.
export default {
module: {
parser: {
asset: {
// options
},
},
},
};
{ maxSize: number }{ maxSize: 8096 }If the module size is less than or equal to maxSize, then the module will be Base64 encoded, otherwise a file will be created. This option can be used only for Asset modules.
export default {
module: {
parser: {
asset: {
dataUrlCondition: {
// Modules' size smaller than or equal to 4KB will be Base64 encoded.
maxSize: 4 * 1024,
},
},
},
},
};
Parser options for javascript modules.
export default {
module: {
parser: {
javascript: {
// options
},
},
},
};
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'false' }]} /> <ApiMeta addedVersion="1.5.6" />
Enable Magic comments support for CommonJS.
export default {
module: {
parser: {
javascript: {
commonjsMagicComments: true,
},
},
},
};
Note that only webpackIgnore comment is supported at the moment:
const x = require(/* webpackIgnore: true */ 'x');
<PropertyType type="'lazy' | 'eager' | 'weak' | 'lazy-once'" defaultValueList={[{ defaultValue: "'lazy'" }]} />
Specifies global mode for dynamic import, see webpackMode for more details.
export default {
module: {
parser: {
javascript: {
dynamicImportMode: 'eager',
},
},
},
};
<PropertyType type="boolean | number" defaultValueList={[{ defaultValue: 'false' }]} />
Specifies global prefetch for dynamic import, see webpackPrefetch for more details.
export default {
module: {
parser: {
javascript: {
dynamicImportPrefetch: true,
},
},
},
};
<PropertyType type="boolean | number" defaultValueList={[{ defaultValue: 'false' }]} />
Specifies global preload for dynamic import, see webpackPreload for more details.
export default {
module: {
parser: {
javascript: {
dynamicImportPreload: true,
},
},
},
};
<PropertyType type="'low' | 'high' | 'auto'" defaultValueList={[{ defaultValue: "'auto'" }]} />
Specifies global fetchPriority for dynamic import, see webpackFetchPriority for more details.
export default {
module: {
parser: {
javascript: {
dynamicImportFetchPriority: 'high',
},
},
},
};
<PropertyType type="true | false | 'relative' | 'new-url-relative'" defaultValueList={[{ defaultValue: 'true' }]} />
Enable parsing of new URL() syntax.
true: Generate absolute URLs that include the root URL (default behavior).'relative': Generate relative URLs without the root URL.'new-url-relative': Generate static relative URLs that are replaced at compile-time with the correct public path.When using 'new-url-relative', Rspack generates relative URLs that will be replaced at compile-time with the correct public path:
export default {
module: {
parser: {
javascript: {
url: 'new-url-relative',
},
},
},
};
new URL('./icon.svg', import.meta.url);
// would become ๐
new URL('./icon[hash].svg', import.meta.url);
When using 'relative', Rspack generates runtime code to calculate relative URLs for new URL() syntax, i.e., there's no base URL included in the result URL:
export default {
module: {
parser: {
javascript: {
url: 'relative',
},
},
},
};
<!-- with 'relative' -->
<!-- without 'relative' -->
<PropertyType type="boolean | undefined" defaultValueList={[{ defaultValue: 'true' }]} />
Enable warnings for full dynamic dependencies (import(variable)).
export default {
module: {
parser: {
javascript: {
exprContextCritical: false,
},
},
},
};
<PropertyType type="boolean | undefined" defaultValueList={[{ defaultValue: 'false' }]} />
Enable warnings for partial dynamic dependencies (import("./path/to/" + variable)).
export default {
module: {
parser: {
javascript: {
wrappedContextCritical: false,
},
},
},
};
<PropertyType type="boolean | undefined" defaultValueList={[{ defaultValue: 'true' }]} />
Enable warnings when using the require function in a non-statically-analyzable way (require(variable)).
export default {
module: {
parser: {
javascript: {
unknownContextCritical: false,
},
},
},
};
<PropertyType type="RegExp | undefined" defaultValueList={[{ defaultValue: '/.*/' }]} />
Set a regular expression to match wrapped dynamic dependencies.
export default {
module: {
parser: {
javascript: {
wrappedContextRegExp: /\.js$/,
},
},
},
};
boolean | 'preserve-unknown''preserve-unknown'; otherwise, it is trueControl whether Rspack parses and replaces import.meta in source code. Available values:
"preserve-unknown": Known import.meta properties are statically analyzed at compile-time, other properties are preserved and evaluated at runtime.true: All import.meta properties are statically analyzed at compile-time.false: All import.meta properties are evaluated at runtime.export default {
module: {
parser: {
javascript: {
importMeta: false,
},
},
},
};
<PropertyType type="'error' | 'warn' | 'auto' | false" defaultValueList={[{ defaultValue: "'error'" }]} />
Warn or error for using non-existent exports and conflicting re-exports.
"error": Report errors."warn": Report warnings."auto": Depending on whether the module is a strict ESM, give an error if it is, otherwise give a warning.false: Disable this feature.export default {
module: {
parser: {
javascript: {
exportsPresence: 'auto',
},
},
},
};
Warn or error for using non-existent exports, defaulting to the configuration of module.parser.javascript.exportsPresence.
export default {
module: {
parser: {
javascript: {
importExportsPresence: 'error',
},
},
},
};
Warn or error for conflicting re-exports, defaulting to the configuration of module.parser.javascript.exportsPresence.
export default {
module: {
parser: {
javascript: {
reexportExportsPresence: 'error',
},
},
},
};
'no-tolerant' | 'tolerant' | 'tolerant-no-check''no-tolerant'Controls error tolerance for type re-exports, commonly seen in these two scenarios:
// case 1:
export { TypeA } from './types';
// case 2:
import { TypeB } from './types';
export { TypeB };
When re-exporting types, since TypeA and TypeB are types but used in value namespace (export {}), Rspack will report warnings:
WARNING in ./re-exports.ts
โ ESModulesLinkingWarning: export 'TypeA' (reexported as 'TypeA') was not found in './types' (module has no exports)
โญโ[2:0]
1 โ // case 1:
2 โ export { TypeA } from "./types";
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
WARNING in ./re-exports.ts
โ ESModulesLinkingWarning: export 'TypeB' (reexported as 'TypeB') was not found in './types' (module has no exports)
โญโ[5:0]
3 โ // case 2:
4 โ import { TypeB } from "./types";
5 โ export { TypeB };
ยท โโโโโโโโโโโโโโโโโ
:::info Recommended with isolatedModules
When using Rspack to bundle TypeScript, we strongly recommend enabling isolatedModules in tsconfig.json (also recommended with other bundlers as it matches how bundlers compile TypeScript: .ts files are independent and compiled separately). This will give TypeScript's own warning for type re-exports: Re-exporting a type when 'isolatedModules' is enabled requires using 'export type'.
:::
'no-tolerant': Default behavior, shows errors for type re-exports.'tolerant': Tolerates type re-exports while verifying the existence of corresponding type exports in child modules. Requires coordination with collectTypeScriptInfo.typeExports from builtin:swc-loader to collect type export information.'tolerant-no-check': Tolerates type re-exports without checking child modules (may incorrectly tolerate some invalid cases, though IDEs usually provide warnings). Better performance as it skeps child module checks.export default {
module: {
parser: {
javascript: {
typeReexportsPresence: 'tolerant',
},
},
rules: [
{
test: /\.(?:js|mjs|ts)$/,
use: [
{
loader: 'builtin:swc-loader',
options: {
detectSyntax: 'auto',
collectTypeScriptInfo: {
typeExports: true, // Must be enabled in "tolerant" mode
},
},
},
],
},
],
},
};
Please refer to type reexports presence example for more details.
Provide custom syntax for Worker parsing, commonly used to support Worklet:
export default {
module: {
parser: {
javascript: {
worker: [
// Supports CSS paintWorklet
'CSS.paintWorklet.addModule()',
// Supports AudioWorklet, with the leading '*' indicating the recognition of a variable named 'context', for example:
// let context = new AudioContext();
// await context.audioWorklet.addModule(new URL("noise-processor.js", import.meta.url));
'*context.audioWorklet.addModule()',
// Extends default syntax: ["Worker", "SharedWorker", "navigator.serviceWorker.register()", "Worker from worker_threads"]
'...',
],
},
},
},
};
See Web Workers for more details.
Override the module to strict or non-strict.
This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.
export default {
module: {
parser: {
javascript: {
overrideStrict: 'strict',
},
},
},
};
<PropertyType type="boolean | { exports?: boolean | 'skipInEsm' }" defaultValueList={[{ defaultValue: 'true' }]} />
Controls CommonJS-specific parser behaviour. The default true keeps Rspack's standard handling for CommonJS export mutations. Set { exports: 'skipInEsm' } to skip rewriting CommonJS export assignments when the module is evaluated as ESM, preserving the original runtime side effects. Provide false to disable CommonJS export handling entirely.
export default {
module: {
parser: {
javascript: {
commonjs: {
exports: 'skipInEsm',
},
},
},
},
};
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'false' }]} />
Control whether renaming of the CommonJS require function will be parsed and transformed.
When set to true, Rspack will parse and transform cases where require is assigned to a variable or passed as a parameter (e.g., const req = require; req('./module')).
export default {
module: {
parser: {
javascript: {
requireAlias: true,
},
},
},
};
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'true' }]} />
Control whether require used as an expression will be parsed.
When set to true, Rspack will parse require when it's used as an expression (e.g., const req = require; req('./module')) and emit a warning. When set to false, this pattern will be ignored.
export default {
module: {
parser: {
javascript: {
requireAsExpression: false,
},
},
},
};
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'true' }]} />
Control whether dynamic require calls will be parsed.
When set to false, Rspack will not parse dynamic require calls where the module path is not a static string (e.g., require(variable)). This can improve build performance if your code doesn't use dynamic requires.
export default {
module: {
parser: {
javascript: {
requireDynamic: false,
},
},
},
};
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'true' }]} />
Control whether require.resolve() calls will be parsed.
When set to false, Rspack will not parse require.resolve() calls. This can improve build performance if your code doesn't use require.resolve().
export default {
module: {
parser: {
javascript: {
requireResolve: false,
},
},
},
};
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'true' }]} />
Control whether dynamic import() calls will be parsed.
When set to false, Rspack will not parse dynamic import() calls where the module path is not a static string (e.g., import(variable)). This can improve build performance if your code doesn't use dynamic imports.
export default {
module: {
parser: {
javascript: {
importDynamic: false,
},
},
},
};
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'false' }]} />
Controls whether Rspack preserves the this binding strictly when calling exported functions as object members from imported modules.
export default {
module: {
parser: {
javascript: {
strictThisContextOnImports: false,
},
},
},
};
This mainly affects cases where an exported function uses this to refer to the current module object, for example:
import * as mod from './mod';
console.log(mod.fn());
export function fn() {
return this.value;
}
export const value = 42;
In the example above, enabling this option prints 42. When it is disabled, value is considered unused and removed for better tree shaking, so the result becomes undefined.
true, Rspack follows the spec more strictly and prioritizes correct runtime this semantics, but tree shaking can become less effective.false, Rspack can generate more optimized output, but runtime this semantics may no longer be preserved in these patterns.This pattern is uncommon in real-world ESM code, and enabling the option can reduce tree shaking effectiveness, so the default is false.
:::tip If you run into this pattern in practice, it is usually better to avoid relying on it. If that is not possible, prefer enabling it only for specific modules with module rule condition.
export default {
module: {
rules: [
{
test: /index\.js$/, // Only enable strictThisContextOnImports for import statements in the index.js module
parser: {
strictThisContextOnImports: true,
},
},
],
},
};
:::
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'false' }]} />
Allow the JavaScript parser to understand JSX syntax so that parsing and minimization can operate on files that keep JSX in the final bundle.
Enable this option when you set the loader's JSX mode to "preserve" and want to defer the actual JSX transform to a later tool (for example, libraries that ship JSX output or rely on a custom JSX runtime).
export default {
module: {
parser: {
javascript: {
jsx: true,
},
},
},
};
:::warning This option is experimental in Rspack and may change or be removed. :::
<PropertyType type="boolean" defaultValueList={[{ defaultValue: 'false' }]} />
Allow the JavaScript parser to understand import.meta.resolve() syntax.
Currently, import.meta.resolve("./module") behaves similarly to require.resolve("./module"): it includes the module in the final bundle and returns the module ID.
export default {
module: {
parser: {
javascript: {
importMetaResolve: true,
},
},
},
};
:::warning This option is experimental in Rspack and may change or be removed. :::
Manually mark top-level identifiers in matched modules as side-effect-free for pure-function-based tree shaking. Each name must resolve to a supported top-level name in the module โ a function/class/variable declaration, an import specifier, an exported alias such as export { foo as bar }, or default for a default-exported function or arrow.
This option is mainly intended for third-party libraries whose source cannot be annotated directly. You can either configure it on the library file itself, or on a consumer file to assert that calls to a particular import are pure.
Although the option lives under module.parser.javascript, in practice it is usually better to apply it through module.rules[i].parser so you can configure pureFunctions more precisely for specific modules.
export default {
experiments: {
pureFunctions: true,
},
module: {
rules: [
// Mark exports of a third-party library as pure.
{
test: /node_modules\/some-library\/index\.js$/,
parser: {
pureFunctions: ['isString'],
},
},
// Or mark imports on the consumer side: calls to `cva` in this file
// are treated as pure regardless of how the library declares itself.
{
test: /src\/styles\.js$/,
parser: {
pureFunctions: ['cva'],
},
},
],
},
};
:::warning
This option only takes effect when experiments.pureFunctions is enabled, and Rspack emits a warning if a configured name does not appear as a top-level binding in the matched module.
:::
Parser options for javascript/auto modules, same as the javascript parser options.
export default {
module: {
parser: {
'javascript/auto': {
// options
},
},
},
};
Parser options for javascript/dynamic modules, same as the javascript parser options.
export default {
module: {
parser: {
'javascript/dynamic': {
// options
},
},
},
};
Parser options for javascript/esm modules, same as the javascript parser options.
export default {
module: {
parser: {
'javascript/esm': {
// options
},
},
},
};
Parser options for json modules.
export default {
module: {
parser: {
json: {
// options
},
},
},
};
numberNumber.MAX_SAFE_INTEGER, development mode is 1The depth of json dependency flagged as exportInfo.
export default {
module: {
parser: {
json: {
// For example, for the following json
// {
// "depth_1": {
// "depth_2": {
// "depth_3": "foo"
// }
// },
// "_depth_1": "bar"
// }
// when `exportsDepth: 1`, `depth_2` and `depth_3` will not be flagged as `exportInfo`.
exportsDepth: 1,
},
},
},
};
Parser options for css/auto modules.
export default {
module: {
parser: {
'css/auto': {
// options
},
},
},
};
booleantrueUse ES modules named export for CSS exports.
When using namedExports: true, you can use namespace export or named export:
export default {
module: {
parser: {
'css/auto': {
namedExports: true,
},
},
},
};
// namespace export
import * as classes from './index.module.css';
// named export
import { class1, class2 } from './index.module.css';
When using namedExports: false, in addition to namespace export and named export, default export can also be used:
export default {
module: {
parser: {
'css/auto': {
namedExports: false,
},
},
},
};
// namespace export
import * as classes from './index.module.css';
// named export
import { class1, class2 } from './index.module.css';
// default export
import classes from './index.module.css';
// default export and named export
import classes, { class1, class2 } from './index.module.css';
booleantrueAllow to enable/disables handling the CSS functions url.
When using url: true, Rspack will resolve the path in url function, the resolve file will be treated as an asset.
When using url: false, Rspack will ignore the path in the url function, keep the content unchanged.
export default {
module: {
parser: {
css: {
url: true,
},
},
},
};
boolean | ((context: { url: string, media: string | undefined, resourcePath: string, supports: string | undefined, layer: string | undefined }) => boolean)trueWhether to resolve @import syntax.
true: enable processing of @import rules (default).false: disable processing of @import rules.function: only process @import rules that satisfy the condition.export default {
module: {
parser: {
'css/auto': {
resolveImport: ({ url }) => {
return url.includes('style.css');
},
},
},
},
};
booleantrueWhether to handle CSS @import at-rules.
true: resolve and process @import rules (default).false: leave @import rules unchanged in the generated CSS.export default {
module: {
parser: {
'css/auto': {
import: true,
},
},
},
};
booleantrueEnable or disable renaming local @keyframes identifiers and their animation or animation-name usages.
export default {
module: {
parser: {
'css/auto': {
animation: true,
},
},
},
};
booleanfalseEnable or disable renaming custom identifiers, such as local @counter-style and @font-palette-values names.
export default {
module: {
parser: {
'css/auto': {
customIdents: true,
},
},
},
};
booleanfalseEnable or disable renaming dashed identifiers, such as CSS custom properties and @property declarations.
export default {
module: {
parser: {
'css/auto': {
dashedIdents: true,
},
},
},
};
Parser options for css modules.
export default {
module: {
parser: {
css: {
// options
},
},
},
};
Same as module.parser["css/auto"].namedExports.
export default {
module: {
parser: {
css: {
namedExports: true,
},
},
},
};
Same as module.parser["css/auto"].url.
export default {
module: {
parser: {
css: {
url: true,
},
},
},
};
Same as module.parser["css/auto"].resolveImport.
export default {
module: {
parser: {
css: {
resolveImport: ({ url }) => {
return url.includes('style.css');
},
},
},
},
};
Same as module.parser["css/auto"].import.
export default {
module: {
parser: {
css: {
import: true,
},
},
},
};
Same as module.parser["css/auto"].animation.
export default {
module: {
parser: {
css: {
animation: true,
},
},
},
};
Same as module.parser["css/auto"].customIdents.
export default {
module: {
parser: {
css: {
customIdents: true,
},
},
},
};
Same as module.parser["css/auto"].dashedIdents.
export default {
module: {
parser: {
css: {
dashedIdents: true,
},
},
},
};
Parser options for css/global modules.
export default {
module: {
parser: {
'css/global': {
// options
},
},
},
};
Same as module.parser["css/auto"].namedExports.
export default {
module: {
parser: {
'css/global': {
namedExports: true,
},
},
},
};
Same as module.parser["css/auto"].url.
export default {
module: {
parser: {
'css/global': {
url: true,
},
},
},
};
Same as module.parser["css/auto"].resolveImport.
export default {
module: {
parser: {
'css/global': {
resolveImport: ({ url }) => {
return url.includes('style.css');
},
},
},
},
};
Same as module.parser["css/auto"].import.
export default {
module: {
parser: {
'css/global': {
import: true,
},
},
},
};
Same as module.parser["css/auto"].animation.
export default {
module: {
parser: {
'css/global': {
animation: true,
},
},
},
};
Same as module.parser["css/auto"].customIdents.
export default {
module: {
parser: {
'css/global': {
customIdents: true,
},
},
},
};
Same as module.parser["css/auto"].dashedIdents.
export default {
module: {
parser: {
'css/global': {
dashedIdents: true,
},
},
},
};
Parser options for css/module modules.
export default {
module: {
parser: {
'css/module': {
// options
},
},
},
};
Same as module.parser["css/auto"].namedExports.
export default {
module: {
parser: {
'css/module': {
namedExports: true,
},
},
},
};
Same as module.parser["css/auto"].url.
export default {
module: {
parser: {
'css/module': {
url: true,
},
},
},
};
Same as module.parser["css/auto"].resolveImport.
export default {
module: {
parser: {
'css/module': {
resolveImport: ({ url }) => {
return url.includes('style.css');
},
},
},
},
};
Same as module.parser["css/auto"].import.
export default {
module: {
parser: {
'css/module': {
import: true,
},
},
},
};
Same as module.parser["css/auto"].animation.
export default {
module: {
parser: {
'css/module': {
animation: true,
},
},
},
};
Same as module.parser["css/auto"].customIdents.
export default {
module: {
parser: {
'css/module': {
customIdents: true,
},
},
},
};
Same as module.parser["css/auto"].dashedIdents.
export default {
module: {
parser: {
'css/module': {
dashedIdents: true,
},
},
},
};