Babel 插件

Rsbuild 默认使用 SWC 编译,当内置的功能无法满足诉求、需要添加一些 Babel presets 或 plugins 进行额外处理时,你可以使用 Rsbuild 的 Babel 插件。

TIP

添加 Babel 插件会在原有的 SWC 转译的基础上,额外执行 Babel 转译,产生额外的编译开销,并导致构建性能明显下降。

快速开始

安装插件

你可以通过如下的命令安装插件:

npm
yarn
pnpm
bun
npm add @rsbuild/plugin-babel -D

注册插件

你可以在 rsbuild.config.ts 文件中注册插件:

rsbuild.config.ts
import { pluginBabel } from '@rsbuild/plugin-babel';

export default {
  plugins: [pluginBabel()],
};

选项

你可以通过以下配置修改 babel-loader 的配置项。

  • 类型: Object | Function

  • 默认值:

{
  "babelrc": false,
  "compact": false,
  "configFile": false,
  "plugins": [],
  "presets": [
    [
      "@babel/preset-typescript",
      {
        "allExtensions": true,
        "allowDeclareFields": true,
        "allowNamespaces": true,
        "isTSX": true,
        "optimizeConstEnums": true,
      },
    ],
  ],
}

Function 类型

当配置项为 Function 类型时,默认 Babel 配置会作为第一个参数传入,你可以直接修改配置对象,也可以返回一个对象作为最终的 babel-loader 配置。

export default {
  plugins: [
    pluginBabel((config) => {
      // 添加一个插件,比如配置某个组件库的按需引入
      config.plugins.push([
        'babel-plugin-import',
        {
          libraryName: 'xxx-components',
          libraryDirectory: 'es',
          style: true,
        },
      ]);
    }),
  ],
};

函数的第二个参数提供了一些方便的工具函数,请继续阅读下方文档。

TIP

以上示例仅作为参考,通常来说,你不需要手动配置 babel-plugin-import,因为 Rspack SWC 编译已支持 transformImport 能力,Rsbuild 也提供了更通用的 source.transformImport 配置。

Object 类型

当配置项的值为 Object 类型时,会与默认配置通过 Object.assign 浅合并。

CAUTION

Object.assign 是浅拷贝,会完全覆盖内置的 presetsplugins 数组,导致内置的 presets 或 plugins 失效,请在明确影响面的情况下再使用这种方式。

export default {
  plugins: [
    pluginBabel({
      plugins: [
        [
          'babel-plugin-import',
          {
            libraryName: 'xxx-components',
            libraryDirectory: 'es',
            style: true,
          },
        ],
      ],
    }),
  ],
};

工具函数

配置项为 Function 类型时,第二个参数可用的工具函数如下:

addPlugins

  • 类型: (plugins: BabelPlugin[]) => void

添加若干个 Babel 插件。

export default {
  plugins: [
    pluginBabel((config, { addPlugins }) => {
      addPlugins([
        [
          'babel-plugin-import',
          {
            libraryName: 'xxx-components',
            libraryDirectory: 'es',
            style: true,
          },
        ],
      ]);
    }),
  ],
};

addPresets

  • 类型: (presets: BabelPlugin[]) => void

添加若干个 Babel 预设配置 (大多数情况下不需要增加预设)。

export default {
  plugins: [
    pluginBabel((config, { addPresets }) => {
      addPresets(['@babel/preset-env']);
    }),
  ],
};

removePlugins

  • 类型: (plugins: string | string[]) => void

移除 Babel 插件,传入需要移除的插件名称即可,你可以传入单个字符串,也可以传入一个字符串数组。

export default {
  plugins: [
    pluginBabel((config, { removePlugins }) => {
      removePlugins('babel-plugin-import');
    }),
  ],
};

removePresets

  • 类型: (presets: string | string[]) => void

移除 Babel 预设配置,传入需要移除的预设名称即可,你可以传入单个字符串,也可以传入一个字符串数组。

export default {
  plugins: [
    pluginBabel((config, { removePresets }) => {
      removePresets('@babel/preset-env');
    }),
  ],
};

调试 Babel 配置

当你通过配置项修改 babel-loader 配置后,可以在 Rsbuild 调试模式 下查看最终生成的配置。

首先通过 DEBUG=rsbuild 参数开启调试模式:

# 调试开发环境
DEBUG=rsbuild pnpm dev

# 调试生产环境
DEBUG=rsbuild pnpm build

然后打开生成的 rspack.config.web.js,搜索 babel-loader 关键词,即可看到完整的 babel-loader 配置内容。