跳至内容

Rolldown 简介

TL;DR

Rolldown 是一个以 Rust 编写的 JavaScript 打包器,旨在作为 Vite 中使用的未来打包器。它提供与 Rollup 兼容的 API 和插件接口,但在范围内将与 esbuild 更加类似。

🚧 开发中

Rolldown 当前正在积极开发中,尚未可用于生产。但我们目前已将其开源,以便我们可以开始与社区贡献者合作。

我们构建 Rolldown 的原因

Rolldown 设计为 Vite 中使用的未来较低级别的打包器。

目前,Vite 在内部依赖两个打包器

Vite 必须使用两个不同的打包器,因为虽然两者都十分出色,但它们各自缺少对方提供的某些功能

  • esbuild 极速且功能丰富,但其输出(尤其是在块拆分限制方面)并不适合打包应用程序。

  • Rollup 成熟且经过实战考验,适合打包应用程序,但其速度显著低于以编译为本机语言的打包器。

必须使用两个不同的打包器在多个方面而言都是次优的

  • 输出上的细微差别会导致开发和生产构建之间的行为差异。

  • 用户源在整个生产构建中由不同的工具重复进行解析、转换和序列化,从而导致了许多原本可以避免的开销。

理想情况下,我们希望 Vite 能够利用单个打包器,该打包器可提供本机级性能、避免解析/序列化开销的内置转换、与 Rollup 兼容的插件接口以及适合大型应用程序的高级构建输出控制。

这就是我们构建 Rolldown 的原因。

Rolldown 采用 Rust 编写,并构建在 Oxc 之上,目前利用了它的解析器和解析器。我们还计划在未来推出 Oxc 的转换器和缩编器时利用它们。

我们的长期目标是让 Vite 用户(通过框架直接或间接)能够过渡到内部使用 Rolldown 的 Vite 版本,摩擦最小。

与此同时,Rolldown 还将作为独立的打包器直接使用。

Rollup 兼容性 & 区别

Rolldown 旨在尽可能地与 Rollup 的 API 和插件界面保持一致,以简化采用。在简单的用例中,它可能会用作替代品。然而,边缘情况也可能存在细微差别,尤其是在涉及高级选项的情况下。

我们最初打算进行 JS 到 Rust 的移植,但很快意识到为了实现最佳性能,我们必须优先编写代码,以符合 Rust 的工作方式。Rolldown 的内部架构更接近 esbuild 而不是 Rollup,我们的块拆分逻辑可能最终与 Rollup 的逻辑不同。

Rolldown 的范围也比 Rollup 更大,更类似于 esbuild。它带有内置 CommonJS 支持、node_modules 解析,未来还将支持 TypeScript / JSX 转换和缩编。

为什么不逐步改进 Rollup?

Vite 站立在巨人的肩膀上,它的成功在很大程度上归功于 Rollup。我们与 Rollup 的当前维护者 Lukas 有着良好的合作关系,并且非常感谢他的出色工作。在开始研究 Rolldown 之前,我们联系了 Lukas,以确保他知情并且同意。共识是,同时探索渐进改进(由 Lukas 进行)和从头开始重新实现(由我们进行)是件好事。

我们的论点是,鉴于 JavaScript 的单线程特性和打包器的复杂性,极不可能通过渐进式更改实现我们追求的性能水平。部分组件迁移到 Rust 所产生的性能提升通常会被 Rust 和 JavaScript 之间的数据传递成本抵消,正如 Rollup 4 采用基于 Rust 的 SWC 解析器所显示的那样。为了达到最佳性能,整个解析/转换/代码生成管道需要在原生端进行,并尽可能地并行化。这仅通过从头开始实施才可行。

路线图

在 GitHub 讨论区查看路线图

加入我们!

Rolldown 仍处于早期阶段。我们有许多难题需要解决,没有社区贡献者的帮助,我们将无法解决这些难题。我们还积极寻找长期致力于使用 Rust 改进 JavaScript 工具的更多团队成员。

上次更新:

在 MIT 许可下发布。