谁能想到会有这样的消息

上周,就在你我还在为 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 + pnpmBun差异
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:

  1. 关键性生产环境且不允许试验:虽然 Bun 相对稳定,但 Node 经过了 15 年的丰富修复。
  2. 依赖特定原生绑定的包:某些包需要额外的努力。
  3. 主要用于 Windows 平台:Bun 支持有限,其第一优先级仍是 macOS/Linux。
  4. 团队不愿学习新工具:有时最好的工具就是大家都熟悉的工具。

何时适合使用 Bun

  1. CI/CD 环境下:install 时间大幅缩短可以节约实际成本,值得尝试。
  2. 脚本与内部工具:启动速度提升让脚本运行如闪电般迅速。
  3. 无遗留包袱的新项目:用 Bun 起步会比 Node + npm + tsx + vitest + … 简单得多。
  4. 无服务器/边缘计算:启动时间更短 = 冷启动减少 = 更低延迟 = 用户更满意。
  5. Anthropic 的支持:背靠拥有资金和动力的巨头,未来发展潜力巨大。

我的建议

如果你准备启动一个新项目,并且没有团队的限制,那就试试 Bun 吧。最坏的结果也只是回到 Node 的怀抱,同时你还学到了新东西。

如果你已经有在生产环境中的项目,建议从 CI/CD 的环境上进行评估。在这里,你会感受到最明显的差异,并且安全风险最低。如果 bun install 能够兼容你的所有依赖,那么你就大获全胜了。

当然,如果你是那种喜欢冒险的人,可以直接将它投入生产使用,然后告诉我你的体验如何。我目前还没敢尝试,但正在着手进行 CI 的迁移。慢慢来。


总结: Bun 是一个集运行时、包管理器、打包工具和测试运行器于一体的 JavaScript 运行时,比 Node 快得多。Anthropic 刚刚对其进行了收购,Bun 可以兼容大多数现有的 TypeScript 项目。建议优先在 CI 环境进行测试体验。

本文原文为西班牙语,借助AI翻译。