close
  • 简体中文
  • 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 = {
      /**
       * 所有构建产物文件的扁平列表
       */
      allFiles: FilePath[];
      /**
       * 将每个入口名称映射到其关联的输出文件
       */
      entries: {
        [entryName: string]: {
          /**
           * 入口在初始加载阶段所需的文件
           */
          initial?: {
            /** 当前入口的初始 JavaScript 文件 */
            js?: FilePath[];
            /** 当前入口的初始 CSS 文件 */
            css?: FilePath[];
          };
          /**
           * 异步加载的文件
           * 通常是代码分割的 chunk 或懒加载的资源
           */
          async?: {
            /** 当前入口的异步 JavaScript 文件 */
            js?: FilePath[];
            /** 当前入口的异步 CSS 文件 */
            css?: FilePath[];
          };
          /** 当前入口生成的 HTML 文件(如果有) */
          html?: FilePath[];
          /**
           * 与当前入口关联的其他资源
           * 例如图片、字体、source map 以及其他非 JS 或 CSS 文件
           */
          assets?: FilePath[];
        };
      };
      /**
       * 所有产物文件的子资源完整性(SRI)哈希值
       * key 为文件路径,value 为对应的完整性哈希
       * 仅在启用 `security.sri` 选项时才会生成该字段
       */
      integrity: Record<string, string>;
    };

    通过 hooks 访问

    你可以通过 Rsbuild 的 hooksEnvironment API 访问生成的 manifest 数据。

    例如:

    api.onAfterBuild(({ environments }) => {
      console.log(environments.web.manifest);
    });

    参考 Environment API - manifest 了解更多。

    SRI

    当启用 security.sri 选项后,manifest 文件会包含 integrity 字段,用于存储支持 SRI 的资源(例如 JavaScript 和 CSS 文件)的哈希值。

    rsbuild.config.ts
    export default {
      security: {
        sri: {
          enable: 'auto',
        },
      },
      output: {
        manifest: true,
      },
    };
    dist/manifest.json
    {
      "allFiles": ["/static/js/index.[hash].js", "/index.html"],
      "integrity": {
        "/static/js/index.[hash].js": "sha384-[sri-hash]"
      }
    }

    选项

    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,
      },
    ];

    prefix

    • 类型: boolean
    • 默认值: true

    控制是否在 manifest 中的文件路径前添加静态资源前缀,即 dev.assetPrefixoutput.assetPrefix

    prefixtrue(默认值)时,生成的 manifest 会包含完整的资源前缀。

    rsbuild.config.ts
    export default {
      output: {
        assetPrefix: 'https://example.com/',
        manifest: true,
      },
    };

    生成的 manifest 文件示例:

    dist/manifest.json
    {
      "allFiles": ["https://example.com/static/js/index.[hash].js", "https://example.com/index.html"],
      "entries": {
        "index": {
          "initial": {
            "js": ["https://example.com/static/js/index.[hash].js"]
          }
        }
      }
    }

    如果将 prefix 设置为 false,manifest 中的路径将保持相对形式,不会附加静态资源前缀。

    rsbuild.config.ts
    export default {
      output: {
        assetPrefix: 'https://example.com/',
        manifest: {
          prefix: false,
        },
      },
    };

    生成的 manifest 文件示例:

    dist/manifest.json
    {
      "allFiles": ["static/js/index.[hash].js", "index.html"],
      "entries": {
        "index": {
          "initial": {
            "js": ["static/js/index.[hash].js"]
          }
        }
      }
    }

    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,
        },
      },
    };

    多个环境

    在使用 environments 并配置多个环境时,请为每个环境指定独立的 manifest.filename 值,以防止不同环境生成的 manifest 文件相互覆盖。

    例如,为 web 环境使用默认的 manifest.json,同时为 node 环境使用 manifest-node.json

    rsbuild.config.ts
    export default {
      environments: {
        web: {
          output: {
            manifest: true,
          },
        },
        node: {
          output: {
            target: 'node',
            manifest: {
              filename: 'manifest-node.json',
            },
          },
        },
      },
    };

    你也可以选择性地仅为特定环境生成 manifest 文件:

    rsbuild.config.ts
    export default {
      environments: {
        web: {
          output: {
            manifest: true,
          },
        },
        node: {
          output: {
            target: 'node',
          },
        },
      },
    };

    版本历史

    版本变更内容
    v1.6.8新增 integrity 字段
    v1.6.12新增 prefix 选项