谁能想到会有这样的消息
上周,就在你我还在为 node_modules 苦恼不已时,Anthropic 放出了一颗重磅炸弹:他们收购了 Bun。
没错,那家推出 Claude 的公司决定将未来押注在由一位脑洞大开的开发者用 Zig 编写的超快 JavaScript 运行时上。Claude Code 刚刚实现了 10 亿美金的收入,而显然,当你手中资金充裕时,买开发工具成为了一项很重要的投资。
为什么?因为 Claude Code 需要大量地执行 JavaScript,当你拥有数百万用户时,每毫秒的运行效率都至关重要。简单地说,如果你的业务依赖于快速执行代码,那么你当然愿意购买最快的运行时。
但我们先不谈这些商业秘辛,来看看与你息息相关的部分:Bun 是什么,为什么你应该关注它。
什么是 Bun(给来自 Node 的开发者)
Bun 就像有人看了整个 Node.js 的生态系统后想了一下:“要是我们能用一个工具替代所有这些东西,如何?”
以前,你可能需要这些工具:
node → 运行时
npm/pnpm/yarn → 包管理工具
webpack/esbuild/vite → 打包工具
jest/vitest → 测试运行器
ts-node/tsx → 执行 TypeScript
现在,你只需要:
bun → 实现所有上述功能
它就像电动滑板车对比带拖斗的车:部件更少,出错几率更低,甚至运行得更快。
重要的性能数据
虽然我并不太喜欢做 benchmark,因为这些数据总是容易被操纵。但这些数字实在过于震撼,不提鼓动人心都过意不去:
| 操作 | Node + pnpm | Bun | 差异 |
|---|---|---|---|
install(中型项目) | ~25s | ~3s | 快 8 倍 |
| 运行时启动 | ~50ms | ~5ms | 快 10 倍 |
| 执行测试 | 基础速度 | 快 2-3 倍 | 显著提升 |
| 转译 TypeScript | 需要额外工具 | 原生支持 | ∞ |
为什么会这么快?因为它是用 Zig 编写的,而不是 C++。而且它的作者 Jarred Sumner 是个以代码优化为业余爱好的人。他以前在 Stripe 工作时,就判断出世界上最重要的问题是 npm install 的速度太慢。
或许,他是对的。
已经可以用的功能(以及还有问题的地方)
Bun 兼容大多数 Node 的 API。如果你的代码使用 fs、path、http 或任何标准模块,很可能无需修改即可正常运行。
表现良好的功能
- Next.js:官方支持。运行
bun run dev即可。 - Express/Fastify:没有问题。
- 大多数 npm 包:Bun 一样可以解析
package.json和node_modules。 - TypeScript:原生支持,零配置。
- JSX:同样原生支持。
可能有问题的地方
- 部分具有 Node 原生绑定的包:一些需要重新编译。
- 依赖于 V8 特定行为的代码:Bun 使用 JavaScriptCore(Safari 的引擎)。
- 部分 Node 的特定 API 功能:如 Workers 和
cluster的部分功能。
尚不支持(但正在开发中)
- Windows 支持:虽然可以运行,但存在某些限制。
- Yarn PnP:不支持。
使用 Bun 创建你的第一个项目
如果你已经安装了 Node,安装 Bun 只需要一行命令:
curl -fsSL https://bun.sh/install | bash
如果你使用 macOS 和 Homebrew:
brew install oven-sh/bun/bun
验证安装是否成功:
bun --version
创建一个新项目
mkdir my-project && cd my-project
bun init
该命令将为你生成一个 package.json、tsconfig.json 和 index.ts 文件。无需额外提问或引导,这种效率我喜欢。
自动生成的文件
// index.ts
console.log("Hello via Bun!");
运行它:
bun run index.ts
是的,它直接运行 TypeScript。无需转译,无需 ts-node 或其他任何工具。
从 pnpm 迁移
如果你已经在使用 pnpm,那么迁移过程出人意料的简单:
# 选项 1:重新生成锁文件
rm -rf node_modules pnpm-lock.yaml
bun install
# 选项 2:使用现有的锁文件(实验性)
bun install
Bun 将生成其特有的 bun.lockb(二进制文件,更快解析)。如果你所在的团队尚未全面迁移,你也可以同时保留两个锁文件以满足需求。
package.json 无需修改
{
"scripts": {
"dev": "next dev",
"build": "next build",
"test": "vitest"
}
}
你依旧可以运行 bun run dev、bun run build 和 bun run test。脚本使用方式保持不变。
测试:从 Vitest 到 Bun
Bun 自带一个测试运行器,并兼容 Jest/Vitest 的 API:
// sum.test.ts
import { expect, test } from "bun:test";
import { sum } from "./sum";
test("2 + 2 = 4", () => {
expect(sum(2, 2)).toBe(4);
});
运行命令:
bun test
我仍然想用 Vitest 怎么办?
完全可以。Bun 可以作为 Vitest 的运行时:
bun run vitest
这样你既享受了 Bun 的快速性能,同时保留了 Vitest 的特性。可谓两全其美。
最快的 HTTP 服务器
Bun 自带了一个让 Express 汗颜的 HTTP 服务器:
Bun.serve({
port: 3000,
fetch(req) {
return new Response("你好,来自 Bun!");
},
});
console.log("服务器启动于 http://localhost:3000");
它使用标准的 fetch API(Request/Response 结构)。如果你之前使用过 Cloudflare Workers 或 Deno,会很容易上手。
Hello World 基准测试
在我的设备上(M1 Pro),一个 Hello World 服务器的性能分别为:
- Express:~15,000 req/s
- Fastify:~45,000 req/s
- Bun.serve:~150,000 req/s
是的,速度比 Express 快了将近 10 倍。这不是笔误。
环境变量
Bun 自动加载 .env 文件。无需 dotenv,也无需额外配置。
# .env
DATABASE_URL=postgres://localhost/mydb
// index.ts
console.log(Bun.env.DATABASE_URL);
这样简单上手,即开即用。
集成 SQLite
这个特性让我眼前一亮:Bun 直接集成了 SQLite 数据库。
import { Database } from "bun:sqlite";
const db = new Database("mydb.sqlite");
db.run("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
db.run("INSERT INTO users (name) VALUES (?)", ["陈伟"]);
const users = db.query("SELECT * FROM users").all();
console.log(users);
无需安装 better-sqlite3 或 sql.js 插件,开箱即用。
打包工具
Bun 还可以将你的代码打包为适合生产环境使用的文件:
bun build ./index.ts --outdir ./dist
Bun 的速度甚至比原本就很快的 esbuild 更胜一筹。对于大多数项目来说,生成结果足以胜任。
但如果你需要更复杂的功能(代码分割、更高级的 tree shaking 等),你可能仍需要依赖 Vite 或 webpack。但在很多场景下,Bun 的打包功能已经足够用。
何时不适合使用 Bun
并不是所有情况都适合用 Bun:
- 关键性生产环境且不允许试验:虽然 Bun 相对稳定,但 Node 经过了 15 年的丰富修复。
- 依赖特定原生绑定的包:某些包需要额外的努力。
- 主要用于 Windows 平台:Bun 支持有限,其第一优先级仍是 macOS/Linux。
- 团队不愿学习新工具:有时最好的工具就是大家都熟悉的工具。
何时适合使用 Bun
- CI/CD 环境下:
install时间大幅缩短可以节约实际成本,值得尝试。 - 脚本与内部工具:启动速度提升让脚本运行如闪电般迅速。
- 无遗留包袱的新项目:用 Bun 起步会比 Node + npm + tsx + vitest + … 简单得多。
- 无服务器/边缘计算:启动时间更短 = 冷启动减少 = 更低延迟 = 用户更满意。
- Anthropic 的支持:背靠拥有资金和动力的巨头,未来发展潜力巨大。
我的建议
如果你准备启动一个新项目,并且没有团队的限制,那就试试 Bun 吧。最坏的结果也只是回到 Node 的怀抱,同时你还学到了新东西。
如果你已经有在生产环境中的项目,建议从 CI/CD 的环境上进行评估。在这里,你会感受到最明显的差异,并且安全风险最低。如果 bun install 能够兼容你的所有依赖,那么你就大获全胜了。
当然,如果你是那种喜欢冒险的人,可以直接将它投入生产使用,然后告诉我你的体验如何。我目前还没敢尝试,但正在着手进行 CI 的迁移。慢慢来。
总结: Bun 是一个集运行时、包管理器、打包工具和测试运行器于一体的 JavaScript 运行时,比 Node 快得多。Anthropic 刚刚对其进行了收购,Bun 可以兼容大多数现有的 TypeScript 项目。建议优先在 CI 环境进行测试体验。
本文原文为西班牙语,借助AI翻译。