本节内容来自以下链接,并受 CC BY 4.0 许可。
除非另有说明,以下内容可以被认为是基于原始内容的修改和删除的结果。
顶级输出键包含一组选项,指示 Rspack 如何以及在何处输出您的包、资产以及您使用 Rspack 捆绑或加载的任何其他内容。
Object
string | ((pathData: PathData, assetInfo?: JsAssetInfo) => string)
'[hash][ext][query]'
与 output.filename
相同,但针对 资产模块。
对于从 data URI 替换构建的资产,[name]
、[file]
、[query]
、[fragment]
、[base]
和 [path]
设置为空字符串。
资产模块要输出的文件名。此值可以被 Rule.generator.filename 覆盖。
'asset'
并且资产设置为满足 Rule.parser.dataUrlCondition'asset/resource'
boolean
true
创建按需加载的异步块。
boolean
true
将 charset="utf-8"
添加到 HTML <script>
标签。
尽管 <script>
标签的 charset
属性已 弃用,但 Rspack 仍然默认添加它以与非现代浏览器兼容。
string = '[id].js' | (pathData: PathData, assetInfo?: JsAssetInfo) => string
output.filename
不是函数时由其决定,否则为 '[id].js'
。此选项确定非初始块文件的名称。有关可能值的详细信息,请参阅 output.filename
选项。
请注意,这些文件名需要在运行时生成才能发送块请求。因此,像 [name]
和 [chunkhash]
这样的占位符需要使用 Rspack 运行时将从块 ID 到占位符值的映射添加到输出包中。这会增加大小,并且当任何块的占位符值发生变化时可能会使包失效。
默认情况下,使用 [id].js
或从 output.filename
推断的值([name]
被替换为 [id]
或 [id].
被添加在前面)。
用作函数
false | 'array-push' | 'commonjs' | 'module' | string
target
和 output.module
决定块的格式(默认包含的格式为 'array-push'
(web/webworker)、'commonjs'
(node.js)、'module'
(ESM),但其他格式可能由插件添加)。
此选项的默认值取决于 target
和 output.module
设置。有关更多详细信息,请在 Rspack 默认值中搜索“chunkFormat” 。
number
120000
块请求超时之前的毫秒数。
string
output.uniqueName
决定Rspack 用于加载块的全局变量。
false | 'jsonp' | 'import-scripts' | 'require' | 'async-node' | 'import'
加载块的方法(默认包含的方法是 'jsonp'
(web)、'import'
(ESM)、'importScripts'
(webworker)、'require'
(同步 node.js)、'async-node'
(异步 node.js),但其他方法可能会由插件添加)。默认值将根据 target
和 chunkFormat
的配置确定。
此选项的默认值取决于 target
和 chunkFormat
设置。有关更多详细信息,请在 Rspack 默认值中搜索 "chunkLoading"
。
boolean
false
在生成产品之前,删除输出目录中的所有文件。
boolean
true
告诉 Rspack 在写入输出文件系统之前检查要发射的文件是否已存在并且具有相同的内容。
当文件已存在于磁盘上并且具有相同的内容时,Rspack 不会写入输出文件。
false | 'anonymous' | 'use-credentials'
false
crossOriginLoading
配置允许您为动态加载的块设置 crossorigin 属性。
如果 target
为 'web'
,Rspack 将动态创建 <script>
和 <link>
标签以加载异步 JavaScript 和 CSS 资源。如果这些资源的 URL 在其他域上,并且 crossOriginLoading
不是 false
,Rspack 将在 <script>
和 <link>
标签中添加 crossorigin
属性。
可选值
crossOriginLoading
具有以下可选值
false
:不设置 crossorigin 属性。'anonymous'
:将 crossorigin
设置为 'anonymous'
以在没有用户凭据的情况下启用跨源。'use-credentials'
:将 crossorigin
设置为 'use-credentials'
以使用用户凭据启用跨源。示例
例如,将 output.publicPath
设置为 https://example.com/
,并将 output.crossOriginLoading
设置为 'anonymous'
当 Rspack 动态加载 JavaScript 资源时,它将生成以下 HTML
string | (pathData: PathData, assetInfo?: JsAssetInfo) => string
output.chunkFilename
决定,否则为 '[id].css'
。此选项确定磁盘上非初始 CSS 输出文件的名称。有关可能值的详细信息,请参见 output.filename
选项。
您 不得在此处指定绝对路径。但是,您可以随意包含由 '/'
分隔的文件夹。此指定路径与 output.path
值相结合,以精确确定磁盘上的位置。
string | (pathData: PathData, assetInfo?: JsAssetInfo) => string
output.filename
决定此选项确定磁盘上 CSS 输出文件的名称。有关可能值的详细信息,请参见 output.filename
选项。
您 不得在此处指定绝对路径。但是,您可以随意包含由 '/'
分隔的文件夹。此指定路径与 output.path
值相结合,以精确确定磁盘上的位置。
string
| function (info)
undefined
当上面的模板字符串或函数产生重复时,使用回退。
参见 output.devtoolModuleFilenameTemplate
。
string = 'webpack://[namespace]/[resource-path]?[loaders]'
| function (info) => string
undefined
此选项仅在 devtool
使用需要模块名称的选项时使用。
自定义每个源映射的 sources
数组中使用的名称。这可以通过传递模板字符串或函数来完成。例如,当使用 devtool: 'eval'
时。
以下替换在模板字符串中可用
模板 | 描述 |
---|---|
[absolute-resource-path] | 绝对文件名 |
[all-loaders] | 自动和显式加载器以及参数,直到第一个加载器的名称 |
[hash] | 模块标识符的哈希值 |
[id] | 模块标识符 |
[loaders] | 显式加载器以及参数,直到第一个加载器的名称 |
[resource] | 用于解析文件和第一个加载器上使用的任何查询参数的路径 |
[resource-path] | 用于解析文件而没有任何查询参数的路径 |
[namespace] | 模块命名空间。这通常是作为库构建时的库名称,否则为空 |
当使用函数时,相同的选项通过 info
参数以骆驼大小写形式提供
如果多个模块会导致相同的名称,则 output.devtoolFallbackModuleFilenameTemplate
将用于这些模块。
string
undefined
此选项确定与 output.devtoolModuleFilenameTemplate
一起使用的模块的命名空间。当未指定时,它将默认为以下值:output.uniqueName
。它用于在加载使用 Rspack 构建的多个库时,防止源映射中的源文件路径冲突。
例如,如果您有两个库,其命名空间分别为 library1
和 library2
,它们都具有文件 ./src/index.js
(可能具有不同的内容),它们将公开这些文件作为 webpack://library1/./src/index.js
和 webpack://library2/./src/index.js
。
('jsonp' | 'import-scripts' | 'require' | 'async-node' | string)[]
output.chunkLoading
、output.workerChunkLoading
和 Entry 的 chunkLoading 配置决定。入口点可以使用的一组启用用于使用的块加载类型。将由 Rspack 自动填充。仅在使用函数作为入口选项并在其中返回 chunkLoading 选项时才需要。
string[]
入口点可以使用的一组启用用于使用的库类型。
('fetch-streaming' | 'fetch' | 'async-node' | string | false)[]
output.wasmLoading
和 output.workerWasmLoading
决定入口点可以使用的一组启用用于使用的 Wasm 加载类型。
告诉 Rspack 在生成的运行时代码中可以使用哪种 ES 功能。
string | (pathData: PathData, assetInfo?: JsAssetInfo) => string
[output.module](#outputmodule)
为 true
时,它为 '[name].mjs'
,否则为 '[name].js'
。此选项确定每个输出捆绑包的名称。捆绑包被写入由 output.path
选项指定的目录。
对于单个 entry
点,这可以是静态名称。
但是,当通过多个入口点、代码拆分或各种插件创建多个捆绑包时,您应该使用以下替换之一来为每个捆绑包指定唯一的名称...
Rspack 对用户输入代码执行代码拆分优化,其中可能包括但不限于代码拆分、捆绑拆分或通过其他插件实现的拆分。这些拆分操作会导致生成多个捆绑包,因此捆绑包的文件名需要动态生成。
使用 Entry 名称
使用内部块 ID
使用从生成内容生成的哈希值
组合多个替换
使用函数返回文件名
请注意,此选项称为 filename,但您仍然可以使用 'js/[name]/bundle.js'
之类的东西来创建文件夹结构。
请注意,此选项不会影响按需加载的块的输出文件。它只会影响最初加载的输出文件。对于按需加载的块文件,将使用 output.chunkFilename
选项。加载器创建的文件也不受影响。在这种情况下,您需要尝试特定加载器提供的选项。
下面的模板字符串可用于替换相应的文件名。不同的上下文对应不同的可替换内容,例如 output.assetModuleFilename 支持使用 文件上下文 和 模块上下文。
可在编译级别替换的内容。
模板 | 描述 |
---|---|
[fullhash] | 编译的完整哈希值 |
可在块级别替换的内容。
模板 | 描述 |
---|---|
[id] | 当前块 ID |
[name] | 当块名称存在时使用名称,否则使用块 ID |
[chunkhash] | 块的哈希值,根据当前块中所有类型元素计算得出 |
[contenthash] | 块的哈希值,根据仅包含该类型内容的元素计算得出。例如,如果生成了类型为 JavaScript 的模块,则仅使用当前块中所有 JavaScript 类型模块的哈希值。 |
可在模块级别替换的内容。
模板 | 描述 |
---|---|
[id] | 模块 ID |
[hash] | 模块的哈希值 |
[contenthash] | 模块内容的哈希值 |
可在文件级别替换的内容。
模板 | 描述 |
---|---|
[file] | 文件名和路径,不含查询或片段 |
[query] | 带前导 ? 的查询 |
[fragment] | 带前导 # 的片段 |
[base] | 仅文件名(含扩展名),不含路径 |
[filebase] | 相同,但已弃用 |
[path] | 仅路径,不含文件名 |
[name] | 仅文件名,不含扩展名或路径 |
[ext] | 带前导 . 的扩展名(对于 output.filename 不可使用) |
URL 级别的可用替换
模板 | 描述 |
---|---|
[url] | URL |
[file]
等于 [path][base]
。[base]
等于 [name][ext]
。完整路径为 [path][name][ext][query][fragment]
或 [path][base][query][fragment]
或 [file][query][fragment]
。
哈希值([hash]
、[contenthash]
或 [chunkhash]
)的长度可以使用 [hash:12]
指定(默认值为 16)。或者,指定 output.hashDigestLength
来全局配置长度。
当您想要在实际文件名中使用占位符时,可以过滤掉占位符替换。例如,要输出文件 [name].js
,您必须通过在方括号之间添加反斜杠来转义 [name]
占位符。这样 [\name\]
将生成 [name]
,而不是被替换为资源的 name
。
例如:[\id\]
将生成 [id]
,而不是被替换为 id
。
如果为此选项使用函数,则该函数将传递一个包含上述表格中替换数据的对象。替换也将应用于返回的字符串。传递的对象将具有以下类型:(属性根据上下文可用)
string
'self'
当面向库(尤其是当 library.type
为 'umd'
时),此选项指示将使用哪个全局对象来挂载库。为了使 UMD 构建在浏览器和 Node.js 上都可用,请将 output.globalObject
选项设置为 'this'
。对于类似 Web 的目标,默认为 self
。
您的入口点的返回值将使用 output.library.name
的值分配给全局对象。根据 type
选项的值,全局对象可能会相应地更改,例如 self
、global
或 globalThis
。
例如
string
'hex'
生成哈希值时使用的编码。对于文件名,使用 'base64'
可能有问题,因为它在字母表中包含字符 /
。同样,'latin1'
可能包含任何字符。
number
16
要使用的哈希摘要的前缀长度。
'md4' | 'xxhash64'
'xxhash64'
要使用的哈希算法。
Rspack 从 v1.1 开始默认使用更快的 xxhash64
算法。
string
undefined
用于更新哈希值的可选盐。
string
"[id].[fullhash].hot-update.js"
自定义热更新块的文件名。有关可能值的详细信息,请参阅 output.filename
选项。
此处允许的唯一占位符是 [id]
和 [fullhash]
,默认值为
通常您不需要更改 output.hotUpdateChunkFilename
。
string
"webpackHotUpdate" + output.uniqueName
仅当 target
设置为 'web'
时使用,该设置使用 JSONP 加载热更新。
JSONP 函数用于异步加载热更新块。
有关详细信息,请参阅 output.chunkLoadingGlobal
。
string
"[runtime].[fullhash].hot-update.json"
自定义主要的热更新文件名。[fullhash]
和 [runtime]
可用作占位符。
通常您不需要更改 output.hotUpdateMainFilename
。
boolean
true
告诉 Rspack 在已发出的代码周围添加 IIFE 包装器。
string
'import'
本机 import()
函数的名称。可用于填充,例如使用 dynamic-import-polyfill
。
string
'import.meta'
本机 import.meta
对象的名称(可以替换为填充)。
输出一个库,该库公开您的入口点的导出。
string | string[] | object
让我们看一个例子。
假设您在 src/index.js
入口文件中导出了一个函数
现在变量 MyLibrary
将绑定到您的入口文件的导出,以下是如何使用 Rspack 打包的库
在上面的示例中,我们向 entry
传递了一个单个入口文件,但是,Rspack 可以接受 多种类型的入口点,例如 array
或 object
。
如果您提供 array
作为 entry
点,则只有数组中的最后一个将被公开。
如果提供 object
作为 entry
点,则可以使用 library
的 array
语法公开所有条目
假设 a.js
和 b.js
都导出了函数 hello
,以下是如何使用这些库
string
在 AMD 模块中,使用一个容器(在全局空间中定义)来调用 define
/require
函数。
请注意,amdContainer
的值 必须为 作为全局变量设置。
这将产生以下包
为库指定一个名称。
string | string[] | {amd?: string, commonjs?: string, root?: string | string[]}
配置库的公开方式。
类型: string
默认情况下包含的类型为 'var'
、'module'
、'system'
、'assign'
、'assign-properties'
、'this'
、'window'
、'self'
、'global'
、'commonjs'
、'commonjs2'
、'commonjs-module'
、'commonjs-static'
、'amd'
、'amd-require'
、'umd'
、'umd2'
,但插件可能会添加其他类型。
对于以下示例,我们将使用 _entry_return_
来表示入口点返回的值。
这些选项将入口点的返回值(例如,入口点导出的任何内容)分配给由 output.library.name
在包被包含的任何范围内提供的名称。
当加载库时,入口点的返回值 将分配给一个变量
这将生成一个隐式全局,它有可能重新分配现有值(谨慎使用)
请注意,如果 MyLibrary
之前没有定义,则您的库将设置在全局范围内。
类似于 type: 'assign'
,但更安全,因为它会在 MyLibrary
已存在的情况下重新使用 MyLibrary
这些选项将入口点的返回值(例如,入口点导出的任何内容)分配给由 output.library.name
定义的特定对象下的名称。
入口点的返回值 将分配给 this
,并在 output.library.name
命名的属性下。this
的含义由您决定
入口点的返回值 将使用 output.library.name
值分配给 window
对象。
入口点的返回值 将使用 output.library.name
值分配给全局对象。根据 target
值,全局对象可能会相应地更改,例如 self
、global
或 globalThis
。
您的入口点的返回值将使用output.library.name
值分配给exports
对象。顾名思义,这在 CommonJS 环境中使用。
请注意,不设置output.library.name
将导致入口点返回的所有属性都分配给给定的对象;没有对现有属性名称的检查。
这些选项将生成一个带有完整头的捆绑包,以确保与各种模块系统兼容。output.library.name
选项将在以下output.library.type
选项下具有不同的含义。
输出 ES 模块。
但是此功能仍处于实验阶段,尚未完全支持,因此请确保事先启用experiments.outputModule
。此外,您可以在此线程中跟踪开发进度。
您的入口点的返回值将分配给module.exports
。顾名思义,这在 Node.js (CommonJS) 环境中使用
如果我们使用type: commmonjs2
指定output.library.name
,则您的入口点的返回值将分配给module.exports.[output.library.name]
。
想知道 CommonJS 和 CommonJS2 之间的区别吗?虽然它们很相似,但它们之间存在一些细微差别,在 Rspack 的上下文中通常不相关。(有关更多详细信息,请阅读此问题。)
单个导出将被设置为module.exports
上的属性。名称中的“static”是指输出是静态可分析的,因此命名导出可通过 Node.js 导入到 ESM 中
输入
输出
消费 (CommonJS)
消费 (ESM)
这将公开您的库作为 AMD 模块。
AMD 模块要求入口块(例如,<script>
标签加载的第一个脚本)使用特定属性定义,例如define
和require
,这通常由 RequireJS 或任何兼容的加载器(例如almond)提供。否则,直接加载生成的 AMD 捆绑包将导致错误,例如define is not defined
。
使用以下配置
生成的输出将使用名称"MyLibrary"
定义,即
捆绑包可以包含在脚本标签中,并且捆绑包可以这样调用
如果output.library.name
未定义,则会生成以下内容。
如果直接使用<script>
标签加载,此捆绑包将无法按预期工作,或者根本无法工作(在almond加载器的情况下)。它仅通过 RequireJS 兼容的异步模块加载器通过该文件的实际路径工作,因此在这种情况下,如果这些路径直接在服务器上公开,则output.path
和output.filename
可能对这种特定设置很重要。
这将使用立即执行的 AMD require(dependencies, factory)
包装器打包您的输出。
'amd-require'
类型允许使用 AMD 依赖项,而无需单独的后续调用。与'amd'
类型一样,这取决于适当的require
函数在加载 Rspack 输出的环境中可用。
使用此类型,库名称不可用。
这将公开您的库,使其在所有模块定义下都能工作,允许它与 CommonJS、AMD 和全局变量一起使用。查看UMD 存储库以了解更多信息。
在这种情况下,您需要library.name
属性来命名您的模块
最后输出为
请注意,省略library.name
将导致入口点返回的所有属性直接分配给根对象,如对象分配部分中所述。示例
输出将是
您可以为每个目标指定不同的名称,为library.name
指定一个对象
这将公开您的库作为System.register
模块。
系统模块要求在执行 Rspack 捆绑包时,浏览器中存在全局变量System
。编译为System.register
格式允许您System.import('/bundle.js')
而无需额外的配置,并将您的 Rspack 捆绑包加载到系统模块注册表中。
输出
通过在配置中添加output.library.name
以及将output.library.type
设置为system
,输出捆绑包将具有库名称作为System.register
的参数
type: 'jsonp'
这将把您的入口点的返回值包装到 jsonp 包装器中。
库的依赖项将由externals
配置定义。
指定应公开为库的哪个导出。
string | string[]
undefined
默认情况下为undefined
,它将导出整个(命名空间)对象。以下示例演示了在使用output.library.type: 'var'
时,此配置的效果。
您的入口点的默认导出将分配给库名称
您也可以将数组传递给output.library.export
,它将被解释为要分配给库名称的模块的路径
这是库代码
在 UMD 包装器中添加注释。
string | { amd?: string, commonjs?: string, commonjs2?: string, root?: string }
undefined
要为每个umd
类型插入相同的注释,请将auxiliaryComment
设置为字符串
这将产生以下结果
为了精细控制,请传递一个对象
boolean
undefined
当使用output.library.type: "umd"
时,将output.library.umdNamedDefine
设置为true
将命名 UMD 构建的 AMD 模块。否则,将使用匿名define
。
AMD 模块将是
boolean
false
将 JavaScript 文件输出为模块类型。默认情况下禁用,因为它是一个实验性功能。要使用它,您必须将experiments.outputModule
设置为true
。
启用后,Rspack 将在内部将output.iife
设置为false
,将output.scriptType
设置为'module'
,并将terserOptions.module
设置为true
。
如果您使用 Rspack 编译要供其他人使用的库,请确保在output.module
为true
时,将output.libraryTarget
设置为'module'
。
string
path.resolve(process.cwd(), 'dist')
输出目录作为绝对路径。
请注意,此参数中的[fullhash]
将被编译的哈希值替换。
路径中不能包含感叹号(!
),因为它被 Rspack 保留用于加载器语法)。
boolean | 'verbose'
true
告诉 Rspack 在捆绑包中包含有关包含模块的信息的注释。此选项在development
中默认为true
,在production
模式中默认为false
。'verbose'
显示更多信息,例如导出、运行时要求和中止。
虽然这些注释可以提供的数据在开发过程中阅读生成的代码时很有用,但它不应在生产中使用。
它还将一些有关树摇动的信息添加到生成的捆绑包中。
'auto' | string | ((pathData: PathData, assetInfo?: JsAssetInfo) => string)
targets
为'web'
或'webworker'
时,为'auto'
。否则为undefined
此选项确定引用的资源的 URL 前缀,例如:图像、文件等。
例如,给定一个配置文件。
对于非初始块文件,其请求 URL 如下所示:/assets/1.chunk.js
。
对于对图像的引用,请求 URL 如下所示:/assets/logo.png
。
此外,当您使用 CDN 部署产品时,它很有用
对于所有资产资源,它们的请求 URL 如下所示:https://cdn.example.com/assets/logo.png
。
动态设置 publicPath
您可以使用运行时代码中的__webpack_public_path__
动态设置publicPath
,而__webpack_public_path__
将覆盖 Rspack 配置中的publicPath
,但它只对动态加载的资源生效。
首先创建一个publicPath.js
然后将其导入入口文件的首行
'module' | 'text/javascript' | boolean
false
此选项允许使用自定义脚本类型加载异步块,例如<script type="module" ...>
。
如果output.module
设置为true
,则output.scriptType
将默认为'module'
而不是false
。
string
'[file].map[query]'
配置源映射的命名方式。仅当devtool
设置为'source-map'
(写入输出文件)时才生效。
可以使用来自 output.filename
的 [name]
、[id]
、[fullhash]
和 [chunkhash]
替换。除了这些,还可以使用 模板字符串 中“文件名级别”下列出的替换。
boolean
false
根据 EcmaScript 模块规范处理模块加载错误,但会影响性能。
告诉 Rspack 如果模块在被 require 时抛出异常,则将其从模块实例缓存 (require.cache) 中移除。
true | string | object
undefined
控制 Trusted Types 兼容性。启用后,Rspack 将检测 Trusted Types 支持,如果支持,则使用 Trusted Types 策略来创建它动态加载的脚本 URL。当应用程序运行在 require-trusted-types-for
内容安全策略指令下时使用。
默认情况下它被禁用(没有兼容性,脚本 URL 是字符串)。
true
时,Rspack 将使用 output.uniqueName
作为 Trusted Types 策略名称。policyName
属性中获取。string
output.library
名称或上下文中的 package.json
中的包名称,如果两者都找不到,则设置为 ''
。Rspack 构建的唯一名称,以避免在使用全局变量时多个 Rspack 运行时发生冲突。
output.uniqueName
将用于为以下内容生成唯一的全局变量:
false | 'fetch', 'async-node'
'fetch'
用于设置加载 WebAssembly 模块方法的选项。默认情况下包含的方法是 'fetch'
(web/webworker)、'async-node'
(Node.js),但可能由插件添加其他方法。
默认值可能会受到不同的 target
的影响。
target
设置为 'web'
、'webworker'
、'electron-renderer'
或 'node-webkit'
,则默认值为 'fetch'
。target
设置为 'node'
、'async-node'
、'electron-main'
或 'electron-preload'
,则默认值为 'async-node'
。string
'[hash].module.wasm'
指定 WebAssembly 模块的文件名。它应作为 output.path
目录中的相对路径提供。
false | 'jsonp' | 'import-scripts' | 'require' | 'async-node' | 'import'
false
新的选项 workerChunkLoading
控制工作者的块加载。
此选项的默认值取决于 target
设置。有关更多详细信息,请在 Rspack 默认值 中搜索 "workerChunkLoading"
。
string
""
为 Worker 设置公共路径,默认值为 output.publicPath 的值。仅当你的工作者脚本位于与其他脚本不同的路径中时才使用此选项。
false | 'fetch-streaming' | 'fetch' | 'async-node' | string
false
用于在工作者中设置加载 WebAssembly 模块方法的选项,默认值为 output.wasmLoading 的值。
建议使用 output.library.auxiliaryComment
代替。
我们可能会放弃对它的支持,因此建议使用 output.library.export,它与 libraryExport
的工作方式相同。
请使用 output.library.type
代替,因为我们可能会在将来放弃对 output.libraryTarget
的支持。
建议使用 output.library.umdNamedDefine
代替。
boolean
false
,生产模式为 true
Rspack 在 CSS 中添加一些元数据以解析 CSS 模块,此配置决定是否压缩这些元数据。
例如
压缩后 👇