Bun
[!abstract] 一句话定义 Bun 是一个用 Zig 编写的、基于 JavaScriptCore 引擎的 一体化 JavaScript/TypeScript 工具链——把运行时、包管理器、打包器、转译器、测试运行器集成到一个二进制文件中,目标是成为 Node.js 的即插即用替代品。
为什么需要它?
开发一个现代 JS/TS 项目,你至少需要装这些工具:
| 功能 | 传统工具链 | 问题 |
|---|---|---|
| 运行代码 | Node.js | 启动慢(~25ms 空跑) |
| 跑 TypeScript | ts-node 或 tsx | 需要额外配置,启动更慢(~80-150ms) |
| 装依赖 | npm / yarn / pnpm | 安装慢,各有各的 lockfile 格式 |
| 打包 | webpack / esbuild / vite | 又一个工具要装和配置 |
| 跑测试 | jest / vitest | 又一个工具要装和配置 |
| 转译 JSX | babel / @swc | 又一个工具要装和配置 |
六个工具、六份配置、六次安装——而它们本质上都在做同一件事:处理 JavaScript/TypeScript 代码。
Bun 的核心主张是:为什么这些不能是一个工具? 它把上述全部能力编译进一个约 90MB 的二进制文件,启动时间降到 ~5ms。
核心直觉
把 Bun 想象成一个瑞士军刀 vs 传统工具链的一箱子专用工具:
- 传统方式:你要切菜就拿菜刀,开瓶就拿开瓶器,拧螺丝就拿螺丝刀——每把工具单独买、单独保养
- Bun:一把瑞士军刀全搞定,而且每项功能都不是阉割版
为什么能做到?因为传统 JS 工具链有一个根本问题:大部分工具本身就是 JavaScript 写的,用 JS 去处理 JS。这就像用翻译软件去翻译翻译软件的说明书——层层间接,效率自然低。
Bun 的解法是:用 Zig(一种底层系统语言)把所有功能从头写一遍,直接编译为原生机器码。没有 JavaScript 中间层。
它是怎么工作的?
graph TB
subgraph "Bun 单一二进制文件"
subgraph "JS 引擎层"
JSC["JavaScriptCore<br/>Apple Safari 的 JS 引擎"]
end
subgraph "原生实现层 — Zig/C/C++"
TRANS["转译器<br/>TypeScript → JS<br/>JSX → JS"]
BUNDLER["打包器<br/>Tree-shaking + Bundling"]
PM["包管理器<br/>并行安装 + 全局缓存"]
TEST["测试运行器<br/>兼容 Jest API"]
HTTP["HTTP 服务器<br/>基于 uWebSockets"]
SQLITE["内嵌 SQLite<br/>内嵌 Redis/Postgres 客户端"]
end
subgraph "兼容层"
NODEAPI["Node.js API 兼容<br/>node:fs, node:http..."]
NPM["npm 包兼容<br/>node_modules 解析"]
end
end
JSC --> TRANS
JSC --> BUNDLER
JSC --> HTTP
TRANS --> PM
TEST --> JSC
NODEAPI --> JSC
NPM --> PM
架构师注释:关键设计决策是选择 JavaScriptCore(而非 V8)作为引擎。JSC 是 Apple 为 Safari 开发的引擎,它的 JIT 编译策略偏向快速启动——非常适合 CLI 工具和 Serverless 场景。V8 则偏向长时间运行的峰值优化——更适合 Chrome 浏览器和长期运行的服务器。
三个关键技术选择
1. 为什么用 JavaScriptCore 而不是 V8?
| 维度 | JavaScriptCore (Bun) | V8 (Node.js/Deno) |
|---|---|---|
| 启动速度 | ~5ms | ~25ms |
| 内存占用 | ~32MB 基线 | ~48MB 基线 |
| 长时间运行优化 | 较弱 | 极强(多年打磨的 GC) |
| 背后团队 | Apple (WebKit) | Google (Chromium) |
JSC 启动快是因为它的 JIT 策略更激进——更快地生成机器码,但优化不如 V8 深入。这对 CLI 工具和 Serverless 冷启动是巨大优势,对长期运行的服务器则不一定。
2. 为什么用 Zig?
Zig 是一个类似 C 的系统语言,但更安全:
- 手动内存管理(无隐藏的 GC 暂停)——适合写高性能运行时
- comptime(编译期计算)——可以在编译时生成优化代码
- 直接与 C 互操作——无需 FFI 桥接就能调用 C 库
- 结果:Bun 的转译器和运行时比 Node.js 的 C++ 实现启动快 4 倍
3. 为什么是单一二进制?
把所有功能编译在一起:
- 无进程间通信开销
- 共享 JavaScriptCore 实例(转译器、测试运行器、打包器共用同一个 JS 引擎)
- 一个安装命令
curl -fsSL https://bun.sh/install | bash搞定一切
关键组件 / 核心要素
| 组件 | 命令 | 作用 | 与传统工具对比 |
|---|---|---|---|
| 运行时 | bun run index.ts | 执行 JS/TS,原生支持 TypeScript/JSX | 替代 node + ts-node,启动快 4-5× |
| 包管理器 | bun install | 安装 npm 依赖,兼容 package.json | 替代 npm/yarn/pnpm,快 10-30× |
| 打包器 | bun build | 将源码打包为单文件,支持 tree-shaking | 替代 esbuild/webpack |
| 测试运行器 | bun test | 运行测试,兼容 Jest API | 替代 jest/vitest |
| 转译器 | 自动(无需命令) | TypeScript/JSX → JavaScript | 替代 babel/swc,无需配置 |
| Shell | bun x | 内置脚本运行 | 替代 npx |
| 内嵌数据库 | bun:sqlite | 内置 SQLite 客户端 | Node.js 需额外安装 better-sqlite3 |
| 内嵌客户端 | Bun.SQL / Bun.RedisClient | 原生 Postgres / Redis 客户端 | 无需 pg / ioredis |
与相关概念的关系
[!info] vs Node.js Bun 是 Node.js 的即插即用替代品,但底层架构完全不同:
- Node.js = V8 引擎 + C++ + npm 生态(2010 年诞生,生态最成熟)
- Bun = JavaScriptCore + Zig + 一体化工具链(2022 年诞生,性能最强)
- 兼容性:Bun 实现了大部分 Node.js API(
node:fs、node:http、node:path等),大部分 npm 包可直接使用- 不兼容场景:依赖原生 C++ addon(如
sharp、bcrypt)的包可能需要 Node-API 适配
[!note] vs Deno 三者同为 JS 运行时,但理念不同:
- Deno 强调安全性(默认文件系统隔离、权限模型)和标准化(原生支持 Web API、URL imports)
- Bun 强调性能(最快启动、最快安装)和一体化(一个工具搞定一切)
- Node.js 强调稳定性(最成熟的 GC、最长的生产验证、最大的生态)
- 2026 年的现状:Bun 性能领先、Deno 安全领先、Node.js 生态领先
[!tip] 被 oh-my-pi 使用 oh-my-pi 选择 Bun 作为运行时而非 Node.js,正是因为 Bun 的 5ms 启动时间使其非常适合 CLI 工具场景。oh-my-pi 的 ~27k 行 Rust 原生模块也通过 Bun 的 N-API 支持集成进来。
典型应用场景
- CLI 工具开发 — 5ms 启动时间让 JS CLI 工具终于不再”慢半拍”。oh-my-pi、Claude Code 等 AI Agent 工具链选择 Bun 正因如此
- Serverless 函数 — 冷启动 8-15ms(Node.js 60-120ms),在 AWS Lambda / Vercel 等平台上差异巨大
- 开发环境 —
bun install比 npm 快 10-30 倍,bun test即时反馈,bun --watch热重载,开发体验丝滑 - 全栈应用 — 内置 HTTP 服务器、SQLite、Postgres/Redis 客户端,小型项目不需要装十几个包
- CI/CD 流水线 — 安装快、启动快,CI 流水线的整体时间显著缩短
常见误解与陷阱
[!danger] ❌ 误以为:Bun 完全兼容 Node.js,可以无脑替换 ✅ 实际上:Bun 实现了 Node.js 的大部分 API,但不是 100%。原生 C++ addon(如
sharp、bcrypt、canvas)可能不兼容,某些 Node.js 内部 API(如vm.Script的边界行为)存在差异。生产环境迁移前需要充分测试。
[!danger] ❌ 误以为:Bun 在所有场景都比 Node.js 快 ✅ 实际上:Bun 在启动速度和短生命周期任务上确实领先。但在长时间运行的服务器场景,Node.js 的 V8 垃圾回收器经过十几年打磨,内存管理更成熟。Bun 在 72+ 小时长期运行中曾出现内存泄漏问题(已在 1.3.2 修复),说明其 GC 还在追赶。
[!danger] ❌ 误以为:Bun 只是另一个 Node.js ✅ 实际上:Bun 是一体化工具链的思路——它不仅仅是运行时,而是要替代
node+npm+webpack+jest+babel五个工具。这是理念层面的差异,不是”快一点的 Node.js”。
[!danger] ❌ 误以为:Zig 是 Bun 性能优势的全部原因 ✅ 实际上:性能优势来自多个层面的叠加——JavaScriptCore 引擎选择(启动快)、Zig 原生实现(无 JS 间接层)、单一二进制共享 JS 引擎(无进程间通信)、全局缓存包管理器(并行安装)。Zig 是工具,不是魔法。
延伸阅读
- 想理解 JS 引擎差异 → 研究 JavaScriptCore vs V8 的 JIT 策略:JSC 偏向快速 baseline JIT,V8 偏向多层优化(Sparkplug → Maglev → TurboFan)
- 想看工程实践 → 用 Bun 初始化一个项目(
bun init),体验一体化工具链 vs 传统npm init+npm install -D typescript jest webpack - 想了解前沿进展 → 2025 年底 Anthropic 收购 Bun 团队,Bun 成为 Claude Code 的底层运行时;Bun 团队开始用 Rust 重写部分核心模块,追求更高的内存安全性
- 想深入理解性能 → 对比 Bun 1.3 vs Node.js 24 在不同工作负载(HTTP 吞吐、JSON 解析、文件 I/O、冷启动)下的 benchmark 数据
关联概念
前置知识:JavaScript · TypeScript · Node.js 同族概念:Deno · JavaScriptCore · V8 引擎 应用场景:oh-my-pi · Claude Code · Serverless 工程化相关:npm · esbuild · webpack