close
  • 简体中文
  • 配置 Rsbuild

    Rsbuild 提供了丰富的配置项,并为每个配置项预设了一个通用的默认值,它可以满足大部分使用场景。因此,在大多数情况下,你不需要声明任何 Rsbuild 配置,直接开箱使用即可。

    如果你需要定制一些构建行为,那么可以使用这些配置项。

    配置结构

    Rsbuild 的配置结构如下所示:

    rsbuild.config.mjs
    export default {
      plugins: [
        // 配置 Rsbuild 插件
      ],
      dev: {
        // 与本地开发有关的选项
      },
      html: {
        // 与 HTML 生成有关的选项
      },
      tools: {
        // 与底层工具有关的选项
      },
      output: {
        // 与构建产物有关的选项
      },
      resolve: {
        // 与模块解析相关的选项
      },
      source: {
        // 与输入的源代码相关的选项
      },
      server: {
        // 与 Rsbuild 服务器有关的选项
        // 主要用于本地开发和预览
        // 部分选项(如 publicDir、base)也会影响生产构建
      },
      security: {
        // 与 Web 安全有关的选项
      },
      performance: {
        // 与构建性能、运行时性能有关的选项
      },
      moduleFederation: {
        // 与模块联邦有关的选项
      },
      environments: {
        // 为每个环境定义不同的 Rsbuild 配置
      },
    };

    你可以在 Config 总览 页面找到所有配置项的详细说明。

    配置文件

    当你使用 Rsbuild 的 CLI 命令时,或者在未指定 path 的情况下调用 loadConfig 时,Rsbuild 会自动读取当前项目根目录下的配置文件,并按以下顺序进行解析:

    • rsbuild.config.ts
    • rsbuild.config.js
    • rsbuild.config.mts
    • rsbuild.config.mjs
    • rsbuild.config.cts
    • rsbuild.config.cjs

    如果同时存在多个配置文件,Rsbuild 会使用这个列表中第一个匹配到的文件。

    我们推荐使用 rsbuild.config.ts,并从 @rsbuild/core 中导入 defineConfig 工具函数, 它提供了友好的 TypeScript 类型推导和自动补全,可以帮助你避免配置中的错误。

    比如在 rsbuild.config.ts 中,你可以定义 Rsbuild 的 resolve.alias 配置:

    rsbuild.config.ts
    import { defineConfig } from '@rsbuild/core';
    
    export default defineConfig({
      resolve: {
        alias: {
          '@common': './src/common',
        },
      },
    });
    Tip

    如果 Node.js 在加载 rsbuild.config.ts 时出现 [MODULE_TYPELESS_PACKAGE_JSON] 警告,你可以在 package.json 中添加 "type": "module",或将文件重命名为 rsbuild.config.mts 来解决该警告。

    如果你在开发一个非 TypeScript 项目,可以使用 .mjs 格式的配置文件:

    rsbuild.config.mjs
    import { defineConfig } from '@rsbuild/core';
    
    export default defineConfig({
      resolve: {
        alias: (opts) => {
          opts['@common'] = './src/common';
        },
      },
    });

    指定配置文件

    Rsbuild CLI 通过 --config 选项来指定配置文件,可以设置为相对路径或绝对路径。

    例如,你需要在执行 build 命令时使用 rsbuild.prod.config.mjs 文件,可以在 package.json 中添加如下配置:

    package.json
    {
      "scripts": {
        "build": "rsbuild build --config rsbuild.prod.config.mjs"
      }
    }

    你也可以将 --config 选项缩写为 -c

    rsbuild build -c rsbuild.prod.config.mjs

    指定加载方式

    Rsbuild 提供了三种配置文件加载方式:

    • auto(默认):优先使用 Node.js 原生 loader 来加载配置文件,失败时回退到使用 jiti 加载。

    • jiti:使用 jiti 来加载配置文件,提供 ESM 与 CommonJS 的互操作性,模块解析的行为与 Node.js 原生行为存在一定差异。

    • native:使用 Node.js 原生 loader 来加载配置文件,这可以保证模块解析的行为与 Node.js 原生行为一致,并且性能更好。这要求你使用的 JavaScript 运行时已经原生支持 TypeScript。

      例如,Node.js 从 v22.6.0 开始已经原生支持 TypeScript,你可以运行如下命令来使用 Node.js 原生 loader 来加载配置文件:

      # Node.js >= v22.18.0
      # 不需要设置 --experimental-strip-types
      npx rsbuild build --config-loader native
      
      # Node.js v22.6.0 - v22.17.1
      # 需要设置 --experimental-strip-types
      NODE_OPTIONS="--experimental-strip-types" npx rsbuild build --config-loader native

    关于 Node.js 原生 loader

    使用 Node.js 原生 loader 时,请注意以下限制:

    1. 导入 JSON 文件时,需要使用 import attributes:

      import pkgJson from './package.json' with { type: 'json' }; // ✅ 正确
      import pkgJson from './package.json'; // ❌ 错误
    2. 导入 TypeScript 文件时,需要包含 .ts 扩展名:

      import baseConfig from './rsbuild.base.config.ts'; // ✅ 正确
      import baseConfig from './rsbuild.base.config'; // ❌ 错误

    详见 Node.js - Running TypeScript Natively

    使用环境变量

    在配置文件中,你可以使用 process.env.NODE_ENV 等 Node.js 环境变量,来动态写入不同的配置:

    rsbuild.config.ts
    import { defineConfig } from '@rsbuild/core';
    
    export default defineConfig({
      resolve: {
        alias: {
          '@request':
            process.env.NODE_ENV === 'development' ? './src/request.dev.js' : './src/request.prod.js',
        },
      },
    });

    导出配置函数

    Rsbuild 支持在配置文件中导出一个函数,你可以在函数中动态计算配置,并返回给 Rsbuild。

    rsbuild.config.js
    import { defineConfig } from '@rsbuild/core';
    
    export default defineConfig(({ env, command, envMode }) => ({
      resolve: {
        alias: {
          '@foo': env === 'development' ? './src/foo.dev.ts' : './src/foo.prod.ts',
        },
      },
    }));
    Tip

    导出的配置函数必须提供一个返回值,如果你不需要返回任何配置,可以 return 一个空对象。

    该函数接受以下入参:

    env

    • 类型: string
    • 默认值: process.env.NODE_ENV

    当前运行的环境。

    • 运行 rsbuild dev 时,env 的默认值为 development
    • 运行 rsbuild buildrsbuild preview 时,env 的默认值为 production

    envMode

    • 类型: string
    • 默认值: process.env.NODE_ENV

    CLI 参数 --env-mode 当前的值。

    比如,当运行 rsbuild build --env-mode test 时,envMode 的值为 test

    command

    • 类型: string

    当前运行的 CLI 命令,如 devbuildpreview

    导出异步函数

    Rsbuild 也支持在配置文件中导出一个异步函数,你可以在函数中进行一些异步操作:

    rsbuild.config.js
    import { defineConfig } from '@rsbuild/core';
    
    export default defineConfig(async ({ env, command }) => {
      const result = await someAsyncFunction();
    
      return {
        html: {
          title: result,
        },
      };
    });

    合并配置

    你可以使用 @rsbuild/core 导出的 mergeRsbuildConfig 函数来合并多个配置。

    rsbuild.config.ts
    import { defineConfig, mergeRsbuildConfig } from '@rsbuild/core';
    
    const config1 = defineConfig({
      dev: { port: '3000' },
    });
    const config2 = defineConfig({
      dev: { port: '3001' },
    });
    
    // { dev: { port: '3001' }
    export default mergeRsbuildConfig(config1, config2);

    调试配置

    在执行构建时,你可以添加 DEBUG=rsbuild 环境变量来开启 Rsbuild 的调试模式。

    DEBUG=rsbuild pnpm dev

    在调试模式下,Rsbuild 会将内部最终生成的 Rsbuild 配置写入到产物目录下,便于开发者查看和调试。

    config inspection completed, generated files:
    
      - Rsbuild config: /Project/demo/dist/.rsbuild/rsbuild.config.mjs
      - Rspack config (web): /Project/demo/dist/.rsbuild/rspack.config.web.mjs

    打开生成的 /dist/.rsbuild/rsbuild.config.mjs 文件,即可查看 Rsbuild 配置的完整内容。

    关于调试模式的完整介绍,请查看 开启调试模式 章节。