Bun:你还在配 tsconfig,别人已经跑完 100 次请求了

0 阅读5分钟

你肯定经历过这个场景——

新项目第一天。npm init -y 很快,但接下来装 typescript、ts-node、nodemon、eslint、prettier……等依赖装完,半小时过去了。然后你开始写 tsconfig.json,对着文档调 targetmodulemoduleResolution,又过去二十分钟。终于跑起来了,你改一行代码,ts-node 重新编译花了两秒。

这时候你隔壁同事用 Bun,三秒启动,改代码瞬间重跑。

这不是夸张。我实测了一下,同一个 TypeScript 文件,ts-node 冷启动约 1.8s,Bun 是 0.08s。差了 20 倍。


Node.js 生态在"打补丁"

Node.js 诞生 15 年了,核心体验没变过——你仍然需要手动拼一堆工具才能开始写代码。

TypeScript 已经是事实标准了,但 Node.js 至今不原生支持 .ts 文件。你需要 ts-nodetsx 来跑,需要 tsc 来编译,需要 nodemon 来热重载。这三样东西各管各的,版本兼容性全靠运气。

包管理更是一团乱麻:npm、yarn、pnpm,各有各的 lockfile,各有各的坑。一个团队里混用三个包管理器的情况,你应该见过。

人们说"装个 tsx 就好了"、"用 pnpm 就快了"——这些都是在同一个老架构上打补丁。补丁打多了,你甚至忘了原来可以不需要补丁。


Bun 做了一件什么事?

Bun 用 Zig 从零写了整套工具链,把三件事合一:

  1. JS/TS 运行时 — 原生执行 .ts 文件,不需要任何编译配置
  2. 包管理器bun install 比 npm 快一个数量级
  3. 打包器 + 测试器 — 内置的,不需要 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 应该成为的样子。