从 Node.js 到 Bun,从弱类型 JavaScript 到强类型 TypeScript,带你用最快的 JS 运行时构建 LLM Agent 后端。
一、Bun 是什么?凭什么比 Node.js 快?
如果你是一名 JavaScript/TypeScript 开发者,Node.js 一定不陌生。但今天要聊的 Bun,可能正在悄悄改变整个 JS 运行时的格局。
Bun 是一个更快、开箱即用、零配置的 JavaScript/TypeScript 运行时,同时内置了包管理器、打包器和测试运行器。它由 Jarred Sumner 用 Zig 语言编写,底层使用 JavaScriptCore(Safari 的引擎)而不是 V8,这使得它的启动速度和内存占用都远优于 Node.js。
用一句话概括:Bun 是 Node.js 的优化升级版,性能特别好。
更要命的是——Anthropic 已经收购了 Bun,并将其作为 Claude Code 的底层运行时。 这意味着,未来 AI 编程工具的基础设施,Bun 正在成为标准配置。
Bun vs Node.js 快速对比
| 特性 | Node.js | Bun |
|---|---|---|
| 引擎 | V8 | JavaScriptCore |
| 实现语言 | C++ | Zig |
| TypeScript | 需要额外配置 | 原生支持,零配置 |
| 包管理器 | npm/yarn/pnpm | 内置,比 npm 快 25x+ |
| 启动速度 | 较慢 | 极快 |
| 打包器 | 需要 webpack/rollup 等 | 内置 |
二、TypeScript:AI Agent 时代的标配语言
Bun 的另一大杀手锏是原生支持 TypeScript——不需要 ts-node、不需要编译步骤、不需要任何额外配置,直接 bun run index.ts 就能跑。
这非常重要,因为 TypeScript 已经成为 AI Agent 开发的标配语言。
TypeScript 来自微软,是 JavaScript 的超集,核心价值在于添加了类型约束。来看一段简单的对比:
// 1.ts - TypeScript 版本
const nickname: string = "9527";
const age: number = 18; // 编译时就能检查类型错误
console.log(`我是${nickname},我今年${age}岁`);
如果没有 TypeScript,下面这段代码在 JavaScript 中完全合法,却会在运行时产生预期之外的结果:
// 2.ts - 类型安全的加法
function add(a: number, b: number): number {
return a + b; // 明确是数学加法,不是字符串拼接
}
let a = 1;
let b = "2";
// add(a, b); // ❌ TypeScript 直接报错,帮你在编译期发现问题
let c: number = add(a, Number(b)); // ✅ 强制类型转换,安全通过
三、JavaScript 的"坑":为什么你需要 TypeScript
JavaScript 作为一门弱类型语言,有一些著名的设计缺陷,让开发者头疼不已。最经典的两个:
3.1 + 运算符的歧义
+ 既是数学加法,又是字符串拼接。当你写 1 + "2" 时,JS 不会报错,而是静默返回 "12"——这不是 bug,是 feature。但这种不报错的特性,让错误可能隐藏在系统里很久才被发现。
3.2 浏览器输入的类型陷阱
下面这个 HTML 例子非常经典:
<!-- a.html -->
<input type="text" id="ipt">
<script>
const ipt = document.getElementById("ipt");
ipt.addEventListener("change", function (event) {
console.log(event.target.value, typeof event.target.value);
// 你以为是 number,输出却是 string!
})
</script>
浏览器 input 输入,我们以为是数字,但实际上是字符串。 这就是动态类型的代价——类型错误不会在开发阶段暴露,而是在生产环境里"惊喜"出现。
TypeScript 正是为了解决这些问题而生。静态类型编译让 TS 文件在转换成 JS 文件时就能检查出类型或代码错误,把问题消灭在编码阶段。
四、实战一:用 Promise + async/await 封装异步操作
异步编程是 JS 开发的必修课。下面是一个经典的 sleep 函数封装:
// 3.js - 封装一个 sleep 函数
function sleep(t) {
// ES6 Promise:解决异步问题的核心 API
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, t);
});
}
async function main() {
console.log('---start---');
await sleep(2000); // 异步任务同步化,代码逻辑更清晰
console.log('---end---');
}
main();
这段代码展示了几个关键概念:
- Promise:ES6 提供的解决异步问题的核心 API,像一个"许诺"——未来某个时刻一定会完成。
- async/await:让异步代码看起来像同步代码,await 后面必须接受 Promise 对象。
- 异步任务同步化:这是现代 JS 后端开发的基础范式,所有 LLM API 调用都依赖这套机制。
五、实战二:Bun + Axios 调用 DeepSeek 大模型
这是整个项目最"硬核"的部分——用 Bun 运行 TypeScript,通过 Axios 调用 LLM 接口:
// axios.demo/index.ts - HTTP 请求 LLM 接口
import axios from "axios";
import dotenv from "dotenv";
dotenv.config();
async function chat() {
try {
const res = await axios.post(
`${process.env.DEEPSEEK_BASE_URL}`,
{
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: any) {
console.log(err.message);
}
}
chat();
这里有几个值得关注的技术细节:
5.1 Bun 替代 npm 做包管理
注意 package.json 中的依赖声明:
{
"dependencies": {
"axios": "^1.17.0",
"dotenv": "^17.4.2"
}
}
安装时只需要 bun install,运行只需要 bun run index.ts——没有 node_modules 地狱、没有 ts-node 配置、没有 webpack 构建。 Bun 既是运行时,也是包管理器。
5.2 HTTP 请求的"企业级"封装
代码注释中提到了一个关键对比:
- fetch:浏览器原生 HTTP 请求 API,简单但功能有限。
- axios:HTTP 请求的企业级框架,封装了 fetch,支持拦截器、超时、请求取消、自动 JSON 转换等高级特性。
5.3 POST 请求的结构
一次完整的 HTTP POST 请求包含三部分:
- 请求行:URL + Method + HTTP Version
- 请求头:
Content-Type: application/json、Authorization: Bearer xxx - 请求体:model、messages 等 JSON 数据
API Key 放在 Header 而非 URL 参数中——GET 请求有长度限制且有明文暴露风险,POST + Header 是生产环境的标准做法。
5.4 错误处理
LLM 调用可能出现的异常场景:网络超时、服务繁忙、API Key 无效……用 try/catch 包裹是必须的工程实践。
六、Bun 的零配置开发体验
来看这个项目的 tsconfig.json:
{
"compilerOptions": {
"lib": ["ESNext"],
"target": "ESNext",
"module": "Preserve",
"moduleDetection": "force",
"allowJs": true,
"types": ["bun"],
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"strict": true,
"noEmit": true
}
}
"types": ["bun"] 一行,让 VS Code 等编辑器直接识别 Bun 的全局 API。"noEmit": true 表示 Bun 直接运行 .ts 源文件,不需要像传统 Node.js 项目那样先编译到 .js 再执行——开发和调试体验直接拉满。
七、总结:为什么现在应该关注 Bun?
- 快:启动速度和包安装速度远超 Node.js,开发体验显著提升。
- 零配置 TypeScript:告别 ts-node、tsx 等额外工具,Bun 原生支持 TS。
- 一体化:运行时 + 包管理 + 打包 + 测试,一个工具搞定全链路。
- AI 时代的基础设施:Anthropic 收购 Bun 用于 Claude Code 底层,这意味着 Bun 正在成为 AI Agent 开发的"默认选择"。
- 生态兼容:兼容绝大多数 Node.js 生态的 npm 包(如 axios、dotenv),迁移成本极低。
快速上手
Windows 用户只需一行命令:
powershell -c "irm bun.sh/install/windows | iex"
安装完成后,创建一个新项目:
bun init # 初始化项目
bun install # 安装依赖
bun run index.ts # 直接运行 TypeScript!
JavaScript 给了我们灵活性,TypeScript 给了我们安全性,而 Bun 给了我们速度。 三者的结合,正是 2026 年构建 LLM Agent 后端的最佳实践。无论你是前端转全栈,还是后端开发者拥抱 AI 浪潮,Bun + TypeScript 的组合都值得你投入时间去学习和使用。