Bun

1. 定义

Bun 是一个用 Zig 写的 JavaScript / TypeScript 一体化运行时,同时也是包管理器、打包器、测试运行器。定位是 Node.js + npm + webpack + jest 的统一替代品。 最大卖点:(启动、装包、跑测试都比 Node 生态快数倍),以及开箱即用(原生跑 TS、支持 JSX、内置一堆 API)。

类比:uv 之于 Python、cargo 之于 Rust——Bun 想做 JS 世界里”一个命令搞定运行 + 装包 + 打包 + 测试”的工具。读音就是英文单词 bun(面包)。

2. Bun 解决了什么问题

Node.js 生态是拼装出来的,每件事都要单独装工具:

任务Node 生态传统方案Bun
运行 JSnodebun run / bun
运行 TStsc 编译,或装 ts-nodebun 直接跑 .ts
装包npm / pnpm / yarnbun install(兼容 npm registry)
打包webpack / esbuild / rollupbun build
跑测试jest / vitestbun test
读环境变量dotenv自动读 .env

痛点:装一个前端/后端项目要拼装 5~6 个工具,各自配置、各自慢。Bun 把这些整合进单个二进制,且启动极快(进程冷启动比 Node 快很多,适合 CLI 和 serverless)。

3. 核心概念

  • Runtime(运行时):Bun 用的是 JavaScriptCore(Safari 的引擎),不是 Node 的 V8。原生支持 TypeScript、JSX、ESM/CommonJS 混用
  • Node 兼容层:实现了大部分 Node API(fspathhttp 等)和 node_modules 解析,多数 npm 包能直接跑
  • bun install:兼容 npm registry 和 package.json,用全局缓存 + 硬链接,速度极快;锁文件是二进制的 bun.lockb(新版也支持文本 bun.lock
  • 内置 APIBun.serve()(HTTP 服务器)、Bun.file()(文件读写)、内置 SQLite、WebSocket、密码哈希等,不用装第三方包
  • 单文件二进制bun build --compile 能把项目打包成一个可执行文件

4. 常用命令

运行

bun run index.ts              # 运行 TS/JS 文件(无需编译)
bun index.ts                  # run 可省略
bun run dev                   # 跑 package.json 里的 scripts.dev
bun --watch index.ts          # 文件变化自动重启(内置,不用 nodemon)
bun --hot index.ts            # 热重载(保留状态)

包管理(兼容 npm)

bun install                   # 安装 package.json 所有依赖(alias: bun i)
bun add express               # 添加生产依赖
bun add -d vitest             # 添加开发依赖
bun add -g pm2                # 全局安装
bun remove express            # 卸载
bun update                    # 升级依赖
bun outdated                  # 看哪些包过期

项目初始化

bun init                      # 初始化项目(生成 package.json + tsconfig 等)
bun create vite my-app        # 用模板创建项目(类似 npm create)

打包 / 编译

bun build ./index.ts --outdir ./dist          # 打包
bun build ./index.ts --outfile bundle.js --minify   # 压缩输出单文件
bun build ./cli.ts --compile --outfile mycli  # 编译成独立可执行文件

测试

bun test                      # 跑所有 *.test.ts(内置,语法类 jest)
bun test --watch              # 监听模式

其他

bunx create-vite              # 临时运行一个包(等价 npx)
bun run --bun vite            # 强制用 Bun 运行时跑(而非它调用的 node)

5. Bun vs Node vs Deno 速查

维度Node.jsDenoBun
引擎V8V8JavaScriptCore
原生跑 TS否(需编译/ts-node)
包管理需 npm/pnpm/yarn支持 npm + URL 导入内置 bun install
打包器需第三方内置内置 bun build
测试需 jest/vitest内置内置 bun test
Node 兼容原生兼容层兼容层(覆盖较广)
成熟度最成熟较新,生态在追赶
卖点生态最大安全(默认权限沙箱)速度 + 一体化

5.5 Bun vs pnpm vs Node(三者到底在比什么?)

这三个经常被放一起说,但其实不在同一层,容易搞混。先看它们各自是什么:

Node.jspnpmBun
本质JS 运行时(执行 JS 的引擎 + API)包管理器(只管装依赖)运行时 + 包管理 + 打包 + 测试一体
引擎V8无(不执行代码)JavaScriptCore
能跑 JS 吗不能
能装包吗需搭配 npm能(核心职责)能(内置 bun install
能跑 TS 吗不能(需编译)
能打包吗不能不能能(bun build

关键认知:

  • Node 和 pnpm 是搭档,不是竞品:Node 负责”跑代码”,pnpm 负责”把依赖装进 node_modules”。真实项目里常见组合就是 Node 运行时 + pnpm 装包
  • Bun 想一个人干完所有活:它既能替代 Node(跑代码),又能替代 pnpm(装包),还顺带把打包和测试也做了。所以 Bun 同时是 Node 的竞品、也是 pnpm 的竞品。
  • 对比维度不同
    • Bun vs Node → 比的是运行时(谁跑 JS 更快、谁原生支持 TS)
    • Bun vs pnpm → 比的是包管理(谁装依赖更快、锁文件方案)
    • pnpm vs Node → 没有可比性,一个装包一个跑代码

一句话记忆:Node 是”引擎”,pnpm 是”装依赖的工具”,Bun 是想把引擎 + 装依赖 + 打包 + 测试全包圆的”全家桶”。

装包速度粗略排序(越快越靠前):Bun ≳ pnpm > yarn > npm。运行时之争则是 Bun vs Node vs Deno(见上一节)。

6. 典型工作流

新项目

mkdir my-app && cd my-app
bun init                      # 生成 package.json + index.ts
bun add hono                  # 装个轻量 web 框架
bun --watch index.ts          # 开发时热重启

用 Bun 跑一个现有 Node 项目

git clone <repo>
cd <repo>
bun install                   # 读 package.json,比 npm install 快很多
bun run dev                   # 尝试用 Bun 跑(多数项目可直接跑)

内置 HTTP 服务器(不装任何包)

// server.ts
Bun.serve({
  port: 3000,
  fetch(req) {
    return new Response("Hello from Bun!");
  },
});
bun server.ts

7. 常见坑

  • 不是 100% Node 兼容:依赖某些冷门 Node 内部 API 或原生插件(N-API)的包可能跑不起来,跑之前先测
  • bun.lockb 是二进制:git diff 看不了,团队协作时可能想切成文本 lock(bun install --save-text-lockfile 或新版默认 bun.lock
  • 和 Node 版本行为差异:某些边界行为(如 stream、定时器精度)和 Node 不完全一致,迁移生产项目要充分测试
  • 全局装的工具用 node 还是 bun:有些 CLI 内部写死调 node,用 bun run --bun <cmd> 才会强制走 Bun 运行时
  • Windows 支持较晚:早期主要面向 macOS/Linux,Windows 上部分功能成熟度略低,注意版本

8. 延伸阅读 / 关联概念

  • esbuild — Bun 的打包能力思路类似(追求极速),但 esbuild 是纯打包器;见 esbuild.md
  • pnpm — 同为快速包管理器,pnpm 只管包不管运行时;Bun 是运行时 + 包管理一体;见 pnpm.md
  • Deno — 另一个”现代 JS 运行时”竞品,主打安全沙箱
  • Hono / Elysia — 常和 Bun 搭配的轻量 web 框架,Elysia 就是为 Bun 优化的
  • 官方文档:https://bun.sh/docs