Bun v1.3.14 在 5 月 13 日按计划发布。
发版本身不算大新闻,Bun 一向更新得勤。但这次发版前一天半,作者 Jarred Sumner 在 X 上扔了一句话,分量比 changelog 重多了:
“Bun v1.3.14 releases tomorrow. If we do merge the Rust rewrite, this would be the last version in Zig.
Bun v1.3.14 明天发布。如果我们把 Rust 重写合并进来,这将是 Zig 时代的最后一版。
要知道,仅仅 6 天前,Jarred 还在 Hacker News 上灭火,原话是:「这只是我自己的分支,整个讨论都反应过度了。这些代码极有可能最终被全部丢掉。」
6 天,从「极有可能丢掉」到「下一版可能就用上」。
6 天里到底发生了什么
时间线倒回 5 月 5 日。网友 @LukeParkerDev 在 GitHub 上发现 Bun 仓库出现了一个名为phase-a: draft batch big-1 (12 files)的巨型提交,一次性新增近 28,000 行 Rust 代码,作者正是 Jarred 本人。HN 跟进 302 条评论,社区炸了一轮。
我们之前写过这条新闻(《Bun 要把底层从 Zig 换成 Rust,把 Node.js 也搞得蠢蠢欲动了!》)。当时 Jarred 的口径还是「实验」「探索」「极有可能丢掉」。
5 月 11 日,他改口了:
“I have pretty high confidence in it at this point. It passes Bun's test suite on Linux x64 + arm64 glibc + musl, Windows x64 and arm64, and macOS x64 & arm64. It likely closes about 200 github issues. Still refactoring & simplifying.
翻成中文:我现在对它有相当高的信心。它通过了 Bun 在 Linux x64 + arm64(glibc + musl)、Windows x64 + arm64、macOS x64 + arm64 上的全套测试。可能会关掉大约 200 个 GitHub issues,还在重构和简化中。
把这段话拆开看:
所有目标平台全部跑通测试,Linux x64/arm64 还顺带覆盖了 glibc 和 musl 双 libc,不只是某个组合能编译。
顺手能解掉约 200 个老 issue,换语言不是纯重写,Rust 的内存安全特性本身在治 bug。
还在重构和简化,意思是它已经能用,剩下的是打磨。
情感强度的变化更直白:从「玩票」到「准备合主线」。
他紧接着的第二条补充更关键:
“I have yet to see a benchmark where it is slower than the Zig implementation. It is basically the same codebase. It doesn't use async rust and like the Zig implementation, uses few 3rd party libraries. It's really the same thing just with better tools for us to prevent crashes.
我还没见过哪个 benchmark 比 Zig 版慢。基本是同一份代码库,没用 async Rust,跟 Zig 实现一样只引了少量第三方库。其实就是同一个东西,只是我们用上了更好的防崩溃工具。
这句话回答了社区的两个核心质疑:
性能会不会退化:没有,benchmark 跑下来 Rust 版没有比 Zig 慢的。
是不是被改成另一个项目了:没有,结构几乎一对一翻译,没有借机引入 async Rust 的范式,也没有把 Rust 生态那一堆 crate 拖进来。
Bun 不是要变成「Rust 风味」的项目,而是把 Zig 换成 Rust 这门「带借用检查器和析构/构造器」的语言,仅此而已。
v1.3.14 本身有什么干货
回到这次发版。Bun 官方的 changelog 关键词是「修了 92 个 issue,回应了 380 个 👍」,加上一长串新特性。挑几个对 Node.js 开发者真正有用的说。
Bun.Image 正式内置。原生图像处理 API,不再依赖 Sharp/libvips。metadata 操作号称比 sharp 快 70 倍,1080p PNG 缩放快 1.38 倍,4K JPEG 操作快 1.22 到 1.27 倍。零原生依赖,Serverless 部署再也不用为 Sharp 编译头疼。
HTTP/3 (QUIC) 服务端。Bun.serve()加入实验性 HTTP/3,跟 HTTP/1.1、HTTP/2 自动协商。回环静态路由跑出 509,135 req/s,对照 HTTPS/1.1 只有 189,130 req/s。
fetch 支持 HTTP/2 和 HTTP/3。客户端通过 TLS ALPN 协商 h2,同源并发请求复用单个 TCP 连接。HTTP/3 可以显式{ protocol: "http3" }启用,也能跟着 Alt-Svc 响应头自动升级。
全局虚拟仓库。bunfig.toml里打开install.globalStore = true之后,warm install 改用单次 symlink 替代 clonefileat。macOS 上约 1,400 个包的场景,841 ms 降到 115 ms,提速 7.3 倍。
fs.watch 完全重写。Linux 的 inotify、macOS 的 FSEvents、kqueue 全部重新整理。修了递归监听、文件删除重建后静默丢事件、macOS 重复 FSEvents 线程这些老问题。前两年是 Bun 跑大型项目时最常被吐槽的痛点之一。
--no-orphans 标志。父进程一死,子进程跟着退出,递归 SIGKILL 所有后代。Linux 用prctl(PR_SET_PDEATHSIG),macOS 用 kqueue。CI/CD 和 watcher 进程的孤儿问题,终于有了官方解法。
LTO 跨语言生效。Zig 和 C++ 边界通过 LLVM bitcode 做了 LTO,42% 的跨语言函数被内联消除,HTTP 吞吐提升 3.5%,Bun.escapeHTML提升 6.5%。
二进制大小再瘦身。Windows x64 减少 17.66 MB,Linux x64 减少 8.58 MB,Linux aarch64 减少 9.07 MB。
JavaScriptCore 这次也吸收了 565 个上游 commit,async function、Array.shift、JSON.parse、Intl 都更快了,WebAssembly 多了 relaxed SIMD 和 Memory64 支持。SQLite 升到 3.53.0。
底层修复也是一长串:Node.js http/https 内存泄露和 use-after-free、zlib 重入崩溃、crypto.randomFill缓冲区溢出、child_processstdout 内存泄露、TLS 套接字生命周期、fs.cp符号链接句柄泄露。
这个版本如果不带「最后一个 Zig 版本」的标签,本身已经是 Bun 半年里最重要的一次更新。
Rust 重写的真实进度:99.8% 测试通过率
回到主角。
根据 Theo 的报道和社区跟进,Rust 版的进度数据如下:
6 天里覆盖了原 Bun 代码约 68% 的重写工作量,对应大约 96 万行 Zig 源码被翻译。
Rust 一侧的产物代码约 68.1 万行(翻译后行数比 Zig 略少),在 Linux x64 glibc 上的测试通过率达 **99.8%**。
所有目标平台(Linux x64/arm64 含 glibc 和 musl、Windows x64/arm64、macOS x64/arm64)全部通过测试。
可能直接关掉约200 个历史 GitHub issue。
但有一个数字让社区警惕:13,044 个 unsafe block。
这个担忧合理。Rust 的核心卖点就是内存安全,unsafe block 就是绕过这套保证的逃生舱。一万三千个 unsafe,意味着 Rust 重写还没有完全吃到借用检查器的红利,更多是在用 Rust 当一种「更好用的 Zig」。
这也呼应了 Jarred 自己的说法:基本是同一份代码库,逻辑一对一翻译,没用 async Rust,没引入 Rust 生态的常见抽象。机械翻译一个底层运行时,原本在 Zig 里靠手动管理的指针操作,到 Rust 里几乎一定要包在 unsafe 里。
接下来真正的工程目标,是把这些 unsafe 收敛到尽可能小的核心模块里,让上层逻辑跑在安全 Rust 上。这才是 Jarred 嘴里的「还在重构和简化」。
6 天 96 万行,AI Agent 干的活
这次 6 天写出 96 万行 Rust,不是几个人手撸的。
Bun 仓库里的docs/PORTING.md是一份专门给编码 Agent 看的操作指引,写了约 300 条规则。整个迁移分成两个阶段:
Phase A:在每个
.zig旁边生成对应的.rs草稿,忠实还原逻辑,不要求能编译。Phase B:让代码逐 crate 编译通过、跑过测试。
Bun 团队跑这套流程用的,正是 Anthropic 自家的 AI Agent 基础设施。社区里把这种 PR 叫「robobun PR」。
更激进的一组动作出现在 5 月 13 日晚上。
当晚 19:14,Jarred 发了主推:
“The plan for tomorrow: dogfood Bun's Rust port on Claude Code internally and start writing the blog post.
明天的计划:在 Claude Code 内部对 Bun 的 Rust 移植做 dogfood 测试,然后开始写博客。
他在自己评论区里答了想验证的三件事:bug 在哪里、内存使用模式跟 Zig 版相比有什么差别、启动时间有没有变化。换言之,Claude Code 自己即将成为 Bun Rust 版的第一个真实重度用户,用自家的 Agent 跑自家的运行时。
至于博客谁来写,Himanshu 调侃问「会让 Claude Code 来写吗?」Jarred 回了句Nah I'll write the blog post. But claude code will certainly give feedback / edit.翻成中文:博客我自己来,但 Claude Code 肯定会给反馈和编辑意见。
更猛的一句藏在另一条回复里。有网友追问:如果 Rust 版最终成为官方版本,是不是意味着代码主要甚至完全由 Claude Code 维护?
Jarred 的回复一句话定调:
“This is already the status quo; we havent been typing code ourselves for many months now. Even pre-acquisition this was pretty much accurate.
这早就是现状了,我们已经好几个月没自己敲过代码了。即使在收购之前,这个描述也几乎准确。
这句话顺手戳破一个对外界来说颇有冲击的事实:Bun 团队的工作模式早就反转过来了,不是「人写、AI 辅助」,而是「AI 写、人审」,而且这个状态已经持续好几个月。
巧的是,v1.3.14 发布同一天,Claude Code 官方在 X 上推了一条新功能/goal,让 Agent 一直跑到目标达成为止:
“How do you keep Claude working until the job is done? Claude Code helps with this in a few ways, including one we shipped recently: /goal.
下面 Bun 官方账号马上接梗:
“why no bun??
配了一张包子小人哭着指责的表情包:「YOU CHOSE npm test INSTEAD OF bun test?!」,Claude 终端窗口里赫然写着Bash(npm test),旁边还有「bun test = happy bun!」的小手写。
Thariq(Anthropic 工程师)一句话把现实戳破:
“Jarred stop making memes and finish the rust port.
Jarred 别做表情包了,赶紧把 Rust 端口干完。
这段对话挺有意思。一边 Claude Code 在卖力推/goal这种长任务能力,一边 Bun 团队就是这种能力的重度用户,正在用它做 96 万行的代码迁移。这不是巧合,是同一个生态的两端在互相喂数据。
几个值得读懂的信号
第一,AI 辅助大规模语言迁移的成本结构真的变了。6 天写完 96 万行 Rust 草稿,过去想都不敢想。哪怕代码质量还要继续打磨,工程时间也已经压到了一个人类手写完全无法对标的水平。
第二,Bun 选的是「换语言」,不是「Rust 化」。同样的代码结构、同样的少量第三方依赖、同样的非 async 写法。它要的不是 Rust 生态的诱惑,而是借用检查器和构造/析构器这些底层语言能力,目的就是减少 crash。
第三,Zig 的处境变得微妙。一个旗舰用户准备走了,社区会怎么解读,需要观察。Zig 本身没有犯什么错,但 AI 时代各项目对 AI 贡献代码的政策差异,可能比技术本身更影响生态走向。
第四,13,044 个 unsafe 是关键变量。如果接下来能收敛到几千甚至几百,Rust 版才算真的兑现「更安全」这个承诺;如果一直停在这个量级,"安全性" 更多是名义上的胜利。
回到最初那句推文。Jarred 用的是 if,不是 when,给自己留了撤退空间。
但从 5 月 5 日「极有可能丢掉」、5 月 11 日「相当高的信心」、再到 5 月 13 日「明天就内部 dogfood」,这条 if 看起来更像惯性谨慎。社区已经在按「Bun 即将切到 Rust」的预期讨论,Node.js 那边的 Matteo Collina 也松口承认局部 Rust 早已在路上。
下一个 Bun release 的版本号会是 1.3.15 还是 2.0,可能就是这个故事真正落地的信号。