Bun 是集 JavaScript、TypeScript 应用运行、包安装和测试于一体的开发工具。10 月 22 日发布的 v1.4.4 新增了内置格式化工具,并缩短了类型检查时间。对于语言、插件和配置均受支持的项目,可以在 Bun 内完成代码格式整理和类型检查。
沿用现有配置进行格式检查
新格式化工具沿用现有配置。bun fmt 会读取 Prettier 和 oxfmt 配置。公司称,在 Prettier 3.9.9 的自身测试中,9,731 项中有 9,648 项,即 99.1% 的结果逐字节一致。
多项目检查减少了重复工作。公司测量显示,bun check -b 在生成的 monorepo(4,000 个独立项目,每个项目 5 个文件)中从 13.65 秒降至 0.87 秒,提速 15.7 倍。条件为 skipLibCheck: true、16 核 M4 Max,取 6 次中的最佳值。项目间共享声明文件解析结果、模块解析缓存和输出文件列表,减少了各自保存副本的重复工作。
为应对短暂故障,包安装会随失败次数增加而延长重试间隔。公司测量中,包注册表在 1 秒内返回 503 时,v1.4.3 在 7 ms 后失败,而 v1.4.4 在 1.6 秒内完成了安装。
将依赖集中到上级目录的安装也更快了。公司测量显示,在 Linux、已有包缓存、1,000 个包(每包 30 个文件)、空安装目录和 8 核条件下,安装耗时从 381 ms 降至 120 ms,提速约 3.2 倍。
条件:在 Prettier 仓库的 2,616 个文件上使用其自身配置,对比 bun fmt --check 与 Prettier 3.9.10;Intel Xeon Platinum 8488C 固定 8 核、Linux、预热文件缓存,取中位数;数据由公司公布。
单位:格式检查耗时为 ms 和 s,峰值内存为 MB
| 工具 | 格式检查耗时 (ms/s) | 峰值内存 (MB) |
|---|---|---|
| bun fmt | 59.7 ms | 48 |
| Prettier 3.9.10 | 17.1 s | 459 |
格式检查耗时相差至少两位数倍。但不能认为这些数据会直接转化为 CI 节省的时间,值得单独测量各自 CI 中格式检查阶段占用的秒数。
类型检查改善幅度因仓库而异
表:Bun v1.4.4 与 v1.4.3 的 bun check 运行耗时对比
条件:8 线程 Linux x64,冷启动运行,取无缓存首次运行的 3 次测量中的最佳值,仅包含两个版本报告相同错误数量的仓库;数据由公司公布。
单位:秒
| 仓库 | Bun v1.4.3 | Bun v1.4.4 | 倍数 |
|---|---|---|---|
| MUI 文档 | 10.28 | 1.31 | 7.8 |
| t3code 服务端 | 4.59 | 1.62 | 2.8 |
| Supabase studio | 2.84 | 1.27 | 2.2 |
| mikro-orm | 3.30 | 1.82 | 1.8 |
| VS Code | 4.09 | 2.82 | 1.4 |
不同仓库的改善幅度不同,但方向一致。公司称,在另外测量的 76 个仓库中,有 69 个提速超过 10%。
升级方法
# 新安装
curl -fsSL https://bun.sh/install | bash
# 或使用 npm、Homebrew
npm install -g bun
brew tap oven-sh/bun
brew install bun
# 已经安装则执行升级
bun upgrade替换前,应查看类型检查器基于 TypeScript 7 的配置。格式检查通过 bun fmt --check 执行,有文件需要修改时会返回退出码 1。
对于破坏性变更,优先检查以下内容。
Bun.Glob 的 *(1).txt 现在会被解释为“0 个或多个 1 后接 .txt”。使用 *[(]1).txt 可保持原有行为。ws 服务器移除了空闲超时和自动 ping,默认 maxPayload 从 16 MiB 增至 100 MiB。安装命令会将所有包管理器均不支持的标志视为错误,例如 --frozen-lockfil 这样的拼写错误。
数据库传输保持内存占用稳定
对于连接数据库的服务,Bun.SQL 的每次查询开销降低了。据公司公布的数据,在 Linux x64 的 PostgreSQL 上,查找特定行的查询所需的客户端用户空间指令数减少了 48%。
大规模复制会利用 COPY 流的背压。传输速度随消费速度调整,因此内存不会膨胀到整张表的大小。公司测量中,以每秒 255 MiB 的速度传输 1,000 MiB 时,峰值常驻内存保持在 59 MiB。
一直在 Node.js 中使用 ws 的团队,无需更换包,即可在 Bun 中照常 import ws 来验证其行为。
条件:将重写后的 Bun v1.4.4 内置实现及其旧版本与 npm ws 8.22.0 对比;数据由公司公布。
单位:通过测试或输出一致的脚本数量
| 对比项 | Bun v1.4.4 | 旧版本 |
|---|---|---|
| 通过 ws 自身测试 | 234 / 271 个 | 94 / 271 个 |
| 客户端脚本输出一致 | 179 / 212 个 | 18 / 212 个 |
| 服务端脚本输出一致 | 150 / 159 个 | 67 / 159 个 |
Bun 将原有内置 ws 实现重写为 ws 8.22.0 的移植版本,使脚本输出完全一致的情况增多。帧和压缩仍由原生实现处理。
公司测量中,格式检查相差至少两位数倍,而实际仓库的类型检查提速为 1.4~7.8 倍,具体幅度因工具和仓库而异。
