Bun:重新定义 JavaScript 运行时
引言
如果你写过几年 Node.js,下面的场景一定不陌生:
-
想跑个 TypeScript 文件,得先
npm i -D tsx -
想跑个测试,得装 jest 或 vitest
-
想热重载,得装 nodemon
-
npm install慢到可以去倒杯咖啡 -
monorepo 里
workspace:*协议报错,得切到 pnpm 或 yarn
2023 年,一个叫 Bun 的工具横空出世,把这些痛点一次性解决。它不是某个工具的替代品,而是一整套工具链的替代品。
一、Bun 是什么
Bun 是一个 JavaScript 运行时,和 Node.js 是同一个生态位的东西——你写的 .js / .ts 文件,既能用 node a.js 跑,也能用 bun a.js 跑。
但它不止是运行时。Bun 把 JavaScript 开发者日常需要的四件事打包成了一个二进制文件:
| 角色 | 传统工具链 | Bun |
|---|---|---|
| 运行时 | Node.js | Bun 自身 |
| 包管理器 | npm / pnpm / yarn | bun install |
| 打包器 | webpack / esbuild | bun build |
| 测试运行器 | jest / vitest | bun test |
| TS/JSX 执行器 | tsx / ts-node | bun run file.ts |
一句话概括:
Node.js + npm + tsx + jest + esbuild ≈ Bun
二、Bun 的核心特点
1. 快——真的快
Bun 用 Zig 语言编写(一种系统级编程语言,性能接近 C),底层调优非常激进:
-
bun install比npm install通常快 10–30 倍 -
服务启动比 Node 快数倍
-
HTTP 请求吞吐量在基准测试中常常是 Node 的 3–5 倍
为什么这么快?因为它并行下载、用全局缓存、不重复解析依赖树,并且二进制本身就是原生编译的,没有 Node 的 V8 解释启动开销。
2. 原生支持 TypeScript
这是最让人心动的一点。Bun 内置了 TypeScript 编译器,你直接:
bun run src/index.ts
不需要 tsconfig.json(可选)、不需要 tsc、不需要 tsx、不需要 ts-node。Bun 会即时把 TS 转译成 JS 再执行。
甚至 JSX / TSX 也原生支持,写 React 组件不用任何配置就能跑。
3. 原生支持 ESM 和 CommonJS
Node 里 ESM 和 CJS 的混用一直是噩梦——__dirname 在 ESM 里没有、.mjs 和 .cjs 后缀搞混、require 不能直接在 ESM 用。
Bun 完全兼容两者,并且同一个文件里可以混用 import 和 require,不用配 "type": "module"。
4. 自带热重载
bun --watch src/index.ts
改文件自动重启,不需要 nodemon。
5. 完整的 Node API 兼容
fs、path、http、crypto、process……Node 标准库 Bun 基本都实现了。大部分 npm 包能直接跑,Elysia、Hono、Express 这些 Web 框架都能用。
6. 支持 workspace:* 协议
monorepo 用户的福音。Bun 原生支持 workspace:* 协议(pnpm 也支持,npm 不支持),并且 bun install 在大型 monorepo 里的速度优势更明显。
7. 内置 Web API
fetch、Request、Response、WebSocket、FormData 这些浏览器里的 API,Bun 全部内置,不用 node-fetch、不用 ws。
三、Bun vs Node.js:核心区别
| 维度 | Node.js | Bun |
|---|---|---|
| 实现语言 | C++ (V8 引擎) | Zig (JavaScriptCore 引擎) |
| JS 引擎 | V8(Chrome 同款) | JavaScriptCore(Safari 同款) |
| TS 支持 | 需借助 tsx/ts-node | 原生支持 |
| JSX 支持 | 需打包器配置 | 原生支持 |
| 包管理器 | npm(独立工具) | 内置 bun install |
| 测试运行器 | 需装 jest/vitest | 内置 bun test |
| 打包器 | 需 webpack/esbuild | 内置 bun build |
| 热重载 | 需 nodemon | --watch 原生支持 |
workspace:* |
不支持 | 支持 |
| ESM/CJS 混用 | 严格分离 | 自由混用 |
| Web API | 部分(Node 18+ 才有 fetch) | 全套内置 |
| 生态成熟度 | 极其成熟 | 快速追赶中 |
| 稳定性 | 生产级 | 1.0 后已可生产用 |
引擎差异:V8 vs JavaScriptCore
-
Node 用 V8(Google 出品,Chrome 浏览器同款)
-
Bun 用 JavaScriptCore(Apple 出品,Safari 同款)
JavaScriptCore 的冷启动速度比 V8 快,这是 Bun 启动快的根本原因之一。但 V8 的长期运行优化(JIT 热点优化)更强,所以长时间跑的服务 V8 不一定慢。这也是为什么 Bun 适合脚本、CLI、Serverless 冷启动场景,而 Node 在长跑服务上仍有优势。
四、Bun 的实际用法速览
1. 跑一个 TS 文件
bun run hello.ts
2. 启动带热重载的服务
bun --watch src/server.ts
3. 安装依赖(monorepo 友好)
bun install
4. 加包
bun add elysia
bun add -d typescript
5. 跑测试
bun test
测试文件 sum.test.ts:
import { expect, test } from "bun:test";
test("1 + 1 = 2", () => {
expect(1 + 1).toBe(2);
});
6. 打包
bun build ./src/index.ts --outfile=app.js
五、Bun 适合谁,不适合谁
适合
-
新项目:尤其是 TypeScript 项目,能省掉一堆配置
-
脚本 / CLI 工具:启动快、原生 TS,写工具脚本爽
-
Serverless / Edge:冷启动快是巨大优势
-
monorepo:
workspace:*协议 + 快速 install -
原型开发:少装工具多写代码
需要谨慎
-
重度的 Node 老项目:某些原生模块(
.node二进制)兼容性偶有问题,需测试 -
强依赖 Node 特定 API 的库:极少数 API 行为可能略有差异
-
团队已有稳定 Node 工具链:迁移成本要评估
六、安装
macOS / Linux / WSL:
curl -fsSL https://bun.sh/install | bash
Windows (PowerShell):
powershell -c "irm bun.sh/install.ps1 | iex"
验证:
bun --version
结语
Node.js 不会消失,它的生态和稳定性是无可替代的。但 Bun 代表了一种新的可能性:把开发者的日常工具链合并成一个高性能二进制,让"开箱即用"这件事真正落地。
如果你还没试过,花十分钟装一个,跑一下你的某个 TS 文件,你会立刻感受到那种"为什么以前要装这么多东西"的震撼。
传送门:

浙公网安备 33010602011771号