Bun 入门指南:新一代 JavaScript 运行时到底有多快?
导语
如果你还在用传统的 npm install 苦等依赖安装,或是觉得 Node.js 启动速度不够理想,那么你一定不能错过 Bun。作为近两年前端社区最炙手可热的新星,Bun 号称比 Node.js 快 4 倍,集运行时、包管理器、打包器、测试运行器于一身。本文将从零开始,带你快速上手 Bun,感受"一键到位"的开发体验。
一、Bun 是什么?
Bun 是一个全新的 JavaScript / TypeScript 运行时,由 Jarred Sumner 使用底层系统语言 Zig 构建。它的核心引擎基于苹果开源的 JavaScriptCore(WebKit 的 JS 引擎),而非 Node.js 使用的 V8。
一句话概括:Bun 想做 JavaScript 生态的"全家桶"——一个工具解决运行时、包管理、打包、测试四大需求。
与 Node.js 和 Deno 的对比如下:
| 特性 | Node.js | Deno | Bun |
|---|---|---|---|
| JS 引擎 | V8 | V8 | JavaScriptCore |
| 语言 | C++ | Rust | Zig |
| TypeScript | 需转译 | 原生支持 | 原生支持 |
| 包管理 | npm 外置 | 内置 | 内置(兼容 npm) |
| 打包 | 依赖 webpack 等 | 内置 | 内置 |
| 测试 | 依赖 Jest 等 | 内置 | 内置 |
| 启动速度 | 中等 | 快 | 极快 |
Bun 在 2023 年 9 月发布了 1.0 正式版,到 2025 年已经迭代到非常成熟的阶段,被越来越多的项目采用。
二、安装 Bun
macOS / Linux 用户只需一行命令:
curl -fsSL https://bun.sh/install | bash
Windows 用户可通过 WSL 或者官方提供的 .npm 方式安装:
npm install -g bun
安装完成后验证版本:
bun --version
# 输出类似: 1.2.x
三、包管理器:快得不像话
Bun 最直观的优势之一就是包安装速度。它使用全局缓存 + 二进制锁文件(bun.lockb),安装依赖时几乎瞬间完成。
基本命令对照
| 操作 | npm | Bun |
|---|---|---|
| 安装依赖 | npm install |
bun install |
| 添加包 | npm install axios |
bun add axios |
| 添加开发依赖 | npm install -D jest |
bun add -d jest |
| 移除包 | npm uninstall axios |
bun remove axios |
| 运行脚本 | npm run dev |
bun run dev |
| 全局安装 | npm install -g xxx |
bun add -g xxx |
速度实测
在一个典型的中型 React 项目中,node_modules 约 200MB:
# npm 安装耗时
$ npm install
added 1342 packages in 45s
# Bun 安装耗时
$ bun install
bun install v1.2.0
+ @types/react@19.0.0
+ react@19.0.0
...
182 packages installed [2.84s]
从 45 秒降到 3 秒,这就是 Bun 的杀手级体验。而且 bun.lockb 是二进制格式,体积更小、解析更快。
四、运行时:原生 TypeScript 支持
Bun 最大的亮点之一是原生运行 TypeScript 文件,无需任何配置。你不需要安装 ts-node,不需要手动配置 tsconfig.json(可选),直接跑就行。
示例:一个简单的 HTTP 服务器
创建 server.ts:
// server.ts
const server = Bun.serve({
port: 3000,
fetch(req) {
const url = new URL(req.url);
// 简单的路由
if (url.pathname === "/") {
return new Response("Hello from Bun!");
}
if (url.pathname === "/api/users") {
const users = [
{ id: 1, name: "Alice" },
{ id: 2, name: "Bob" },
];
return Response.json(users);
}
return new Response("Not Found", { status: 404 });
},
});
console.log(`Server running at http://localhost:${server.port}`);
运行:
bun run server.ts
# 或直接
bun server.ts
浏览器访问 http://localhost:3000,立即看到响应。不需要 package.json、不需要安装 Express,一个文件就是一个服务。
文件读写也很丝滑
Bun 内置了大量便捷 API,告别 fs 模块的繁琐:
// 读取文件(一行搞定)
const content = await Bun.file("./data.json").json();
// 写入文件
await Bun.write("./output.txt", "Hello Bun!");
// 读取文本
const text = await Bun.file("./readme.md").text();
console.log(content, text);
五、内置打包器
Bun 的打包器对标 esbuild,速度极快。对于简单的前端项目,你甚至不需要 Vite 或 Webpack。
打包单个文件
bun build ./src/index.ts --outdir ./dist
输出是高度优化的 JavaScript,支持 --minify 压缩:
bun build ./src/index.ts --outdir ./dist --minify
作为库的打包工具
如果你是 npm 包作者,Bun 可以帮你一步到位:
# 同时输出 ESM 和 CJS
bun build ./src/index.ts --outdir ./dist --format esm
bun build ./src/index.ts --outdir ./dist --format cjs
这就省去了配置 Rollup / tsup 的麻烦。
六、内置测试运行器
告别 Jest 的复杂配置。Bun 内置了兼容 Jest 风格的测试运行器:
// math.test.ts
import { describe, expect, test } from "bun:test";
function add(a: number, b: number): number {
return a + b;
}
describe("add function", () => {
test("1 + 2 = 3", () => {
expect(add(1, 2)).toBe(3);
});
test("负数相加", () => {
expect(add(-1, -2)).toBe(-3);
});
});
运行测试:
bun test
输出清晰,速度飞快。而且 expect API 与 Jest / Vitest 高度一致,迁移成本极低。
七、Bun 与 Node.js 的兼容性
这是大家最关心的问题:现有 Node.js 项目能直接跑在 Bun 上吗?
答案是:大部分可以。
Bun 实现了 Node.js 核心模块的兼容层,包括 fs、path、http、crypto 等。主流 npm 包如 React、Express、Prisma 等都已在 Bun 上正常运行。你甚至可以:
# 用 Bun 运行现有 Node.js 项目
bun run index.js
需要注意的差异
- 原生模块(.node 文件):部分用 C++ 编写的原生模块可能不兼容,需要等待 Bun 原生实现。
process对象:Bun 的process是模拟的,部分冷门 API 可能未覆盖。- 调试工具:Bun 支持 Chrome DevTools 调试,但 VSCode 集成仍在完善中。
建议做法:新项目直接用 Bun,老项目逐步验证迁移。
八、实战:用 Bun 快速搭建 REST API
下面是一个更完整的示例,展示如何用 Bun 原生能力搭建一个带数据库查询的 REST API。
// api.ts
import { Database } from "bun:sqlite";
// 初始化 SQLite 数据库(Bun 内置,零依赖)
const db = new Database(":memory:");
db.run(`
CREATE TABLE todos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
done INTEGER DEFAULT 0
)
`);
db.run("INSERT INTO todos (title) VALUES (?)", ["学习 Bun"]);
db.run("INSERT INTO todos (title) VALUES (?)", ["写一篇技术文章"]);
// 启动服务
Bun.serve({
port: 8080,
async fetch(req) {
const url = new URL(req.url);
const path = url.pathname;
const method = req.method;
// GET /todos — 获取所有待办
if (method === "GET" && path === "/todos") {
const todos = db.query("SELECT * FROM todos").all();
return Response.json(todos);
}
// POST /todos — 新增待办
if (method === "POST" && path === "/todos") {
const body = await req.json();
db.run("INSERT INTO todos (title) VALUES (?)", [body.title]);
return Response.json({ success: true }, { status: 201 });
}
return new Response("Not Found", { status: 404 });
},
});
console.log("API running at http://localhost:8080");
运行:
bun run api.ts
打开另一个终端测试:
curl http://localhost:8080/todos
# [{"id":1,"title":"学习 Bun","done":0},{"id":2,"title":"写一篇技术文章","done":0}]
一个 API 服务,零 npm install、零配置文件,从新建文件到跑起来不超过两分钟。这就是 Bun 带来的效率革命。
九、Bun 适用场景总结
| 场景 | 推荐度 | 理由 |
|---|---|---|
| 新项目搭建 | ★★★★★ | 全家桶集成,开箱即用 |
| 脚本/工具开发 | ★★★★★ | 原生 TS,启动极快 |
| 前端构建 | ★★★★ | 速度一流,但生态不如 Vite 成熟 |
| 全栈应用 | ★★★★ | 内置 SQLite、HTTP 服务、文件系统 API |
| 已有大型 Node 项目 | ★★★ | 需评估兼容性,逐步迁移 |
| Electron 桌面应用 | ★★ | 目前不支持 |
十、总结
Bun 不是来取代 Node.js 的——至少短期内不是——但它正在重新定义 JavaScript 开发工具链的体验标准。原生 TypeScript、闪电般的包管理、内置全家桶,这三个特性让它在脚本编写、新项目启动和中型应用开发中大放异彩。
对于初中级开发者来说,学习 Bun 的成本极低:API 几乎与 Node.js 一致,TypeScript 开箱即用,不需要折腾构建配置。花一个下午了解一下,你的开发效率可能会提升一个档次。
推荐学习资源
- 官方文档:https://bun.sh/docs
- Bun 官方博客:https://bun.sh/blog
- GitHub 仓库:https://github.com/oven-sh/bun
更多推荐


所有评论(0)