你肯定经历过这个场景——
新项目第一天。npm init -y 很快,但接下来装 typescript、ts-node、nodemon、eslint、prettier……等依赖装完,半小时过去了。然后你开始写 tsconfig.json,对着文档调 target、module、moduleResolution,又过去二十分钟。终于跑起来了,你改一行代码,ts-node 重新编译花了两秒。
这时候你隔壁同事用 Bun,三秒启动,改代码瞬间重跑。
这不是夸张。我实测了一下,同一个 TypeScript 文件,ts-node 冷启动约 1.8s,Bun 是 0.08s。差了 20 倍。
Node.js 生态在"打补丁"
Node.js 诞生 15 年了,核心体验没变过——你仍然需要手动拼一堆工具才能开始写代码。
TypeScript 已经是事实标准了,但 Node.js 至今不原生支持 .ts 文件。你需要 ts-node 或 tsx 来跑,需要 tsc 来编译,需要 nodemon 来热重载。这三样东西各管各的,版本兼容性全靠运气。
包管理更是一团乱麻:npm、yarn、pnpm,各有各的 lockfile,各有各的坑。一个团队里混用三个包管理器的情况,你应该见过。
人们说"装个 tsx 就好了"、"用 pnpm 就快了"——这些都是在同一个老架构上打补丁。补丁打多了,你甚至忘了原来可以不需要补丁。
Bun 做了一件什么事?
Bun 用 Zig 从零写了整套工具链,把三件事合一:
- JS/TS 运行时 — 原生执行
.ts文件,不需要任何编译配置 - 包管理器 —
bun install比 npm 快一个数量级 - 打包器 + 测试器 — 内置的,不需要 webpack、jest
一句话:装完 Bun,你就可以直接 bun run index.ts,不需要装任何别的东西。
它的快不是玄学。Node.js 基于 V8(为 Chrome 设计),Bun 用 JavaScriptCore(Safari 引擎),启动开销天然更小。再加上 Zig 写的 I/O 层避开了 libuv 中间层,网络请求和文件读写都更快。
上手:三行命令
Windows PowerShell 里跑这一行:
powershell -c "irm bun.sh/install/windows | iex"
装完验证:
bun --version
然后新建一个 .ts 文件:
// index.ts —— 注意,没有任何 tsconfig.json
const nickname: string = "9527";
const age: number = 123;
console.log(`我是${nickname},我${age}岁`);
直接跑:
bun run index.ts
没有 npm init,没有 tsconfig.json,没有 ts-node。就三步:装 Bun → 写代码 → 跑。
TypeScript 的类型检查在运行时自动生效。你写 const age: number = '123',Bun 直接报错,不需要等 tsc --noEmit。
实战:用 Bun 调 AI 大模型
来点实际的。假设你要写一个调用 DeepSeek API 的小脚本。
新建项目目录:
mkdir ai-demo && cd ai-demo
bun init
装两个依赖(axios 发请求,dotenv 读环境变量):
bun add axios dotenv
注意这里的 bun add —— 它等价于 npm install,但跑完之后你会在目录里看到 bun.lock 而不是 package-lock.json。二进制格式,比 JSON 小一个数量级。
新建 .env:
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_API_KEY=你的key
新建 chat.ts:
import axios from 'axios';
import dotenv from 'dotenv';
dotenv.config();
async function chat() {
try {
const res = await axios.post(
`${process.env.DEEPSEEK_BASE_URL}/v1/chat/completions`,
{
model: 'deepseek-v4-flash',
messages: [{
role: 'user',
content: '你好,介绍一下Bun'
}]
},
{
headers: {
'Content-Type': "application/json",
Authorization: `Bearer ${process.env.DEEPSEEK_API_KEY}`
}
}
);
console.log(res.data.choices[0].message.content);
} catch (err) {
console.log((err as Error).message);
}
}
chat();
跑:
bun run chat.ts
十几行代码,一个调用大模型的脚本就好了。
你看这个过程:没有 tsconfig.json,没有手动装 typescript 和 @types/node,甚至没有 npx。编译、包管理、运行,Bun 全包了。你的注意力只花在业务逻辑上——请求结构怎么组织、API Key 怎么安全管理、异常怎么处理。这些才是你真正该想的事。
TypeScript + Bun:JS 弱类型的终局方案
很多新手觉得 TypeScript 是"加负担"。看一个例子。
用户在 input 框里填了年龄 25,你拿来做加法——userInput + 10——结果是 "2510",不是 35。因为 input.value 始终是字符串,JavaScript 默默地做了字符串拼接而不是数学加法。不报错,不警告,bug 可能在上线三个月后才被发现。
TypeScript 要解决的就是这个问题:
function add(a: number, b: number): number {
return a + b;
}
let userInput = '25'; // 从 input 拿到的,是字符串
add(userInput, 10); // ❌ 编译时报错,不允许
add(Number(userInput), 10); // ✅ 显式转换,35
TypeScript 不是在"限制"你,它是在你不小心的时候拦住你。
而 Bun 让 TypeScript 的使用成本降到了零。以前你配 ts 环境要搞半天,现在 bun run 直接跑。这让 TypeScript 从一个"大项目才用"的东西,变成了"写个脚本也能用"的东西。
为什么 Anthropic 收购了 Bun?
2025 年底,Anthropic 收购了 Bun 的母公司 Oven。Bun 成了 Claude Code 的底层运行时。
这件事值得琢磨。Claude Code 是一个 AI 编程工具,它需要在沙箱里频繁启动 JS/TS 代码——几百毫秒的 Node.js 冷启动是不可接受的,Bun 的 0.08s 正好解决了这个问题。
更深一层:AI Agent 天然需要 TypeScript。 Agent 要写代码、要调 API、要处理大量数据——弱类型的 JS 在这种场景下出错的概率太高了。而 TypeScript 的类型系统让你在编译阶段就抓到大部分低级错误,Agent 写出来的代码质量更高。
所以 Anthropic 买的不仅是一个更快的运行时——它买的是 AI Agent 时代的基础设施层。当 AI 开始大规模写代码的时候,跑代码的环境必须又快又安全。Bun 是目前唯一同时满足这两个条件的。
我的建议:新项目直接切 Bun
如果你维护的是一个已有 200 个依赖的老项目,别急着迁。迁移成本不值得。
但如果你正在——
- 开一个新项目
- 写一个脚本或工具
- 做一个 AI Agent 相关的原型
- 教别人写 TypeScript
直接用 Bun。 省去的那堆配置时间,你可以用来写真正重要的代码。
Bun 不是 Node.js 的"平替"——它是 Node.js 应该成为的样子。