Rolldown:下一代JavaScript/TypeScript打包工具,基于Rust的JS打包工具-速度贼快
Vue 团队已正式开源 Rolldown 项目,这是一款基于 Rust 的 JavaScript 打包工具。
项目介绍
Rolldown 是使用 Rust 开发的 Rollup.js 编译工具的替代品,基于字节跳动的 Oxc 工具集合构建,它提供与 Rollup 兼容的应用程序接口和插件接口,将作为 Vite 未来使用的打包工具。
Rolldown 是一个用 Rust 编写的 JavaScript 打包器,旨在作为 Vite 未来使用的打包器。它提供与 Rollup 兼容的应用程序接口和插件接口,但在范围上更类似于 esbuild。
项目技术分析
技术栈
- Rust语言:Rolldown的核心代码使用Rust编写,充分利用了Rust在性能、安全性和并发性方面的优势。
- Rollup兼容性:Rolldown提供了与Rollup兼容的API和插件接口,使得现有的Rollup插件可以无缝迁移到Rolldown。
- esbuild风格:在设计理念上,Rolldown更接近于esbuild,追求极致的性能和简洁的API设计。
- 多平台支持:Rolldown支持多种平台,包括Windows、macOS、Linux以及WASM,确保在不同环境下的兼容性和性能。
依赖库
- napi-rs:用于在Rust中编写Node.js插件,提供了高效的Node-API绑定。
- oxc:作为底层解析器、解析器和源映射支持的核心库。
Rolldown文档
Rolldown 发展时间线
- 2023年10月05日,尤雨溪在 2023 ViteConf 大会上宣布将开发一个名为 Rolldown 的 Rollup 替代工具。
- 2023年12月31日,尤雨溪同步最新进展,Rolldown 原计划在今年开放代码库,但将推迟到 2024 年第一季度。
- 2024年03月08日,Rolldown 正式宣布开源 ,不到一天,Github star 数已到 2.5k。
Rolldown 主要特性
- 语言:用 Rust 编写
- ️ 高性能:为 Vite 设计,目标为 Vite 提供超级快的构建速度。
- ️ 兼容性:兼容 Rollup 的 API 接口和插件
- ️ 解析器:使用 Oxc 作为解析器
Rolldown 由来
Rolldown 旨在成为 Vite 未来使用的核心底层打包工具,目前 Vite 内部依赖于两个打包工具:Vite 使用 esbuild 进行依赖预打包、TypeScript / JSX 转换、目标降级和代码压缩;Vite 将 Rollup 用于其生产构建,并支持与 Rollup 兼容的插件接口。
Vite 之所以使用两种不同的打包工具,是因为虽然它们都很棒,但每个都缺少另一个提供的某些功能:esbuild 速度快且功能丰富,但其输出特别是在分块拆分方面存在限制,并不理想用于应用程序捆绑;Rollup 对于应用程序捆绑而言经过了时间考验且成熟稳定,但比编译为本机语言的打包工具慢得多。
使用两种不同的打包工具在几个方面都存在明显弊端:输出之间微妙差异可能导致开发和生产构建之间行为差异;用户源代码会被不同工具重复解析、转换和序列化,在整个生产构建过程中会带来许多可以避免的额外开销。
理想情况下,我们希望 Vite 能够利用单一打包器提供原生级性能、内置变换以避免解析/序列化开销、与 Rollup 兼容插件接口以及适合大规模应用程序的高级构建输出控制。
为什么需要 Rolldown?
从官方文档了解到,Rolldown 的设计目的是作为未来 Vite 中使用的打包器。但目前 Vite 内部依赖两个捆绑程序,esbuild 主要用来依赖预捆绑、TypeScript / JSX 转换、目标降低和最小化,Rollup 主要用来生产构建使用,这也导致一些问题:
- 输出之间的细微差别会导致开发和生产构建之间的行为差异。
- 在整个生产构建过程中,用户源代码会被不同的工具反复解析、转换和序列化,从而导致大量可以避免的开销。
在理想情况下,开发团队希望 Vite 能利用单一的打包工具,提供原生级性能、避免解析/序列化开销的内置转换、与 Rollup 兼容的插件接口,以及适合大规模应用的高级构建输出控制。
Rolldown 使用 Rust 编写,并基于 Oxc 构建,目前利用其解析器和解析程序。我们还计划在将来当 Oxc 的转换器和缩小器可用时利用它们。
我们的长期目标是让 Vite 用户(直接或间接通过框架)能够顺畅地过渡到内部使用 Rolldown 的 Vite 版本。与此同时 Rolldown 也可以作为一个独立的捆绑工具直接使用。
这就是建设 Rolldown 的原因。
未来规划
Rolldown 由 Rust 编写,基于 Oxc 构建,目前正在使用其解析器。团队还计划在 Oxc 的转换器和压缩工具将来可用时进行集成。
团队的长期目标是让 Vite 用户(直接或间接通过框架)能够以最小的成本过渡到内部使用 Rolldown 的 Vite 版本。
同时,Rolldown 还将作为独立的打包器直接使用。
Rolldown 未来可期!
Rollup API 兼容性
Rolldown 的目标是尽可能地与 Rollup 的 API 和插件接口保持一致,以便促进采用。在简单的使用情况下,它很可能能够作为一个即插即用的替代品。然而,在涉及高级选项时,边缘情况下可能会存在一些细微差异。
我们最初打算将 JS 移植到 Rust 中,但很快意识到为了实现最佳性能,我们必须优先考虑按照 Rust 工作方式编写代码。Rolldown 的内部架构更接近 esbuild 而不是 Rollup,并且我们的块拆分逻辑可能会有所不同于 Rollup。
Rolldown 的范围也比 Rollup 更广泛,并且更类似于 esbuild。它具有内置的 CommonJS 支持、node_modules 解析,并且未来还将支持 TypeScript / JSX 转换和代码压缩。
总结
Rolldown 是一个备受瞩目的前端项目,旨在解决当前打包工具的性能瓶颈和兼容性问题。它采用高效的 Rust 语言编写,与 Rollup API 保持兼容,并有望带来显著的性能提升。Rolldown 还致力于实现单一解析和 AST 树标准化,有望为开发环境和构建时间带来前所未有的性能飞跃。若成功实现这些目标,Rolldown 将成为前端开发领域的关键引擎,为开发者带来深刻的变革。
Rolldown:下一代JavaScript/TypeScript打包工具,基于Rust的JS打包工具-速度贼快的更多相关文章
- r.js打包注意事项 r.js打包 这个是配合require.js打包的
这个./代表的是当前文件的父目录....打包的资源一定要在这个父目录中下面才行,,,,一定一定,要放在这个目录一下才能被正确找到. 不然只是copy了一份一模一样的文件夹和文件过去,并不会处理压缩啥的 ...
- 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)
目录: 第1版:http://blog.csdn.net/vipbooks/article/details/51912143 第2版:htt ...
- gulp基于seaJs模块化项目打包实践【原创】
公司还一直在延续使用jq+seajs的技术栈,所以只能基于现在的技术栈进行静态文件打包,而众所周知seajs的打包比较"偏门",在查了不少的文档和技术分享后终于琢磨出了自己的打包策 ...
- 【已解决】在 Visual Studio 中设置 JavaScript/TypeScript 的断点 脚本出现自动中断错误
运行ASP.NET Core 程序出现错误如下: 已启用 Visual Studio 中的 Chrome 脚本调试 在 Visual Studio 中设置 JavaScript/TypeScript ...
- 基于Dedup的数据打包技术
基于Dedup的数据打包技术 0.引言 Tar, winrar, winzip是最为常见的数据打包工具软件,它们把文件集体封装成一个单独的数据包,从而方便数据的分布.传输.归档以及持久保存等目的 ...
- 用于编写下一代JavaScript的编译器。
下载 用于编写下一代JavaScript的编译器. 支持巴别塔 Babel(发音为babble)是一个由社区驱动的项目,被许多公司和项目使用,由一群志愿者维护.如果你愿意帮助支持这个项目的未来,请考虑 ...
- Hive -- 基于Hadoop的数据仓库分析工具
Hive是一个基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库 ...
- Processon 一款基于HTML5的在线作图工具
CSDN的蒋涛不久前在微博上评价说ProcessOn是web版的visio,出于好奇私下对ProcessOn进行了一番研究.最后发现无论是在用户体验上,还是在技术上,ProcessOn都比微软的Vis ...
- JS 日期工具类-基于yDate
源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...
- 基于Web的IIS管理工具
Servant:基于Web的IIS管理工具 Servant for IIS是个管理IIS的简单.自动化的Web管理工具.安装Servant的过程很简单,只要双击批处理文件Install Serva ...
随机推荐
- 使用Appflowy+AppflowyCloud搭建自己的笔记系统(个人知识库)-开篇
为什么需要自己的知识库(笔记)系统? 首先,第一点是数据隐私的担忧.因为个人笔记中包含很多内容,比如图片.代码.个人想法,甚至账号信息.我希望这些内容能部署在自己的电脑或自己的数据中心,这样数据就不容 ...
- 【杂谈】主键ID如何选择——自增数 OR UUID?
1.生成位置如何影响选择? 数据库往返时间 使用自增数时,ID是由数据库在执行INSERT操作时生成的:而UUID则可以在应用层生成. 考虑这样的场景: 一个方法需要插入A和B两个实体.其中B的数据需 ...
- Ubuntu详细的安装和配置ssh教程
Ubuntu安装和配置ssh的步骤如下: 打开终端,输入以下命令安装ssh: sudo apt-get install openssh-server 安装完成后,启动ssh服务: sudo syste ...
- Week09_day05(Java API操作Hbase)
package com.wyh.HbaseAPI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbas ...
- 洛谷P11380 [GESP202412 八级] 排队 题解
数据太可恶了,竟然有重边!!! 题目传送门. 显然一道简单图论题. 把 \(a_i\) 和 \(b_i\) 的关系想象成一条有向边,于是可以得出:如果 \(x\) 的出度大于 \(1\) 或者 \(x ...
- 「一」nginx介绍
应用场景 静态资源(js.css.图片 ) 反向代理 缓存加速(动态资源),比如社区活跃度排名 负载均衡(动态扩容.容灾) API服务 一个请求先经过nginx,再到应用服务器,访问数据库/redis ...
- mongodb 数据库操作——备份 还原 导出 导入
mongodump备份数据库 命令格式 mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 如果没有用户,可以去掉-u和-p. 如果导出本机 ...
- Django实战项目-学习任务系统-发送邮件通知
接着上期代码内容,继续完善优化系统功能. 本次增加发送邮件通知功能,学习任务系统发布的任务,需要及时通知到学生用户知晓. 由于目前智能手机普及,人人都离不开手机,所以手机端接收通知信息更加及时有效. ...
- Typora中插入分页符
博客地址:https://www.cnblogs.com/zylyehuo/ <div style="page-break-after:always"></div ...
- 冒泡排序(LOW)
博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ import random def bubble_sort(li): for i ...