Bun 1.4 把运行时变成『全栈平台』:JS 运行时之战从『跑得快』卷到『什么都不用装』
8 月 20 日发布的 Bun 1.4 把核心从 Zig 全量重写为 Rust(约 100 万行,Claude 代理 6 天把 57 万行 Zig 转成 68.2 万行 Rust),并一口气内置 6 个 API:Bun.Image 替代 sharp、Bun.WebView 替代 Playwright/Puppeteer、Bun.markdown 替代 marked、Bun.cron 替代 node-cron、Bun.Terminal 替代 node-pty,加上 JSON5/JSONL 解析。它把『运行时』的边界从『跑 JS』推到『浏览器、图像、定时、终端』都内置——这场仗的胜负手,正在从基准测试跑分转向『你的 package.json 能删多少行』。
重写不是炫技,是为了救 Claude Code 的内存
Bun 1.4 最容易被当成标题党的是『AI 用 6 天把 100 万行代码从 Zig 改成 Rust』。但真正驱动这次重写的,是一个很具体的工程事故:旧的 Zig 运行时存在内存泄漏,会把 Claude Code 的会话内存顶到 14–23 GB。而 Claude Code 恰恰是 Bun 最大的『客户』——Bun 自己披露,Claude Code 以 Bun 可执行文件的形式分发到数百万开发者手上。换句话说,『自己的产品把自家运行时跑爆了』这件事,逼出了这次重写。
重写后的数字是有说服力的:空闲 CPU 下降约 80%(约 5 倍),Express 服务内存从 169 MB 降到 92 MB(−46%),Linux 启动从 10.9 ms 降到 5.1 ms(快一倍),首次安装比 npm 快 15 倍(全新检出快 30 倍),URL 解析快 4.6 倍,Markdown 解析快 138 倍。二进制还小了约 18 MB(Linux x64 上约 −20%),多过了约 1400 个 Node.js 测试,并补齐了 Node.js 26 兼容。对一个运行时来说,这些是『既修 bug 又变快』的稀有好结果。

六个内置 API,本质是要干掉你的 node_modules
这次发布的真正主线不是 Rust,而是六个内置 API,每一个都明确『替代一个 npm 包』:
- Bun.Image 替代 sharp,做缩放、旋转、格式转换,1080p PNG 缩成 400×400 JPEG 比 sharp 快 1.38 倍,无需原生编译;
- Bun.WebView 替代 Playwright/Puppeteer,macOS 上直接用系统 WebKit、其他平台走 Chrome DevTools 协议,不装浏览器二进制;
- Bun.markdown 替代 marked/remark,Markdown 转 HTML 比 marked.parse() 快 138 倍,还支持渲染成 ANSI 终端码;
- Bun.cron() 替代 node-cron,直接注册 OS 级定时任务(Linux crontab / macOS launchd / Windows 任务计划),并防重叠执行;
- Bun.Terminal 替代 node-pty,提供原生 PTY;
- 外加 JSON5 / JSONL / JSONC / XML / TOML 原生解析,替代 json5 和手写逐行解析。
把这六个加在一起,意味着一个简单的图片处理脚本,可以从『import sharp / playwright / marked / node-cron 四个包』变成『零依赖、直接调内置 API』。Bun 的长线策略一直是『消灭 npm 依赖栈』,1.4 是这步棋走得最大的一次。对一个前端项目来说,package.json 缩短、冷启动变快、供应链攻击面变小,这些好处是实打实的。
和 Node、Deno 的比,胜负手已经换了个维度
过去 JS 运行时之争,比的是『谁跑 HTTP 快』。Bun 在自己基准里能到 5.2 万 req/s,Node 约 1.3 万,看着是 4 倍领先。但现实是:一旦你接上 Postgres,Bun 是 1.24 万、Node 是 1.2 万——数据库成了瓶颈,运行时本身几乎无感。所以『跑分快』在真实业务里经常是个伪优势。
Bun 1.4 聪明的地方在于,它不再只赌『快』,而是赌『全』:把浏览器自动化、图像处理、定时任务、终端这些原本要装一堆包的能力,直接焊进运行时。这就把竞争维度从『谁的基准测试好看』换成了『谁让你的 package.json 更短、让你的应用更少依赖外部包』。Deno 早就在走『内置优先』路线(deno 自带 fmt/lint/test/compile),但 Bun 这次把『替代具体流行 npm 包』这件事做到了最直白——每个 API 名字都直接对标一个你正在用的库。
争议不该被略过:AI 重写到底算不算工程
这段必须写,因为它决定了你能不能信这个版本。Bun 1.4 的重写代码里含有约 13,044 个 unsafe 块、999 处 static mut,而一个同等规模的手写 Rust 项目通常只有约 73 个 unsafe。最大的那个 PR 被称为『GitHub 历史上最大』,且主要由 AI bot 审查、而非人工逐行 review。社区的质疑是真实的:长期 Bun 支持者 Tero Piirainen 公开写过项目在空窗期陷入『连续跳票和越来越 frustrated 的社区』;Bun 的开放 PR 数一度爬到 5000+,其中大量是自动化提交。
但换一个角度看,这些 unsafe 只是把原本藏在 Zig 里的风险『显形』了——Rust 的借用检查器现在强制约束那些以前靠开发者纪律维持的保证。而且这次重写的首要目标是止住内存泄漏,而泄漏确实止住了。所以对生产环境的建议很明确:如果你已经在用 Bun 1.3,1.4 是增量升级、新 API 全加性的,风险可控;但这是一次『由 AI 大量参与、且大版本改动运行时地基』的发布,按惯例『等一两个补丁版再进生产』的建议,这次比平时更该听。
真正的信号:运行时正在变成平台,而不是工具
把这些拼起来看,Bun 1.4 透露的产业信号是:JavaScript 运行时正在从『把 JS 跑起来的工具』演化成『应用运行所需能力的平台』。当 Bun 内置了浏览器、图像、定时、终端,它其实在说:你不需要为一个 HTTP 服务再装一整套周边依赖,运行时本身就够。这对 Node 的统治地位是慢性侵蚀——不是靠『更快』抢人,而是靠『更少依赖、更一致的内置体验』让人懒得换回去。
值得注意的另一条线:bun.sh 官网挂出了『Bun has joined Anthropic』的横幅。一个运行时被大模型公司收编,意味着它不再只是开发者工具,而是成为『Agent 怎么跑代码』的基础设施层。当 Agent 成为主要用户,『装包、配环境、处理原生依赖』这些人类工程师习以为常的摩擦,恰恰是 Agent 最容易翻车的地方——而 Bun 把这些都焊进运行时,等于顺手把 Agent 的执行环境也一起优化了。这是 1.4 之外、但比 1.4 更值得长期盯的信号。
