本节内容派生于以下链接指向的内容 ,并遵守 CC BY 4.0 许可证的规定。
以下内容如果没有特殊声明,可以认为都是基于原内容的修改和删减后的结果。
模块:该选项用于决定如何处理一个项目中不同类型的模块。
Object
{}
(Rule | Falsy)[]
应用于模块的默认规则。
详见源代码。
string | string[] | RegExp | RegExp[] | ((request: string) => boolean)
undefined
匹配的文件代码不会被 Rspack 转换,包括 module.exports
, require
, import
这些模块系统相关的语法。
用来忽略那些没有外部依赖的第三方库的时候很有用,有时还能提升性能。
请注意:这些文件依然还会被已配置的 loaders 处理。
Object
{}
使用 module.parser
在一个地方配置所有解析器选项。
asset
模块的解析器选项。
{ maxSize: number }
{ maxSize: 8096 }
如果当前模块的小于等于 maxSize
,那么模块将被 Base64 编码,否则模块将会以文件形式被输出。该选项仅能做用于 Asset Module 的场景。
javascript
模块的解析器选项。
'lazy' | 'eager' | 'weak' | 'lazy-once'
'lazy'
指定动态导入的全局模式,详见webpackMode
。
boolean | number
false
指定动态导入的全局 prefetch,详见webpackPrefetch
。
boolean | number
false
指定动态导入的全局 preload,详见webpackPreload
。
'low' | 'high' | 'auto'
'auto'
指定动态导入的全局 fetchPriority
,详见webpackFetchPriority
。
true | false | 'relative'
true
启用 new URL()
语法解析。
当使用 'relative' 时,webpack 将为 new URL()
语法生成相对的 URL,即结果 URL 中不包含根 URL
boolean | undefined
true
启用完全动态依赖(import(variable)
)的警告。
boolean | undefined
false
启用部分动态依赖(import("./path/to/" + variable)
)的警告。
RegExp | undefined
/.*/
设置正则表达式,用于匹配包裹的动态依赖。
boolean
true
是否要解析替换 import.meta
。
'error' | 'warn' | 'auto' | false
'auto'
当使用了不存在的导出或存在冲突的重导出时,是否进行警告或报错。
"error"
:进行报错。"warn"
:进行警告。"auto"
:根据模块是否为严格 ESM,如果是严格 ESM 则报错,否则警告。false
:关闭该功能。'error' | 'warn' | 'auto' | false
当使用了不存在的导出时,是否进行警告或报错。默认会遵循 module.parser.javascript.exportsPresence
的配置。
'error' | 'warn' | 'auto' | false
当使用了存在冲突的重导出时,是否进行警告或报错。默认会遵循 module.parser.javascript.exportsPresence
的配置。
boolean
当导入的名称在导入模块中不存在时,发出错误而不是警告。
string[] | boolean
为 Worker 解析提供自定义的语法,常用于支持 Worklet:
'strict' | 'non-strict'
将模块覆盖为严格模式或非严格模式。
这可能会影响模块的行为(某些行为在严格模式和非严格模式之间有所不同),因此请谨慎配置此选项。
javascript/auto
模块的解析器选项,和 javascript
的模块的解析器选项相同。
javascript/dynamic
模块的解析器选项,和 javascript
的模块的解析器选项相同。
javascript/esm
模块的解析器选项,和 javascript
的模块的解析器选项相同。
css/auto
模块的解析器选项。
只有在 experiments.css = true
时该配置才会生效
boolean
true
使用 ES 模块命名导出来导出 CSS。
当使用 namedExports: true
时,你可以使用命名空间导出或命名导出:
当使用 namedExports: false
时,除了命名空间导出和命名导出之外,还可以用默认导出:
css
模块的解析器选项。
只有在 experiments.css = true
时该配置才会生效
和 module.parser["css/auto"].namedExports
一样。
css/module
模块的解析器选项。
只有在 experiments.css = true
时该配置才会生效
和 module.parser["css/auto"].namedExports
一样。
Object
{}
使用 module.generator
在一个地方配置所有生成器选项。
asset
模块的生成器选项。
Object | (source: Buffer, context: { filename: string, module: Module }) => string
{}
仅对模块类型为 asset
或 'asset/inline'
的模块生效。
当被作为一个函数使用,它必须为每个模块执行且并须返回一个 data URI 字符串。
false | 'base64'
'base64'
设置为 base64 时,模块将使用 base64 算法进行编码。将编码设置为 false 将禁用编码。仅对模块类型为 'asset/inline'
的模块生效。
string
require('mime-types').lookup(ext)
dataUrl 的 MIME 类型,默认从模块资源扩展名解析。仅对模块类型为 'asset/inline'
的模块生效。
string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
undefined
output.assetModuleFilename
覆盖 output.assetModuleFilename
,仅对模块类型为 'asset'
和 'asset/resource'
的模块生效。
string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
undefined
将 asset 输出到指定文件夹,该文件夹相对于 output.path
。
仅对模块类型为 'asset'
和 'asset/resource'
的模块生效。
string | ((pathData: PathData, assetInfo?: AssetInfo) => string)
undefined
覆盖 output.publicPath
,仅对模块类型为 'asset'
和 'asset/resource'
的模块生效。
boolean
true
是否将 asset 输出到磁盘。对于 SSR 等场景,你可以将该选项设置为 false
来避免输出无用的文件。
仅对模块类型为 'asset'
或 'asset/resource'
的模块生效。
'asset'
:'asset/resource'
:asset/inline
模块的生成器选项。
和 module.generator["asset"].dataUrl
一样。
和 module.generator["asset"].dataUrl.encoding
一样。
和 module.generator["asset"].dataUrl.mimetype
一样。
asset/resource
模块的生成器选项。
和 module.generator["asset"].filename
一样。
和 module.generator["asset"].outputPath
一样。
和 module.generator["asset"].publicPath
一样。
css/auto
模块的生成器选项。
只有在 experiments.css = true
时该配置才会生效
'as-is' | 'camel-case' | 'camel-case-only' | 'dashes' | 'dashes-only'
'as-is'
自定义 CSS 导出名称如何导出到 JavaScript 模块,例如保留原样、转换为驼峰命名等等。
boolean
true
for node environments, false
for web environments.如果为 true
,仅从 CSS 中导出标识符映射表到 JavaScript 文件中,而不在 template 中注入任何 stylesheets。适用于使用 CSS Modules 进行预渲染的场景(例如 SSR)。
如果为 false
,生成 stylesheets 并将其注入到 template 中。
string
[uniqueName]-[id]-[local]
自定义生成的 CSS Modules 的局部类名格式,除了在文件级别和模块级别的替换之外,还包括 [uniqueName]
和 [local]
。
boolean
true
是否为 CSS 的导出添加 __esModule
,如果添加则会在 esm-cjs interop 时当作 ES modules,否则当作 CommonJS modules。
比如在使用第三方组件库的 CommonJS 产物时,有时需要添加该配置确保 esm-cjs interop 正确,以拿到正确的导出(可配合 Rule.test 等匹配条件只为该组件库添加)。
组件库源码:
组件库发布的 CommonJS 产物:
css
模块的生成器选项。
只有在 experiments.css = true
时该配置才会生效。
和 module.generator["css/auto"].exportsOnly
一样。
和 module.generator["css/auto"].esModule
一样。
css/module
模块的生成器选项。
只有在 experiments.css = true
时该配置才会生效
和 module.generator["css/auto"].exportsConvention
一样。
和 module.generator["css/auto"].exportsOnly
一样。
和 module.generator["css/auto"].localIdentName
一样。
和 module.generator["css/auto"].esModule
一样。
Rule[]
[]
一个规则数组,当模块被创建时与该模块的请求相匹配。这些规则可以修改模块的创建行为。它们可以对模块应用 Loader 等。
Rule
{}
Rule 定义了一个模块的匹配条件以及处理这些模块的行为。
Rule 处理行为
定义了对应匹配的模块的处理行为,例如:
Rule.use
)Rule.type
)Rule.resolve
)string | RegExp | Condition[] | LogicalConditions
定义了一个模块的匹配条件,常见的匹配有和 resource
与 resourceQuery
的匹配,以及 include
与 exclude
的匹配等。
例如: 当 app.js 导入 ./image.png?inline#foo
resource
为 /path/to/image.png
,会与 Rule.resource
这个 Condition 进行匹配resourceQuery
为 ?inline
,会与 Rule.resourceQuery
这个 Condition 进行匹配resourceFragment
为 #foo
,会与 Rule.resourceFragment
这个 Condition 进行匹配Condition 代表了匹配一个给定输入的形式,它支持的类型为:
String
:给定一个输入,当输入的字符串满足 startsWith
时,则匹配成功。注:你可以认为是 input.startsWith(condition)
。RegExp
:给定一个输入,当输入的字符串满足正则表达式时,则匹配成功。注:你可以认为是 condition.test(input)
。Condition[]
:一系列条件,当有一个条件匹配上时,则匹配成功。LogicalConditions
:所有属性都匹配上时,则匹配成功。
{ and: Condition[] }
:所有条件都匹配,则匹配成功。{ or: Condition[] }
:其中一个条件匹配,则匹配成功。{ not: Condition }
:所有条件都不匹配时,则匹配成功。(value: string) => boolean
:当输入的字符串经函数调用后返回 true 是,则匹配成功。嵌套 Rule 可以通过 Rule.rules
和 Rule.oneOf
定义,这些嵌套 Rule 只有在其上层 Rule 匹配成功时才会进行匹配,它们可以包含自己的 Rule 条件
嵌套 Rule 的匹配顺序:
Rule.rules
Rule.oneOf
Condition
undefined
排除所有符合这个条件的模块,会和资源的绝对路径(不包含 query 和 fragment)进行匹配。该选项不能和 Rule.resource
同时存在。
Condition
undefined
匹配所有符合这个条件的模块,会和资源的绝对路径(不包含 query 和 fragment)进行匹配。该选项不能和 Rule.resource
同时存在。
Condition
undefined
匹配所有符合这个资源的模块,会和 Resource(不包含 query 和 fragment 的绝对路径)进行匹配。该选项不能和 Rule.test
同时存在。
Condition
undefined
匹配所有符合这个资源的模块,会和 Resource 的 query 进行匹配。注:包含 ?
,当 Rule.resourceQuery
为 ?raw
时,会和 foo?raw
的资源请求进行匹配。
Condition
undefined
匹配所有符合这个资源的模块,会和 Resource 的 fragment 进行匹配。注:包含 #
,当 Rule.resourceFragment
为 #abc
时,会和 foo#abc
的资源请求进行匹配。
Condition
undefined
匹配所有符合这个资源的模块,会和 Resource(不包含 query 和 fragment 的绝对路径)进行匹配。该选项不能和 Rule.resource
同时存在。
Condition
undefined
匹配所有符合这个资源的模块,会和引入当前模块的模块的 Resource(不包含 query 和 fragment 的绝对路径)进行匹配。
string
undefined
匹配所有符合这个资源的模块,会与"引入当前模块"的模块的 layer 进行匹配。
只有在 experiments.layers = true 时该配置才会生效。
一个基础示例:
一个更复杂的示例是结合 entry options 来同时构建 modern 和 legacy 产物:
Condition
undefined
匹配所有符合这个资源的模块,会和引入当前模块的依赖的类别(category)进行匹配,比如对于 import
、import()
来说是 esm
,对于 require()
来说是 cjs
,对于 new URL()
、url()
来说是 url
。
Condition
undefined
匹配所有符合这个资源的模块,会和 Resource 的 scheme 进行匹配。
比如,你可以通过以下配置将内联的 data uri 资源当作单独的资源处理:
Condition
undefined
匹配所有符合这个资源的模块,会和 Resource 的 mimetype 进行匹配。
{ [key: string]: Condition }
undefined
descriptionData
选项允许你通过匹配描述文件(通常是 package.json
)中的属性值,来决定某个 rule 应该应用于哪些模块。这是一个基于 package.json
来应用 rule 的实用方法。
descriptionData
对象中的 key 对应模块的 package.json
中的键,例如 name
、version
等。每个 key 与一个用于匹配 package.json
数据的 Condition
进行关联。
例如,下面的配置会将 rule 应用于 package.json
的 name
中包含 'rspack'
字符串的 JavaScript 资源。
{ [key: string]: Condition }
undefined
with
能够与 import attributes 进行匹配。
例如,以下配置会与 { type: "url" }
匹配,会将匹配到的模块的 type
修改为 "asset/resource"
:
以下引入会命中匹配:
需要注意的是,为了让 Rspack 能够正常匹配 with
语法,当你在使用 builtin:swc-loader 时,需要手动开启 keepImportAttributes
配置以保留 import attributes
:
这个选项已经被废弃,请使用 Rule.use
代替。
Rule.loader
是 Rule.use: [ { loader } ]
的简略写法。 详情见 Rule.use.
Rule.options
是 Rule.use: [ { options } ]
的简略写法。 详情见 Rule.use.
Object
{}
对于通过规则条件匹配的特定模块的解析器选项,这将覆盖 module.parser
中的解析器选项。
对于特定的解析器选项及其对应的模块类型,你可以参考 module.parser
。
Object
{}
对于通过规则条件匹配的特定模块的生成器选项,这将覆盖 module.generator
中的生成器选项。
对于特定的生成器选项及其对应的模块类型,你可以参考 module.generator
。
boolean
标记模块是否存在副作用,这会影响 Tree Shaking 的结果。
'pre' | 'post'
指定 loader 的类型,未指定时默认为 normal loader。
当指定为 'pre'
时,该 loader 会在其他所有 loader 之前执行。
当指定为 'post'
时,该 loader 会在其他所有 loader 之后执行。
所有 loader 都会进入以下两个阶段:
pitch
方法在 post, inline, normal, pre
顺序下被调用。详见 Pitching Loader。pre, normal, inline, post
顺序下被执行。模块的源码转换发生在该阶段。'javascript/auto' | 'css' | 'css/module' | 'css/auto' | 'json' | 'asset' | 'asset/source' | 'asset/resource' | 'asset/inline'
用于标记匹配的模块的类型,这会影响 Rspack 内置对于该模块的处理方式。
默认情况下,Rspack 会根据文件扩展名来决定模块的类型。例如,.js
和 .mjs
文件会被当作 javascript/auto
模块处理,.json
文件会被当作 json
模块处理。
例如,如果你想通过一个自定义 Loader 加载 .json
文件,你需要将类型设置为 javascript/auto
以绕过 Rspack 内置的 JSON 导入。
所有 type
如下:
'javascript/auto'
:JavaScript 模块,支持的模块系统:CommonJS、ES modules。'javascript/esm'
:JavaScript 模块,当作严格 ES modules 处理。'javascript/dynamic'
:JavaScript 模块,当作 Script 处理。'json'
:JSON data 模块,参考 JSON。'css' | 'css/module' | 'css/auto'
:CSS 模块,参考 原生 CSS 支持。'asset' | 'asset/source' | 'asset/resource' | 'asset/inline'
:资源模块,参考 资源模块。string
undefined
用于标识匹配的模块的 layer。可以将一组模块聚合到一个 layer 中,该 layer 随后可以在 split chunks, stats 或 entry options 中使用。
只有在 experiments.layers = true 时该配置才会生效。
用于传递 Loader 包名与其选项的数组。string[]
如: use: ['svgr-loader']
是 use: [ { loader: 'svgr-loader' } ]
的简写。Loader 会按照从右到左的顺序执行。
也可以使用一个函数:
根据匹配的模块设置具体的模块 resolve 选项
Rule[]
undefined
嵌套 Rule 的一种,当其上层 Rule 匹配成功后会使用这些 Rule 进行匹配
(Rule | Falsy)[]
undefined
嵌套 Rule 的一种,当其上层 Rule 匹配成功后会使用这些 Rule 进行匹配,并且只使用匹配成功的第一个 Rule