本章节描述了 Rsbuild 中与构建产物有关的配置。
string
'/'
在生产环境使用 CDN 部署时,可使用该选项设置静态资源的 URL 前缀。
assetPrefix
会影响构建产物中绝大部分静态资源的 URL,包括 JavaScript 文件、CSS 文件、图片、视频等。如果指定了一个错误的值,则在加载这些资源时可能会出现 404 错误。
该配置项仅用于生产环境。在开发环境下,请使用 dev.assetPrefix
配置项进行设置。
设置后,项目的 JavaScript、CSS、图片等静态资源的 URL 都会加上 output.assetPrefix
作为前缀:
构建之后,可以看到 JS 文件从以下地址加载:
output.assetPrefix
对应以下原生配置:
它与原生配置的区别在于:
output.assetPrefix
仅在生产环境下生效。output.assetPrefix
默认会自动补全尾部的 /
。output.assetPrefix
的值会写入 process.env.ASSET_PREFIX
环境变量。'ascii' | 'utf8'
'ascii'
默认情况下,Rsbuild 的产物内容是纯 ASCII 的,并且会转义所有非 ASCII 字符。
如果你不希望对字符进行转义,而是输出所有原始字符,可以将 output.charset
设置为 utf8
。
boolean
true
是否在构建开始前清理 dist 目录下的所有文件。
默认情况下,Rsbuild 会自动清理 dist 目录下的文件,你可以把 cleanDistPath
设置为 false
来禁用该行为。
CopyPluginOptions | CopyPluginOptions['patterns']
undefined
将指定的文件或目录拷贝到构建输出目录中。
例如,将 src/assets
下的文件直接拷贝到 dist 目录:
更详细的配置项请参考:copy-webpack-plugin 文档。
用于自定义 CSS Modules 配置。
auto 配置项允许基于文件名自动启用 CSS 模块。
boolean | RegExp | ((resourcePath: string) => boolean)
true
类型说明:
true
: 为所有匹配 /\.module\.\w+$/i.test(filename)
正则表达式的文件启用 CSS 模块。false
: 禁用 CSS 模块。RegExp
: 为所有匹配 /RegExp/i.test(filename)
正则表达式的文件禁用 CSS 模块。function
: 为所有通过基于文件名的过滤函数校验的文件启用 CSS 模块。导出的类名称的样式。
'camelCase'
类型说明:
asIs
类名将按原样导出。camelCase
类名将被驼峰化,原始类名仍然可用。camelCaseOnly
类名将被驼峰化,原始类名不可用。dashes
只有类名中的破折号会被驼峰化,原始类名仍然可用。dashesOnly
只有类名中的破折号会被驼峰化,原始类名不可用。string
设置 CSS Modules 编译后生成的 className 格式。
localIdentName
在开发环境和生产环境有不同的默认值。
在生产环境,Rsbuild 会生成更简短的类名,从而减少构建产物的体积。
在 localIdentName
中,你可以使用以下模板字符串:
[name]
- 源文件名称。[local]
- 原始类名。[hash]
- 字符串的哈希值。[folder]
- 文件夹的相对路径。[path]
- 源文件的相对路径。[file]
- 文件名和路径。[ext]
- 文件后缀名,包含点号。[hash:<hashDigest>:<hashDigestLength>]
- 带有哈希设置的哈希。在使用 Rspack 作为打包工具时, 暂不支持配置 <hashDigest>
。
将 localIdentName
设置为其他值:
设置图片、字体、媒体等静态资源被自动内联为 base64 的体积阈值。
默认情况下,体积小于 10KB 的图片、字体、媒体等文件,会自动经过 Base64 编码,内联到页面中,不再会发送独立的 HTTP 请求。
你可以通过修改 dataUriLimit
参数来调整这个阈值。
其中:
svg
:表示 SVG 图片的体积阈值。font
:表示字体文件的体积阈值。image
:表示非 SVG 图片的体积阈值。media
:表示视频等媒体资源的体积阈值。修改图片资源的阈值为 5000 Bytes,设置视频资源不内联:
boolean
false
是否禁用 CSS 提取逻辑,并将 CSS 文件内联到 JS 文件中。
默认情况下,Rsbuild 会把 CSS 提取为独立的 .css
文件,并输出到构建产物目录。设置该选项为 true
后,CSS 文件会被内联到 JS 文件中,并在运行时通过 <style>
标签插入到页面上。
建议仅在开发环境在开启 disableCssExtract
选项。
对于生产环境构建,建议使用 Rsbuild 的默认行为,将 CSS 抽取为单独的 bundle,以便浏览器能够并行加载 CSS 和 JS 资源。
比如:
如果你需要在生产环境下开启该选项,请留意内联的 CSS 代码不会经过 Rsbuild 默认的 CSS 压缩器,你可以手动注册 PostCSS 的 cssnano 插件来对内联代码进行压缩。
tools.postcss
注册 cssnano:设置构建产物的输出目录,Rsbuild 会根据产物的类型输出到对应的子目录下。
其中:
root
: 表示所有构建产物输出的根目录。html
:表示 HTML 文件的输出目录。js
:表示 JavaScript 文件的输出目录。css
:表示 CSS 样式文件的输出目录。svg
:表示 SVG 图片的输出目录。font
:表示字体文件的输出目录。wasm
:表示 WebAssembly 文件的输出目录。image
:表示非 SVG 图片的输出目录。media
:表示视频等媒体资源的输出目录。server
: 表示服务端产物的输出目录,仅在 target 为 node
时有效。worker
: 表示 worker 产物的输出目录,仅在 target 为 service-worker
时有效。root
是构建产物的根目录,可以为相对路径或绝对路径。如果 root
的值为相对路径,则会基于当前项目的根目录拼接为绝对路径。
其他目录只能为相对路径,并且会相对于 root
进行输出。
以 JavaScript 文件为例,会输出到 distPath.root
+ distPath.js
目录,即为 dist/static/js
。
如果需要将 JavaScript 文件输出到 build/resource/js
目录,可以这样设置:
boolean
false
是否禁用生产环境下的代码压缩。
默认情况下,JS 代码和 CSS 代码会在生产环境构建时被自动压缩,从而提升页面性能。如果你不希望执行代码压缩,可以将 disableMinimize
设置为 true
。
该配置项通常用于代码调试和问题排查,不建议在生产环境禁用代码压缩,否则会导致页面性能显著下降。
是否禁用 Source Map 生成。
Source Map 是保存源代码映射关系的信息文件,它记录了编译后的代码的每一个位置,以及所对应的编译前的位置。通过 Source Map,可以在调试编译后的代码时,直接查看对应的源代码。
默认情况下,Rsbuild 的 Source Map 生成规则如下:
如果项目不需要 Source Map,可以关闭该功能,从而提升构建的速度。
如果需要开启开发环境的 Source Map,并在生产环境禁用,可以设置为:
如果需要单独控制 JS 文件或 CSS 文件的 Source Map,可以参考下方设置:
boolean
false
移除生产环境的构建产物名称中的 hash 值。
在生产环境构建后,会自动在文件名中间添加 hash 值,如果不需要添加,可以通过 output.disableFilenameHash
配置来禁用该行为。
默认情况下,构建后的产物名称为:
添加 output.disableFilenameHash
配置:
重新构建,产物的名称变为:
false
用来控制生产环境中是否用 <style>
标签将产物中的 style 文件(.css 文件)inline 到 HTML 中。
注意,如果开启了这个选项,那么 style 文件将不会被写入产物目录中,而只会以 inline 样式的形式存在于 HTML 文件中。
默认情况下,我们有这样的产物文件:
开启 output.enableInlineStyles
选项后:
产物文件将变成:
同时,dist/static/css/style.css
文件将被 inline 到 index.html
中:
当你需要内联产物中的一部分 CSS 文件时,你可以将 enableInlineStyles
设置为一个正则表达式,匹配需要内联的 CSS 文件的 URL。
比如,将产物中的 main.css
内联到 HTML 中,你可以添加如下配置:
生产环境的文件名中默认包含了一个 hash 值,比如 static/css/main.18a568e5.css
。因此,在正则表达式中需要通过 \w+
来匹配 hash。
你也可以将 output.enableInlineStyles
设置为一个函数,函数接收以下参数:
name
:文件名,比如 static/css/main.18a568e5.css
。size
:文件大小,单位为 byte。比如,我们希望内联小于 10KB 的资源,可以添加如下配置:
string | object | function | RegExp
undefined
在构建时,防止将代码中某些 import
的依赖包打包到 bundle 中,而是在运行时再去从外部获取这些依赖。
详情请见: webpack 外部扩展 (Externals)
将 react-dom
依赖从构建产物中剔除。为了在运行时获取这个模块, react-dom
的值将全局检索 ReactDOM
变量。
当构建 Web Worker 产物时,externals 将不会生效。这是因为 Worker 环境不支持通过访问全局变量。
设置构建产物的名称。
在生产环境构建后,会自动在文件名中间添加 hash 值,如果不需要添加,可以通过 output.disableFilenameHash
配置来禁用该行为。
下面是各个文件类型的说明:
js
:表示 JavaScript 文件的名称。css
:表示 CSS 样式文件的名称。svg
:表示 SVG 图片的名称。font
:表示字体文件的名称。image
:表示非 SVG 图片的名称。media
:表示视频等媒体资源的名称。修改 JavaScript 文件的名称为 [name]_script.js
:
通常来说,我们只会在生产环境下设置文件名的 hash 值(即 process.env.NODE_ENV === 'production'
时)。
如果你在开发环境下设置了文件名的 hash,那么可能会导致热更新不生效(尤其是 CSS 文件)。这是因为每次文件内容变化时,都会引起 hash 变化,导致 mini-css-extract-plugin 等工具无法读取到最新的文件内容。
当你在代码中通过 dynamic import 的方式引入模块时,该模块会被单独打包成一个文件,它默认的命名规则如下:
dist/static/js/async/src_add_ts.js
。dist/static/js/async/798.27e3083e.js
,这是为了避免在生产环境中泄露源代码的路径,同时字符数也更少。如果你希望为异步模块指定一个固定的名称,可以通过打包工具提供的 magic comments 来实现,通过 webpackChunkName
指定模块名称:
通过以上写法指定模块名称后,生成的文件会是 dist/static/js/async/my-chunk-name.js
。
'linked' | 'inline' | 'none'
'linked'
配置 legal comment 的处理方式。
legal comment 是 JS 或 CSS 文件中的一些特殊注释,这些注释包含 @license
或 @preserve
,或是以 //!
开头。默认情况下,这些注释保留在输出文件中,因为这遵循了代码原作者的意图。
你可以通过 legalComments
来配置相关行为:
linked
:将所有 legal comments 移至 .LEGAL.txt 文件并通过注释链接到它们。inline
:保留所有 legal comments。none
:移除所有 legal comments。移除所有 legal comments。
string[] | Record<RsbuildTarget, string[]>
undefined
指定项目兼容的目标浏览器范围。该值会被 @babel/preset-env 和 autoprefixer 用来确定需要转换的 JavaScript 语法特性和需要添加的 CSS 浏览器前缀。
overrideBrowserslist
配置的优先级高于项目中的 .browserslistrc
配置文件和 package.json 中的 browserslist
字段。
大多数场景下,推荐优先使用 .browserslistrc
文件,而不是使用 overrideBrowserslist
配置。因为 .browserslistrc
文件是官方定义的配置文件,通用性更强,可以被社区中的其他库识别。
如果项目中没有定义任何 browserslist
相关的配置,也没有定义 overrideBrowserslist
,那么 Rsbuild 会设置默认值为:
下面是兼容移动端 H5 场景的示例:
可以查看 browserslist 文档 来了解如何自定义浏览器范围。
当你同时构建多种类型的产物时,你可以为不同的产物类型设置不同的目标浏览器范围。此时,你需要把 overrideBrowserslist
设置为一个对象,对象的 key 为对应的产物类型。
比如为 web
和 node
设置不同的范围:
'entry' | 'usage' | 'off'
'usage'
通过 output.polyfill
选项,你可以控制 polyfills 的注入方式。
当 output.polyfill
配置为 'usage'
时,Rsbuild 会在每个文件中根据代码中使用的 API 注入 polyfills。
当 output.polyfill
配置为 'entry'
时,Rsbuild 会在每个入口文件中注入 polyfills。
当 output.polyfill
配置为 'off'
时,Rsbuild 不会注入 polyfills,开发者需要自行保证代码的兼容性。
请查看 Polyfill 方案 了解详细内容。