你以为打包工具只能跑在服务器上?今天 Rolldown 用浏览器原生把它彻底翻了

Rolldown 的 1.2.x 系列最近做了一件以前没有任何打包工具做过的事:它的 WASI 构建直接在浏览器里跑通了。

这不是概念演示。Rolldown 1.2.4(2026-08-12)的发布日志里明确写了:packed @rolldown/browser 构建在真实浏览器页面里做了 smoke-test,完整的 Node.js 测试套件跑在 WASI binding 上,packed WASI 产物在 WebContainer 里被实际执行。同时修了一个 Android ARM 设备上的非法指令崩溃,把 sideEffects 否定 glob 的行为也改对了。

这件事的意义不是”又快了一点”。它的意义是:打包工具第一次可以跑在浏览器里,而且不只是跑,是真的在干活。

以前为什么没有

打包工具依赖 Node.js API,这是常识。fs.readFilecrypto.randomUUID、原生 addons,这些在浏览器里根本不存在。所以所有打包工具都假设自己跑在服务器或桌面环境里,浏览器只是产物目的地,不是构建场所。

WASI(WebAssembly System Interface)改变了这个前提。WASI 把文件系统、网络、时钟这些系统调用抽象成一套标准接口,让 WebAssembly 模块不需要修改就能在不同环境里跑。Rolldown 团队把整个 bundler 编译成 WASM,然后通过 WASI 接口补上所有缺失的系统调用——模块解析走 HTTP fetch、输出写进 Virtual FS、log 路径相对于 build 工作目录而非 process cwd。

这就是为什么 Rolldown 的 WASI 构建不只是”能运行”,而是真的在跑完整的 bundler 逻辑:解析依赖图、做 tree-shaking、生成 chunk。浏览器第一次成了构建工具的宿主环境。

多端 target 意味着什么

Rolldown 1.2.x 现在同时支持三个 target:Node.js(通过 napi)、WASI(浏览器/边缘)、纯 JS 兜底。这个多端设计不是为了炫技,它解决了一个实际问题:不同环境需要不同入口。

Vite 8 里,Rolldown 替换了原来 esbuild(dev)+ Rollup(prod)的双引擎架构。以前开发时 esbuild 做依赖预绑定的原因是它足够快,但 prod 用 Rollup 是因为 tree-shaking 更好。这两个工具行为不完全一致,所以偶尔会出现”dev 正常、prod 报错”的 bug,两个插件系统也增加了维护成本。

Rolldown 统一了两端:用同一个 bundler 做开发和生产构建,而且 Rollup 插件 API 完全兼容,现有 Vite 插件不需要改。用 Rust 写也意味着它天然支持多线程——Rolldown 可以并行处理多个 chunk,esbuild 单线程的瓶颈就不存在了。

Linear 迁移后生产构建从 46 秒降到 6 秒。Mercedes-Benz.io 测出构建时间减少 38%,Beehiiv 减少 64%。这些数字在不同项目里有差异,但趋势一致:Rust 让构建时间从”咖啡休息”变成了”秒开”。

代码分割这次改了什么

1.2.4 的代码分割改进比较细,但值得单独说一下。

namespace extraction 的范围扩大了:对于已经加载过的模块合并,Rolldown 现在能更激进地把公共命名空间提取出来。这意味着动态 import 场景下重复模块更少,输出图更干净。

sideEffects 否定 glob 的行为也修对了:之前 sideEffects: false 的否定写法会把模块错误地保留下来,导致 tree-shaking 失效,现在行为符合预期。

这两个改动加起来,对大型应用的分包质量有明显影响。如果你用动态路由+懒加载,这几个 patch 直接关系到用户最终下载的 JS 体积。

接下来会怎样

Rolldown 1.2.8(2026-09-02)是目前的最新稳定版,每五天一个 release,迭代速度很快。内建的 minification 功能还在 alpha 阶段,这是目前唯一没完全对齐 esbuild 的能力。

但从架构上看,Rolldown 已经不只是 Vite 的内部实现了:它是 VoidZero 统一工具链的核心,底下是 Oxc(parser/transformer/linter/formatter),上层是 Vite/ Rolldown 自己的 plugin hook。这条链路的每个环节都在 Rust 里,Vite 8 的安装体积从 ~50MB 降到了 ~18MB,CI 缓存和冷启动都受益。

下一步是 Full Bundle Mode:开发阶段也做全量打包,而不是现在的 unbundled dev(esbuild 那种直接 serve 源码)。这会让大型项目的 dev server 行为和 production 完全一致,进一步压缩”works on my machine”类 bug 的生存空间。

迁移检查清单

如果你已经在用 Vite 8,Rolldown 1.2.x 是默认跑起来的,不需要手动安装。如果你在用 Vite 7 或更早版本,升级到 Vite 8 会自动带进来,但要注意几个 breaking change:build.rollupOptions 改名为 build.rolldownOptionsoptimizeDeps.esbuildOptions 换成 optimizeDeps.rolldownOptions。Vite 8 有兼容层自动转换大多数配置,但如果你有自定义 esbuild 选项,需要手动迁移。

Rolldown 1.2.x 是稳定版本,可以直接在生产项目里用。内建 minification 还是 alpha,如果你的构建用到了 terser 或其他 CSS/JS 压缩工具,可以继续用它们,Rolldown 在这块不会强占你的配置。

Rolldown 的 WASI target 现在还不需要大多数项目关心,但如果你在做边缘计算或想在浏览器里跑构建验证,这个版本已经可以 smoke-test 了。

核心结论: 打包工具第一次可以跑在浏览器里,这不是噱头。Rolldown 1.2.x 通过 WASI 接口把 Rust bundler 完整跑在 WebContainer 和真实浏览器里,多端 target 路线已经走通,Vite 8 的双引擎统一是今年 JavaScript 工具链最大的一次架构迁移。

评论区

0 条评论

登录后可评论。

铁锈·Rust工具链 24 阅读