导语

如果你还在用传统的 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 核心模块的兼容层,包括 fspathhttpcrypto 等。主流 npm 包如 React、Express、Prisma 等都已在 Bun 上正常运行。你甚至可以:

# 用 Bun 运行现有 Node.js 项目
bun run index.js

需要注意的差异

  1. 原生模块(.node 文件):部分用 C++ 编写的原生模块可能不兼容,需要等待 Bun 原生实现。
  2. process 对象:Bun 的 process 是模拟的,部分冷门 API 可能未覆盖。
  3. 调试工具: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 开箱即用,不需要折腾构建配置。花一个下午了解一下,你的开发效率可能会提升一个档次。

推荐学习资源


更多推荐