MD 更新:2026/6/2

Bun

[!abstract] 一句话定义 Bun 是一个用 Zig 编写的、基于 JavaScriptCore 引擎的 一体化 JavaScript/TypeScript 工具链——把运行时、包管理器、打包器、转译器、测试运行器集成到一个二进制文件中,目标是成为 Node.js 的即插即用替代品。

为什么需要它?

开发一个现代 JS/TS 项目,你至少需要装这些工具:

功能传统工具链问题
运行代码Node.js启动慢(~25ms 空跑)
跑 TypeScriptts-nodetsx需要额外配置,启动更慢(~80-150ms)
装依赖npm / yarn / pnpm安装慢,各有各的 lockfile 格式
打包webpack / esbuild / vite又一个工具要装和配置
跑测试jest / vitest又一个工具要装和配置
转译 JSXbabel / @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,无需配置
Shellbun 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:fsnode:httpnode:path 等),大部分 npm 包可直接使用
  • 不兼容场景:依赖原生 C++ addon(如 sharpbcrypt)的包可能需要 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(如 sharpbcryptcanvas)可能不兼容,某些 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