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 仓库中的格式检查耗时与峰值内存对比

条件:在 Prettier 仓库的 2,616 个文件上使用其自身配置,对比 bun fmt --check 与 Prettier 3.9.10;Intel Xeon Platinum 8488C 固定 8 核、Linux、预热文件缓存,取中位数;数据由公司公布。

单位:格式检查耗时为 ms 和 s,峰值内存为 MB

沿用现有配置进行格式检查
工具格式检查耗时 (ms/s)峰值内存 (MB)
bun fmt59.7 ms48
Prettier 3.9.1017.1 s459

格式检查耗时相差至少两位数倍。但不能认为这些数据会直接转化为 CI 节省的时间,值得单独测量各自 CI 中格式检查阶段占用的秒数。

类型检查改善幅度因仓库而异

表:Bun v1.4.4 与 v1.4.3 的 bun check 运行耗时对比

条件:8 线程 Linux x64,冷启动运行,取无缓存首次运行的 3 次测量中的最佳值,仅包含两个版本报告相同错误数量的仓库;数据由公司公布。

单位:秒

Bun v1.4.4 与 v1.4.3 的 bun check 运行耗时对比 (秒)MUI 文档: Bun v1.4.3 10.28, Bun v1.4.4 1.31; t3code 服务端: Bun v1.4.3 4.59, Bun v1.4.4 1.62; Supabase studio: Bun v1.4.3 2.84, Bun v1.4.4 1.27; mikro-orm: Bun v1.4.3 3.30, Bun v1.4.4 1.82; VS Code: Bun v1.4.3 4.09, Bun v1.4.4 2.82Bun v1.4.3Bun v1.4.4MUI 文档10.281.31t3code 服务端4.591.62Supabase studio2.841.27mikro-orm3.301.82VS Code4.092.82
Bun v1.4.4 与 v1.4.3 的 bun check 运行耗时对比 (秒)
类型检查改善幅度因仓库而异
仓库Bun v1.4.3Bun v1.4.4倍数
MUI 文档10.281.317.8
t3code 服务端4.591.622.8
Supabase studio2.841.272.2
mikro-orm3.301.821.8
VS Code4.092.821.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 来验证其行为。

表:ws 内置实现兼容性指标对比

条件:将重写后的 Bun v1.4.4 内置实现及其旧版本与 npm ws 8.22.0 对比;数据由公司公布。

单位:通过测试或输出一致的脚本数量

ws 内置实现兼容性指标对比
对比项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 倍,具体幅度因工具和仓库而异。