Bun + TypeScript:下一代 JavaScript 全栈开发的正确打开方式

0 阅读6分钟

从 Node.js 到 Bun,从弱类型 JavaScript 到强类型 TypeScript,带你用最快的 JS 运行时构建 LLM Agent 后端。


一、Bun 是什么?凭什么比 Node.js 快?

image.png

如果你是一名 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.jsBun
引擎V8JavaScriptCore
实现语言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

image.png

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 大模型

image.png

这是整个项目最"硬核"的部分——用 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 请求包含三部分:

  1. 请求行:URL + Method + HTTP Version
  2. 请求头Content-Type: application/jsonAuthorization: Bearer xxx
  3. 请求体: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?

  1. :启动速度和包安装速度远超 Node.js,开发体验显著提升。
  2. 零配置 TypeScript:告别 ts-node、tsx 等额外工具,Bun 原生支持 TS。
  3. 一体化:运行时 + 包管理 + 打包 + 测试,一个工具搞定全链路。
  4. AI 时代的基础设施:Anthropic 收购 Bun 用于 Claude Code 底层,这意味着 Bun 正在成为 AI Agent 开发的"默认选择"。
  5. 生态兼容:兼容绝大多数 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 的组合都值得你投入时间去学习和使用。