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 |
|---|---|---|
| 运行 JS | node | bun run / bun |
| 运行 TS | 先 tsc 编译,或装 ts-node | bun 直接跑 .ts |
| 装包 | npm / pnpm / yarn | bun install(兼容 npm registry) |
| 打包 | webpack / esbuild / rollup | bun build |
| 跑测试 | jest / vitest | bun test |
| 读环境变量 | 装 dotenv | 自动读 .env |
痛点:装一个前端/后端项目要拼装 5~6 个工具,各自配置、各自慢。Bun 把这些整合进单个二进制,且启动极快(进程冷启动比 Node 快很多,适合 CLI 和 serverless)。
3. 核心概念
- Runtime(运行时):Bun 用的是 JavaScriptCore(Safari 的引擎),不是 Node 的 V8。原生支持 TypeScript、JSX、ESM/CommonJS 混用
- Node 兼容层:实现了大部分 Node API(
fs、path、http等)和node_modules解析,多数 npm 包能直接跑 bun install:兼容 npm registry 和package.json,用全局缓存 + 硬链接,速度极快;锁文件是二进制的bun.lockb(新版也支持文本bun.lock)- 内置 API:
Bun.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.js | Deno | Bun |
|---|---|---|---|
| 引擎 | V8 | V8 | JavaScriptCore |
| 原生跑 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.js | pnpm | Bun | |
|---|---|---|---|
| 本质 | 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.ts7. 常见坑
- 不是 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