Skip to content

指南 · 进阶

版本基线 Rspack 2.0。builtin:swc-loader 完整配置、webpack 迁移实操五步、插件兼容策略与压缩器陷阱、splitChunks/tree-shaking、Module Federation 三档支持。

一、builtin:swc-loader 完整配置

语法识别:detectSyntax

2.0 推荐 detectSyntax: 'auto'——按扩展名自动推断 parser(.ts→typescript、.tsx→typescript+tsx、.js/.jsx→ecmascript+jsx),一条 rule 吃下混合代码库。显式写了 jsc.parser.syntax 时以显式配置为准,不再推断。

降级目标:jsc.target 与 env.targets 二选一

js
options: {
  // 方式 A:ECMA 版本
  jsc: { target: 'es2015' },
  // 方式 B:browserslist(二者不能同时配置!)
  // env: { targets: ['chrome >= 87', 'firefox >= 78', 'safari >= 14'] },
},

2.0 改进:两者都不配时,builtin:swc-loader(连同内置压缩器)自动从顶层 target 派生降级目标,不必重复声明。

polyfill:env.mode

对位 Babel 的 useBuiltIns

js
options: {
  env: {
    mode: 'usage',          // 按实际用到的 API 注入(也可 'entry')
    coreJs: '3.44',
    targets: ['chrome >= 87'],
  },
},

⚠️ 必须把 core-js 排除出转译范围(core-js 自身被 SWC 编译会失效),并把它装进 dependencies

React:JSX 与 Fast Refresh

js
import ReactRefreshPlugin from '@rspack/plugin-react-refresh';
const isDev = process.env.NODE_ENV === 'development';

export default {
  plugins: [isDev && new ReactRefreshPlugin()].filter(Boolean),
  module: {
    rules: [{
      test: /\.(jsx?|tsx?)$/,
      loader: 'builtin:swc-loader',
      options: {
        detectSyntax: 'auto',
        jsc: { transform: { react: {
          runtime: 'automatic', development: isDev, refresh: isDev,
        } } },
      },
      type: 'javascript/auto',
    }],
  },
};

@babel/preset-react 与 Babel 版 react-refresh 插件都不再需要。类型检查仍是独立流程tsc --noEmit 并行跑,或上 ts-checker-rspack-plugin

二、webpack 迁移实操五步

  1. 换包npm add @rspack/core @rspack/cli @rspack/dev-server -D,再 npm remove webpack webpack-cli webpack-dev-serverwebpack-chain/webpack-mergerspack-chain/rspack-merge
  2. 改配置入口webpack.config.jsrspack.config.js(默认读取,无需指路径);scripts 改 rspack dev/build
  3. 换 loaderbabel-loader/swc-loaderbuiltin:swc-loader;file/url/raw-loader → asset modules;postcss-loader(常规场景)→ builtin:lightningcss-loader
  4. 换插件webpack.DefinePluginrspack.DefinePlugincopy-webpack-pluginrspack.CopyRspackPluginmini-css-extract-pluginrspack.CssExtractRspackPlugin(loader 同步换);其余查官方兼容清单
  5. 对齐压缩器terser-webpack-pluginrspack.SwcJsMinimizerRspackPlugincss-minimizer-webpack-pluginrspack.LightningCssMinimizerRspackPlugin

自定义 minimizer 的整体失效陷阱

一旦显式配置 optimization.minimizer,Rspack 的默认压缩器全部失效。只配了 JS 压缩器 → CSS 不再被压缩。两类要一起写:

js
optimization: {
  minimizer: [
    new rspack.SwcJsMinimizerRspackPlugin(),
    new rspack.LightningCssMinimizerRspackPlugin(),
  ],
},

三、插件兼容策略

官方口径:Top 50 高下载 webpack 插件 85%+ 可直接使用或有替代;API 对齐基准是 webpack 5。兼容清单分五档:

档位数量例子
完全兼容28html-webpack-plugin、webpack-bundle-analyzer、compression-webpack-plugin、@sentry/webpack-plugin
内置替代5copy/mini-css-extract/terser/css-minimizer/circular-dependency
替代方案10fork-ts-checker → ts-checker-rspack-plugin
部分兼容3webpack-assets-manifest(仅基本用法)
不兼容8@ngtools/webpack、critters-webpack-plugin 等

不兼容的根因通常是深度触碰 webpack 内部实现(JS 侧内部对象/未对齐 hooks)。处理顺序:查清单找替代 → 看内置能力(如 SRI 用 SubresourceIntegrityPlugin)→ 提 issue。

四、splitChunks 与 tree-shaking

splitChunks:webpack 配置直接搬

js
optimization: {
  splitChunks: {
    chunks: 'all',
    cacheGroups: {
      vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', priority: -10 },
    },
  },
},

chunks/cacheGroups/minSize/maxSize 语义与 webpack 一致;2.0 补齐 enforceSizeThreshold(生产默认 50000)。

tree-shaking:生产默认全开

mode: 'production' 自动启用 usedExportssideEffectsprovidedExportsinnerGraph。2.0 进一步增强静态分析:CommonJS require 的解构/属性访问分析、#__NO_SIDE_EFFECTS__ 编译器注解、optimization.inlineExports 等。日常要做的只有两件事:包内正确声明 package.jsonsideEffects;少写动态访问破坏静态结构。

五、Module Federation:三档支持

档位来源适用
v1.0rspack.container.ModuleFederationPluginV1与 webpack MF 对齐,迁移期用
v1.5内置 rspack.container.ModuleFederationPluginv1.0 全功能 + 运行时插件,多数项目推荐
v2.0@module-federation/enhanced/rspack动态 TS 类型提示、DevTools、预加载,大规模微前端
js
import { rspack } from '@rspack/core';
export default {
  output: { uniqueName: 'app1' },
  plugins: [
    new rspack.container.ModuleFederationPlugin({
      name: 'app1',
      exposes: { './Button': './src/Button' },
      remotes: { app2: 'app2@http://localhost:3002/remoteEntry.js' },
      shared: { react: { singleton: true } },
    }),
  ],
};

2.0 增强:shared 依赖支持 tree-shaking(裁剪到实际使用面);@module-federation/runtime-tools 改为可选 peerDependency。与 webpack 应用同页共存时注意 2.0 的 chunkLoadingGlobal 默认改名 rspackChunk*(反而避免了全局冲突)。


进入 指南 · 专家:为什么快(并行/增量架构)、性能三件套(incremental/持久缓存/lazyCompilation)、性能剖析、2.0 迁移清单与库构建。