Rspack 1.2 发布公告

2025 年 1 月 21 日

Rspack 1.2

@jerrykingxyz@chenjiahan@JSerFeng@ahabhgk 发布


Rspack v1.2 已经正式发布!

值得关注的变更如下:

新功能

支持持久化缓存

在 Rspack v1.2 中,我们实验性的支持了持久化缓存,其会将构建中的缓存信息写入到存储介质中,加速下次 Rspack 的启动速度。

rspack.config.mjs
export default {
  cache: true,
  experiments: {
    cache: {
      type: 'persistent',
    },
  },
};

当构建命中缓存时,它可以在真实项目中带来高达 250% 的性能提升。

项目类型 模块数量 Normal dev Cold dev Hot dev
初始项目 26 146 ms 149 ms (+2%) 134 ms (-8%)
包含 10000 个模块的项目 10040 2.43 s 2.43 s (+0%) 1.16 s (-52%)
包含 Less 文件的中型项目 1898 3.47 s 3.55 s (+2%) 0.92 s (-73%)
大型真实项目 45968 93.3 s 91.9 s (-1%) 26 s (-72%)

需要注意的是,持久化缓存目前仍处于实验阶段,当前仅支持构建过程中的 make 阶段(包括模块解析、转换等流程)。未来我们将持续优化,进一步提升缓存的性能和覆盖范围。

如果你在使用持久化缓存时遇到任何问题,欢迎通过 GitHub Issues 反馈。

详情请参考 experiments.cache

支持 Yarn PnP

Rspack 迎来了对 Yarn PnP 的支持,其默认根据 process.versions.pnp(即应用在 Yarn PnP 环境中运行时)来进行开启,也可以将 resolve.pnp 配置为 true 来强制开启。

rspack.config.mjs
export default {
  resolve: {
    pnp: true,
  },
};

在此特别感谢 @arcanis(Yarn 的维护者),为 Rspack 的 resolver 实现了 PnP 解析。

详情请参考 resolve.pnp

性能优化

更快的 code splitting

在之前的 Rspack 版本中,code splitting 算法在 HMR 下会占用大量的耗时,在 Rspack v1.2 中,我们实现了全新的 code splitting 算法,它支持多线程,增量构建效率更高。如果你的代码库包含大量动态导入,code splitting 可能会花费大量时间,开启这项新功能可以显著提高 code splitting 的性能。

rspack.config.mjs
export default {
  experiments: {
    parallelCodeSplitting: true,
  },
};

详情请参考 experiments.parallelCodeSplitting

Watch 范围变化

Rspack v1.2 将不再监听 node_modules.git 目录下的文件变动,这将显著减少监听的文件数目并带来性能提升。

通过 benchmark 仓库 中的数据,这项调整将:

  • 减少内存占用 120MB
  • 提升 Dev 启动速度 40%
  • 提升 HMR 速度 20~30%

这个变更不会影响 monorepo 中的符号链接资源,因为 Rspack 默认将符号链接资源解析为它的真实路径。

如果你倾向于保持之前的行为,可以设置 :

rspack.config.mjs
export default {
  watchOptions: {
    ignored: [],
  },
};

详情请参考 watchOptions.ignored

减少内存使用

我们优化了在 rspack-sources 计算过程中用于存储字符串的数据结构。在整个计算过程中,所有字符串数据都指向根节点的字符串堆内存,有效避免了计算过程中产生新的字符串分配。

详见:perf: reduce memory consumption of CachedSource

更小的压缩体积

Rspack v1.2 将 SWC 压缩器的默认 passes 设置为 2,以减少 1%-7% 的打包体积。

new rspack.SwcJsMinimizerRspackPlugin({
  minimizerOptions: {
    compress: {
      // 在之前的版本中默认为 1
      passes: 2,
    },
  },
});

passes 是运行压缩的最大次数。在某些情况下,多次压缩可以产生更小的代码。考虑到 Rspack 本身的性能优势,我们将默认值设为 2 以在构建性能和打包体积之间取得最佳平衡。

详见:feat: set default SWC minimizer passes to 2 to reduce bundle size

更快的副作用优化

我们对副作用优化的实现进行了重构,采用了更简洁且更易并行化的方案。通过充分利用多线程并行处理能力,在测试项目中,这个阶段的性能获得了 2-3 倍的提升。

详见:perf: parallelize side effects optimization

生态系统

Angular 支持

Nx 团队的核心成员 Colum Ferry 为 Rspack 生态带来了完整的 Angular 支持。

通过新发布的 @ng-rsbuild/plugin-angular@ng-rspack/build 包,开发者现在可以使用 Rspack 或 Rsbuild 来构建 Angular 应用,获得更快的构建性能和模块联邦等特性。

欢迎访问 ng-rspack-build 仓库了解详细信息。

Rsbuild v1.2

Rsbuild v1.2 已经与 Rspack v1.2 同步发布,并带来了多项新特性:

详情请参考 Rsbuild v1.2.0

升级指南

升级 SWC 插件

在 Rspack v1.2 中,Rust 依赖包 swc_core 的版本已升级到 10.1.0。SWC Wasm 插件的用户需要确保与正在使用的 swc_core 版本一致,否则可能会导致意外问题。

详情请参考 常见问题 - SWC 插件版本不匹配

WarnCaseSensitiveModules 默认关闭

WarnCaseSensitiveModulesPlugin 插件用于检查模块的路径,并对路径全部为小写的冲突模块发出警告。Rspack 过去默认启用它,但由于它只是一个 linter 插件,并且它在开发模式下会产生额外的性能开销。所以现在 Rspack 默认禁用了这项功能。

如果你倾向于保持之前的行为,可以设置:

rspack.config.mjs
import { rspack } from '@rspack/core';

export default {
  plugins: [new rspack.WarnCaseSensitiveModulesPlugin()],
};