output.manifest
- 类型:
string | boolean | ManifestObjectConfig
- 默认值:
false
配置如何生成 manifest 文件。
true
: 生成一个名为 manifest.json
的文件。
false
: 不生成 manifest 文件。
string
: 生成一个指定名称或路径的 manifest 文件。
object
: 生成一个指定选项的 manifest 文件。
manifest 文件包含所有构建产物的信息、以及 入口模块 与构建产物间的映射关系。
基础示例
添加以下配置来开启:
rsbuild.config.ts
export default {
output: {
manifest: true,
},
};
构建完成后,Rsbuild 会生成 dist/manifest.json
文件:
dist/manifest.json
{
"allFiles": [
"/static/css/index.[hash].css",
"/static/js/index.[hash].js",
"/static/images/logo.[hash].png",
"/index.html"
],
"entries": {
"index": {
"initial": {
"js": ["/static/js/index.[hash].js"],
"css": ["/static/css/index.[hash].css"]
},
"assets": ["/static/images/logo.[hash].png"],
"html": ["/index.html"]
}
}
}
Manifest 结构
manifest 文件默认输出的结构为:
type FilePath = string;
type ManifestList = {
entries: {
/** key 为 entry 名称,对应 Rsbuild 的 source.entry 配置 */
[entryName: string]: {
initial?: {
js?: FilePath[];
css?: FilePath[];
};
async?: {
js?: FilePath[];
css?: FilePath[];
};
/** 当前 entry 关联的 HTML 页面 */
html?: FilePath[];
/** 和当前 entry 相关的其他资源(如 png、svg、source map 等) */
assets?: FilePath[];
};
};
/** 铺平的所有 assets */
allFiles: FilePath[];
};
选项
output.manifest
可以是一个对象,以下是所有可选项:
filename
- 类型:
string
- 默认值:
'manifest.json'
指定 manifest 文件的名称或路径。
filename
可以是一个相对于 dist
目录的路径,比如输出为 dist/static/my-manifest.json
:
rsbuild.config.ts
export default {
output: {
manifest: {
filename: './static/my-manifest.json',
},
},
};
这可以简写为:
rsbuild.config.ts
export default {
output: {
manifest: './static/my-manifest.json',
},
};
generate
type ManifestGenerate = (params: {
files: FileDescriptor[];
manifestData: ManifestData;
}) => Record<string, unknown>;
- 默认值:
undefined
- 版本:
>= 1.2.0
通过 manifest.generate
函数可以自定义 manifest 文件的内容。该函数接收以下参数:
files
: 所有输出的文件的描述信息。
manifestData
: 默认的 manifest 数据。
例如,仅保留 allAssets
字段:
rsbuild.config.ts
export default {
output: {
manifest: {
generate: ({ manifestData }) => {
return {
allAssets: manifestData.allFiles,
};
},
},
},
};
你也可以基于 files
来自定义 manifest 文件的内容,files
的结构如下:
interface FileDescriptor {
name: string;
path: string;
isAsset: boolean;
isChunk: boolean;
isInitial: boolean;
isModuleAsset: boolean;
chunk?: import('@rspack/core').Chunk;
}
下面是 files
的一个示例:
const files = [
{
name: 'index.js',
path: '/static/js/index.[hash].js',
isAsset: false,
isChunk: true,
isInitial: true,
isModuleAsset: false,
chunk: {
// Chunk info...
},
},
{
name: 'index.html',
path: '/index.html',
isAsset: true,
isChunk: false,
isInitial: false,
isModuleAsset: false,
},
];
filter
type ManifestFilter = (file: FileDescriptor) => boolean;
- 默认值:
file => !file.name.endsWith('.LICENSE.txt')
- 版本:
>= 1.2.0
允许你过滤包含在 manifest 中的文件。该函数接收一个 file
参数,返回 true
表示保留该文件,返回 false
表示不保留该文件。
默认情况下,*.LICENSE.txt
文件不会被包含在 manifest 文件中,因为这些许可证文件仅用于声明开源协议,不会在运行时被使用。
例如,仅保留 *.js
文件:
rsbuild.config.ts
export default {
output: {
manifest: {
filter: (file) => file.name.endsWith('.js'),
},
},
};
生成的 manifest 文件中仅会包含 *.js
文件:
dist/manifest.json
{
"allFiles": ["/static/js/index.[hash].js"],
"entries": {
"index": {
"initial": {
"js": ["/static/js/index.[hash].js"]
}
}
}
}
或者是包含所有文件:
rsbuild.config.ts
export default {
output: {
manifest: {
filter: () => true,
},
},
};