Rolldown——基于Rust的JavaScript打包工具

大厂技术  高级前端  Node进阶点击上方 程序员成长指北,关注公众号
回复1,加入高级Node交流群

前言

在今年年初,Vue团队正式推出了他们的创新之作——Rolldown,一个由Rust精心锻造的JavaScript打包器。Rolldown不仅是对Rollup传统优势的继承与发扬,更是一次面向未来的跨越。它巧妙地融合了Rollup广受欢迎的API设计和插件生态系统,确保了与现有项目的无缝对接与迁移的顺畅无阻。并且其设计灵感和功能范围更加贴近Esbuild的极致速度。

现在在前端领域好像越来越多的编译器或构建工具都开始使用其它编程语言来实现,最受欢迎的应该就是Rust,他不再仅仅局限于系统级编程,它正风靡于前端领域。强调内存安全和卓越性能的Rust,逐渐成为构建先进前端应用的首选。

动机(为什么要开发RollDown)

Rolldown 旨在作为Vite未来使用的底层打包器。

目前 Vite 内部依赖两个 bundler:

  • esbuild : Vite 使用 esbuild 进行依赖预编译、TS / JSX 编译、代码压缩。

  • Rollup:  Vite 使用 Rollup 进行生产构建,并支持与 Rollup 兼容的插件接口。

Vite必须使用两个不同的打包器,因为虽然两者都很棒,但它们各自缺少对方提供的东西:

  • esbuild 速度极快且功能丰富,但是其输出,特别是在块分割限制方面,对于捆绑应用程序来说并不理想。

  • Rollup 已经成熟并且经过了应用程序捆绑的严格测试,但是它比用编译为本地语言编写的捆绑器慢得多。

使用两个不同的打包工具在以下几个方面都不是最优的:

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

  • 在整个生产构建过程中,用户源被不同的工具重复解析、转换和序列化,从而导致了大量可以避免的开销。

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

尤雨溪大佬对该问题回应的原话是:

Vite 站在巨人的肩膀上,它的成功很大程度上要归功于 Rollup。我们与 Rollup 的现任维护者[ Lukas ] ( https://github.com/lukastaegert )保持着良好的合作关系,对他的出色工作表示高度赞赏。在开始 Rolldown 工作之前,我们联系了 Lukas,以确保他了解并同意。大家一致认为,同时探索渐进式改进(由 Lukas 完成)和彻底重新实现(由我们完成)是件好事。

我们的观点是,鉴于 JavaScript 的单线程特性和打包器的复杂性,通过增量更改实现我们期望的性能水平的可能性极小。将部分组件移动到 Rust 所带来的性能提升通常会被 Rust 和 JavaScript 之间传递数据的成本显著抵消,正如 Rollup 4 采用基于 RustSWC 解析器所显示的那样。为了实现最佳性能,整个解析/转换/代码生成管道需要在本机端进行,并尽可能并行化。这只有通过从头开始的实现才可行。

总结来说就是:提升性能、统一构建引擎

介绍Rolldown

Github:https://github.com/rolldown/rolldown

文档:https://rolldown.rs/

目前Rolldown的热度还是比较高的

61007c8e713304a4e331a70fdc3b2d4e.png

据 Rolldown 团队介绍,Rolldown 旨在用作Vite中未来使用的底层打包器。Vite 用户应该能够以最小的阻力过渡到内部使用 Rolldown 的 Vite 版本。Rolldown 也可以直接用作独立打包器。

Rolldown 团队解释说,预期的速度提升不仅仅来自于将 Rust 代码编译为本机二进制文件。首先,用 Rust 编写整个工具,而不是使用额外的基于 Rust 的模块逐步改进 Rollup 是一个重要的设计选择:

将组件部分移至 Rust 所带来的性能提升通常会被 Rust 和 JavaScript 之间传递数据的成本所显著抵消,正如 Rollup 4 采用基于 Rust 的 SWC 解析器所示。

其次,Rust 使编写可以在多核设备上安全并行运行的代码变得更加容易:

为了实现最佳性能,整个解析/转换/代码生成管道需要在本机端进行,并尽可能并行化。

第三,Rolldown 将努力使用单一解析和 AST 树。Vite 有时会在堆栈的各个级别解析同一个 TypeScript 文件 5 次,并产生相应的解析/序列化开销。

技术规划

Rolldown 的重点将放在本地级别的性能上,同时尽可能与 Rollup 保持兼容。最终目标是在 Vite 中切换到 Rolldown,并对用户产生最小的影响。

Vite 团队还将与 Rollup 的维护者 Lukas 合作,确保 Rollup 和 Rolldown 之间的 API 和行为一致性。

第一阶段:聚焦基础打包功能

第一阶段的目标是能够替代 esbuild 进行依赖预打包,其中关键的挑战在于处理 CommonJS 和伪 ESM 依赖项。

第二阶段:实现 Rollup 的功能

第二阶段的目标是实现与 Rollup 相当的功能,尤其是与 Rollup 插件生态系统的兼容性,以及实现 tree-shaking 和高级块分割控制。

最终目标是在 Vite 中使用 Rolldown 作为生产构建的替代品,以提供功能更强大、高效、易用和灵活的打包工具。

第三阶段:常见需求的内置转换

第三个阶段会稍微遥远一些,它将包括一些最常见需求的内置转换,例如 TypeScript、JSX、代码压缩,以及基于目标环境进行语法降级。

这个阶段的目标是实现 esbuild 的功能,最终将用 Rolldown 取代 esbuild 和 Rollup。

第四阶段:使用 Rust 重构 Vite

从长远来看,Vite 团队也在考虑如何让 Vite 本身能够更好地受益于原生级别的速度。

一种可能的实现方式是通过 Rust API 来公开 Rolldown 的插件容器,并将 Rolldown 作为 Vite 引入自己的Rust核心的依赖项。这样一来,Vite 就可以将许多内部插件和转换使用 Rust 重构,从而提高性能关键路径上的效率。

此外,为那些开发过程中有太多未打包模块的项目引入完全打包模式也是一个备选方案。

最终,Rolldown 的目标并不是取代现有的工具,而是更好地满足在 Vite 中所面临的独特需求,并最终使所有使用 Vite 的用户受益。

Node 社群



我组建了一个氛围特别好的 Node.js 社群,里面有很多 Node.js小伙伴,如果你对Node.js学习感兴趣的话(后续有计划也可以),我们可以一起进行Node.js相关的交流、学习、共建。下方加 考拉 好友回复「Node」即可。

   “分享、点赞、在看” 支持一波👍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值