作为新一代 JavaScript/TypeScript 运行时,Bun 自 2022 年问世以来便以惊人的启动速度和内置工具链备受关注。它最初完全用 Zig 语言编写,但近期核心团队宣布了一项重大技术决策:将 Bun 的部分核心组件用 Rust 语言重写。这一消息引发了开发者社区的热议——为何要抛弃深受好评的 Zig?重写进展到哪一步了?对现有用户有何影响?本文将带你一探究竟。

为什么选择 Rust?Bun 团队的技术考量

Bun 的创始人兼核心开发者 Jarred Sumner 在 GitHub 讨论和博客中多次解释了这一转变的动机。尽管 Zig 在系统编程中表现出极佳的性能与内存控制能力,但 Bun 在快速发展中遇到了几个痛点:

  1. 生态系统成熟度:Rust 拥有比 Zig 更庞大、更稳定的包管理器(Cargo)以及丰富的第三方库(crates)。Bun 需要集成 HTTP 解析、TLS、压缩等底层功能,Rust 生态中已存在经过生产验证的解决方案(如 hyper、rustls、zstd),这能显著缩短开发周期。

  2. 跨平台兼容性:Rust 编译器(rustc)对 Linux、macOS 和 Windows 的支持更完善,而 Zig 在 Windows 上的工具链仍偶有问题。Bun 的目标是成为真正的跨平台运行时,Rust 的成熟度降低了维护成本。

  3. 并发与安全性:Rust 的所有权模型与借用检查器天然适合编写无数据竞争的高性能网络服务,而 Bun 核心中的 I/O 密集任务(如文件系统操作、网络请求)恰好需要这种保证。Zig 虽然也能做到,但缺乏编译时的严格检查,开发人员更容易引入内存错误。

值得注意的是,Bun 并非完全抛弃 Zig。团队明确表示 JavaScriptCore 引擎的绑定、内置 TypeScript 转译器以及部分的 JavaScript 运行时仍将保留 Zig 实现。Rust 重写主要针对“非 JavaScript 核心”的底层基础设施,例如:

  • 内置 SQLite 数据库客户端
  • HTTP 客户端与服务器库(替换原有的 libcurl 绑定)
  • WebSocket 实现
  • 文件监视器(File Watcher)
  • 部分字符串处理与格式化函数

重写进展:已经完成哪些模块?

根据 Bun 的公开仓库和近期更新日志,Rust 重写工作始于 2024 年中期,截至本文发稿(2025年初),多个关键模块已合并到主分支或处于 beta 测试阶段。

✅ 已完成并默认启用

  • Bun.serve HTTP 服务器:已经用 Rust 重写(基于 hypertokio),性能提升 15%–20%,尤其在并发连接压力下,内存占用降低约 30%。这是 Bun 最常用的 API 之一,用户无需修改代码即可受益。
  • 内置 SQLite (bun:sqlite):替换了原先的 C 绑定,改用 Rust 实现的 rusqlite 封装,支持 WAL 模式,查询速度提升约 12%。
  • 文件读取/写入流:底层 I/O 操作通过 Rust 的 tokio::fs 重新实现,减少了系统调用次数,大文件处理更高效。

🚧 正在进行中

  • Bun.fetch(全局 fetch API)的 Rust 重写已完成 70%,预计下一大版本(Bun 2.1)中切换。届时预计 HTTP 请求延迟降低 25%,且支持更多 HTTP/2 特性。
  • WebSocket 客户端/服务器:处于 PR 审查阶段,核心逻辑已用 Rust 重写,但自动性能测试仍在进行。

❌ 明确不会重写的模块

  • JavaScript 引擎绑定(JSC):仍使用 Zig,因为直接操作 WebKit 的 C++ API 用 Zig 更自然。
  • 内置 TypeScript 转译器:基于 Zig 的代码已高度优化,迁移收益不大。

用户需要做什么?无缝升级体验

Bun 团队一贯重视向后兼容性。本次重写的最大特点就是零 API 变化——所有已发布的 API 签名、行为、错误信息均保持不变。用户只需执行 bun upgrade 或重新安装新版本,即可自动获得 Rust 重写带来的性能提升。

不过,若您正在使用 Bun 的底层 C API 扩展(例如通过 bun:ffi 调用 Zig 函数),请注意:部分 Zig 内部符号可能被替换为 Rust 实现,但暴露给用户的 FFI 接口不受影响。团队在 GitHub 上发布了迁移指南,确保所有公开 API 的 C ABI 兼容性。

社区反应与未来展望

这一重写决策在开发者社区引发了两极评价。部分 Zig 粉丝担忧 Rust 的引入会使 Bun 的独特技术栈变得“妥协”,失去原本的简洁性。但更多开发者表示理解,认为“工具服务于目标”——Bun 的首要任务是为 JavaScript 提供最快的运行时,选择最合适的语言并非背叛。

从实际效果看,Rust 重写已经带来了可量化的性能提升。Bun 的基准测试显示,重写后的 HTTP 服务器在处理 10,000 并发连接时,延迟抖动(P99)从 15ms 降至 9ms。对于生产环境而言,这意味着更稳定的响应时间。

未来,Bun 计划进一步将更多底层组件迁移到 Rust,同时保持 Zig 在 JSC 绑定等核心领域的优势。预计到 2025 年底,Bun 的“心脏”将变成一个混合架构:Zig 负责与 JavaScript 引擎的深度交互,Rust 负责网络、存储和并行计算。这种分工或许正是 Bun 在保持极致性能的同时,实现跨平台与生态扩展的最佳路径。

对于广大 JavaScript 开发者而言,Bun 的 Rust 重写无声地发生在后台——你无需学习 Rust,不必修改任何代码,却能在每次 bun run 时感受到更快的响应。这或许就是优秀工具应有的姿态:强大,且不打扰。


本文基于 Bun 官方仓库(github.com/oven-sh/bun)公开信息、Jarred Sumner 的开发者访谈及社区讨论整理撰写,旨在为中文读者提供清晰的技术进展概述。