Rolldown 简介
TL;DR
Rolldown 是一个以 Rust 编写的 JavaScript 打包器,旨在作为 Vite 中使用的未来打包器。它提供与 Rollup 兼容的 API 和插件接口,但在范围内将与 esbuild 更加类似。
🚧 开发中
Rolldown 当前正在积极开发中,尚未可用于生产。但我们目前已将其开源,以便我们可以开始与社区贡献者合作。
我们构建 Rolldown 的原因
Rolldown 设计为 Vite 中使用的未来较低级别的打包器。
目前,Vite 在内部依赖两个打包器
由 Evan Wallace 创建的 esbuild。Vite 将 esbuild 用于 依赖预打包、TypeScript/JSX 转换、目标降低以及缩小。
由 Rich Harris 创建并由 Lukas Taegert-Atkinson 维护的 Rollup。Vite 将 Rollup 用于其生产构建,并支持与 Rollup 兼容的插件接口。
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 工具的更多团队成员。