内置 swc-loader

builtin:swc-loaderswc-loader 的 Rust 版本,旨在提供更好的性能。加载器的 配置 与 JS 版本的 swc-loader 保持一致。

示例

如果你需要在你的项目中使用 builtin:swc-loader,请按照以下方式进行配置

TypeScript 编译

要编译 .ts 文件

module.exports = {
  module: {
    rules: [
      {
        test: /\.ts$/,
        exclude: [/node_modules/],
        loader: 'builtin:swc-loader',
        options: {
          jsc: {
            parser: {
              syntax: 'typescript',
            },
          },
        },
        type: 'javascript/auto',
      },
    ],
  },
};

JSX 编译

要编译 React 的 .jsx 文件

module.exports = {
  module: {
    rules: [
      {
        test: /\.jsx$/,
        use: {
          loader: 'builtin:swc-loader',
          options: {
            jsc: {
              parser: {
                syntax: 'ecmascript',
                jsx: true,
              },
              transform: {
                react: {
                  pragma: 'React.createElement',
                  pragmaFrag: 'React.Fragment',
                  throwIfNamespace: true,
                  development: false,
                  useBuiltins: false,
                },
              },
            },
          },
        },
        type: 'javascript/auto',
      },
    ],
  },
};

语法降级

SWC 提供 jsc.targetenv.targets 用于指定 JavaScript 语法降级的目标。

jsc.target

jsc.target 用于指定 ECMA 版本,例如 es5es2015es2016 等。

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'builtin:swc-loader',
          options: {
            jsc: {
              target: 'es2015',
            },
            // ...other options
          },
        },
      },
    ],
  },
};

env.targets

env.targets 使用 browserslist 语法指定浏览器范围,例如

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'builtin:swc-loader',
          options: {
            env: {
              targets: [
                'chrome >= 87',
                'edge >= 88',
                'firefox >= 78',
                'safari >= 14',
              ],
            },
            // ...other options
          },
        },
      },
    ],
  },
};
提示

jsc.targetenv.targets 无法同时配置,请根据你的需求选择其中一个。

Polyfill 注入

在你的项目中使用更高版本的 JavaScript 语法和 API 时,为了确保编译后的代码可以在更低版本浏览器中运行,通常需要进行两部分的降级:语法降级和 Polyfill 注入。

SWC 支持注入 core-js 作为 API Polyfill,可以通过 env.modeenv.coreJs 进行配置

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'builtin:swc-loader',
          options: {
            env: {
              mode: 'usage',
              coreJs: '3.26.1',
              targets: [
                'chrome >= 87',
                'edge >= 88',
                'firefox >= 78',
                'safari >= 14',
              ],
            },
            // ...other options
          },
        },
      },
    ],
  },
};

类型声明

你可以使用 @rspack/core 导出的 SwcLoaderOptions 类型来启用类型提示

  • rspack.config.js:
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'builtin:swc-loader',
          /** @type {import('@rspack/core').SwcLoaderOptions} */
          options: {
            // some options
          },
        },
      },
    ],
  },
};
  • rspack.config.ts:
import type { SwcLoaderOptions } from '@rspack/core';

export default {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'builtin:swc-loader',
          options: {
            // some options
          } satisfies SwcLoaderOptions,
        },
      },
    ],
  },
};

选项

以下是 SWC 配置和 Rspack 特定配置的一些介绍。请参考 SWC 配置 查看完整的选项。

jsc.experimental.plugins

稳定性实验性
警告

Wasm 插件与 SWC 的版本紧密耦合,你需要选择与对应 SWC 版本兼容的 Wasm 插件才能正常使用。selecting-swc-core.

你可以查看更多关于如何选择正确 Wasm 插件版本的兼容性信息,参见

Rspack 支持在 builtin:swc-loader 中加载 Wasm 插件,你可以指定插件名称,例如

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'builtin:swc-loader',
          options: {
            jsc: {
              experimental: {
                plugins: [
                  [
                    '@swc/plugin-remove-console',
                    {
                      exclude: ['error'],
                    },
                  ],
                ],
              },
            },
          },
        },
      },
    ],
  },
};

这是一个 示例,展示了 Wasm 插件的使用方式。

rspackExperiments

Rspack 提供的实验性功能。

rspackExperiments.import

稳定性实验性

babel-plugin-import 移植而来,配置基本相同。

函数无法在配置中使用,例如 customNamecustomStyleName,因为这些函数必须从 Rust 中调用,所以会带来一些性能开销。受 modularize_imports 的启发,一些简单的函数可以用模板字符串代替。因此,像 customNamecustomStyleName 这样的函数类型配置可以传入字符串作为模板,以替代函数并提高性能。

例如

import { MyButton as Btn } from 'foo';

应用以下配置

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        use: 'builtin:swc-loader',
        options: {
          ...
          rspackExperiments: {
            import: [{
               libraryName: 'foo',
               customName: 'foo/es/{{ member }}',
            }]
          }
        }
      }
    ]
  }
};

{{ member }} 将被导入的标识符替换

import Btn from 'foo/es/MyButton';

模板 customName: 'foo/es/{{ member }}' 等同于 customName: (member) => `foo/es/${member}` ,但模板字符串没有 Node-API 的性能开销。

这里使用的模板是 handlebars。有一些有用的内置助手,以上面的导入语句为例

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        use: 'builtin:swc-loader',
        options: {
          ...
          rspackExperiments: {
            import: [{
               libraryName: 'foo',
               customName: 'foo/es/{{ kebabCase member }}',
            }]
          }
        }
      }
    ]
  }
};

转换为

import Btn from 'foo/es/my-button';

除了 kebabCase,还有 camelCasesnakeCaseupperCaselowerCaselegacyKebabCase/legacySnakeCase 可以使用。

legacyKebabCase/legacySnakeCase 的工作方式与 1.13.7 之前的 babel-plugin-import 版本相同。

你可以查看 babel-plugin-import 的文档,了解其他配置。

ant-design 的经典 4.x 版本为例,我们只需要配置如下

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        use: 'builtin:swc-loader',
        options: {
          ...
          rspackExperiments: {
            import: [
              {
                libraryName: 'antd',
                style: '{{member}}/style/index.css',
            },
            ]
          }
        }
      }
    ]
  }
};

上述配置将把 import { Button } from 'antd'; 转换为

import Button from 'antd/es/button';
import 'antd/es/button/style/index.css';

然后你就可以看到样式文件被自动导入并应用到页面上。

当然,如果你已经配置了对 less 的支持,你可以简单地使用以下配置

rspack.config.js
module.exports = {
  module: {
    rules: [
      {
        use: 'builtin:swc-loader',
        options: {
          ...
          rspackExperiments: {
            import: [
              {
                libraryName: 'antd',
                style: true,
            },
            ]
          }
        }
      }
    ]
  }
};

上述配置将把 import { Button } from 'antd'; 转换为

import Button from 'antd/es/button';
import 'antd/es/button/style';