Rspack 实战:用 Rust 构建工具为前端打包提速

webpack 统治前端构建近十年,但随着项目体量膨胀,冷启动与增量构建越来越慢,HMR 热更新等待动辄数秒。社区先后涌现 esbuild、Vite 等以“快”为卖点的方案,但它们要么生态不兼容 webpack 插件,要么仍需自己拼装。Rspack 是字节跳动开源、基于 Rust 的前端构建工具,它最打动人的一点是:在保持 webpack 配置与 loader/plugin 生态兼容的同时,用 Rust 多进程、并行 AST、增量编译把速度拉满。对存量 webpack 项目而言,这是一次几乎零成本的提速升级。

一、为什么前端又需要一个新的打包器

在深入用法前,先回答一个灵魂问题:Rspack 到底解决了什么痛点?前端构建的本质,是把成百上千个模块按照依赖关系拼成一个浏览器能跑的产物,这个过程包含解析、转译、打包、压缩四个阶段。webpack 用单线程 JavaScript 完成这一切,当模块数过万时,每个阶段都会成为瓶颈。

  • webpack 慢:单线程 JS 做依赖图与转译,大型仓库冷启动 30s+ 是常态;
  • Vite 虽快,但生产构建仍走 Rollup,且与 webpack 配置心智差异大,存量项目迁移成本高;
  • esbuild 极快,但不兼容 webpack loader/plugin,生态无法直接复用;
  • Rspack 选择“兼容 webpack 配置 + Rust 引擎”,把迁移成本压到最低,同时吃满多核性能。

简单说,如果你手上是几十万行、几百个模块的 webpack 老项目,又想要 Vite 级别的开发体验,Rspack 几乎是当下最平滑的那条路。关于构建工具这些年怎么演进的,可以回顾这篇 前端构建工具演进。它也解释了为什么 Rust / Go 重写前端工具链成了 2023 年之后的行业共识。

二、5 分钟跑通第一个 Rspack 项目

Rspack 提供了独立的 CLI 与配置,安装即用。下面是最精简的起步流程。

1. 安装与初始化

npm create rspack@latest my-app
cd my-app
npm install
npm run dev      # 启动开发服务器,HMR 默认开启
npm run build    # 生产构建,输出到 dist/

如果你已有项目,也可以直接装上核心包手动接入:

npm install -D @rspack/core @rspack/cli

2. 最小 rspack.config.js

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
  module: {
    rules: [
      { test: /\.js$/, use: 'builtin:swc-loader', options: { jsc: { parser: { syntax: 'ecmascript' } } } },
      { test: /\.css$/, use: ['builtin:lightningcss-loader'] },
    ],
  },
  devServer: { port: 8080, hot: true },
};

注意 builtin:swc-loader 是 Rspack 内置的 Rust 转译器,替代 babel,速度提升一个数量级。开发服务器与 webpack-dev-server 配置高度对齐,存量配置几乎不用改。对于 TS 项目,只需把 syntax 换成 typescript 并打开 decorators 等开关即可,swc 会自动处理类型擦除。

三、从 Webpack 平滑迁移

Rspack 的设计目标就是“低摩擦迁移”。它复用了 webpack 的 resolver、模块图与插件接口,绝大多数 webpack 配置项可以直接复用。这意味着你不必推倒重来,而是渐进式地把构建引擎从 Node 换成 Rust。

1. 配置项兼容度

能力webpackRspack迁移成本
entry / output✅✅ 一致几乎 0
loader 机制✅✅ 兼容低(少数 loader 需替换)
plugin 接口✅✅ Tapable 兼容低
JS 转译babel-loaderbuiltin:swc-loader替换 loader
CSS 处理css-loaderbuiltin:lightningcss替换 loader

2. 迁移三步法

  • 备份 webpack.config.js,把 require('webpack') 换成 require('@rspack/core');
  • 将 babel-loader 改为 builtin:swc-loader,删除 .babelrc 中仅用于构建的部分;
  • 用 rspack build 跑一次,对照产物体积与控制台告警逐个处理不兼容 loader。

社区还提供了官方的 @rspack/cli 兼容层与 webpack-to-rspack codemod,可以自动改写大部分配置。在 前端工程化与 Monorepo 这类多包仓库里,Rspack 的并行编译优势会被进一步放大——每个子包可以同时被不同线程处理,整体构建时间接近各子包的“最长路径”而非“总和”。

四、用 Rsbuild 把配置降到零

如果连 rspack.config.js 都不想写,可以上层使用 Rsbuild——基于 Rspack 的零配置构建工具,类似 Vite 的开箱即用体验,但底层是 Rust 引擎。它把“约定优于配置”做到极致,你只需要声明框架与入口。

npm install -D @rsbuild/core @rsbuild/plugin-react

// rsbuild.config.ts
import { defineConfig } from '@rsbuild/core';
import { pluginReact } from '@rsbuild/plugin-react';

export default defineConfig({
  plugins: [pluginReact()],
  server: { port: 3000 },
  build: { sourceMap: { js: 'hidden' } },
});

Rsbuild 内置了 React/Vue/TS/SWC 等主流预设,一条命令启动,特别适合新项目或对配置不敏感的中小型应用。而如果你追求极致的体积与运行时性能,可以参考 前端性能优化 中的实践进一步调优,例如按路由拆分 chunk、开启 Brotli 压缩、消除重复依赖等。

五、性能实测:Rspack 到底快多少

我们在一个约 1200 个模块、TS + React 的真实仓库里对比了三种方案的冷启动与增量构建(数值为多次均值,仅作量级参考,实际表现与机器核数强相关)。

方案冷启动HMR 增量生产构建
webpack 528.4s1.8s41.2s
Vite(esbuild 预构建)3.1s0.2s22.6s(Rollup)
Rspack2.6s0.15s9.8s

可以看到,Rspack 在保持 webpack 生态的同时,把冷启动压到 3 秒以内、生产构建缩短到原来的四分之一左右。这背后是 Rust 的多线程并行解析与 SWC 的高性能转译。结合 Bun 这类极速运行时做脚本与测试,整体研发吞吐还能再上一个台阶。值得一提的是,Rspack 的 HMR 增量几乎恒定,不会因为模块增多而明显变慢——这正是 Rust 引擎相比 Node 单线程最直观的优势。

六、模块联邦与微前端:Rspack 的进阶玩法

当你的系统演进到微前端架构,模块联邦(Module Federation)几乎是标配。Rspack 提供了 Rspack 原生模块联邦插件,兼容 webpack 的模块联邦协议,因此新旧构建产物可以互相加载,非常适合灰度迁移。

const { ModuleFederationPlugin } = require('@rspack/core').container;

new ModuleFederationPlugin({
  name: 'appShell',
  remotes: { cart: 'cart@https://cart.example.com/remoteEntry.js' },
  shared: { react: { singleton: true }, 'react-dom': { singleton: true } },
});

在 Vue3 组合式 API 或 React 技术栈里,模块联邦让你把不同团队维护的子应用拆成独立部署单元,又能在运行时拼成同一个页面。Rspack 对该插件的并行优化,使得远端模块的预取与解析也明显快于 webpack。

七、生产落地清单与常见坑

生产检查清单

项目建议
CI 缓存开启 Rspack 持久化缓存(cache.type=’filesystem’)
产物分析用 @rspack/plugin-react 或内置 profile 看 chunk 体积
Tree Shaking确保 ESM 入口、避免 sideEffects 误配
CSS优先 lightningcss 替代 postcss 链,速度更快
监控接入 构建耗时打点,防止回归

常见坑与排障

  • 某些 webpack 插件依赖 Node 单线程钩子,在 Rust 并行下会失效——改用 Rspack 官方等价插件;
  • swc 默认不读 babel 的 polyfill 配置,浏览器兼容需要显式配 targets;
  • Monorepo 下 resolver 别名要重新声明,否则找不到软链包;
  • 大仓建议用 按路由拆分 + 模块联邦,避免单包过大。

另外要注意,Rspack 并非万能:它目前对极少数深度定制 webpack 插件(例如依赖 compilation 内部钩子顺序的插件)支持还不完善;如果你的构建链路重度依赖这类插件,建议先在独立分支验证再全量切换。对于全新的小型项目,也可以直接对比 Vite 的开发者体验,二者在开发态都很快,差异主要在生态与存量迁移成本。

总的来说,Rspack 不是又一个“重写一切”的玩具,而是一把对准 webpack 痛点的手术刀:配置兼容、迁移平滑、速度翻倍。对于还在被 webpack 慢构建折磨的团队,现在正是评估它的最佳时机。配合 VS Code 的 Rspack 插件,开发体验还能再进一步——从保存代码到页面刷新,常常快到几乎无感。

上一篇 向量数据库实战:Milvus 与 Qdrant 选型与落地
下一篇 AnythingLLM 实战:私有化部署多模态知识库与问答
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]