Bun 运行时入门与生态概览:下一代 JavaScript 工具链

By | 2026年8月7日

开篇:为什么 Bun 值得你关注?

在 JavaScript 生态中,Node.js 长期占据主导地位,但它的启动速度、包管理效率一直为人诟病。Bun 的横空出世,试图用一套工具链解决这些问题。它不仅仅是一个运行时,更是一个包含打包器、测试运行器、包管理器的全家桶。根据官方基准,Bun 的启动速度比 Node.js 快 4 倍,安装依赖比 npm/yarn 快 20-100 倍。这些数字是否真实?本文将带你亲手验证,并评估 Bun 的生态现状。

环境准备:安装 Bun

Bun 的安装非常简单,支持 macOS、Linux 和 Windows(WSL)。在终端执行:


curl -fsSL https://bun.sh/install | bash

安装完成后,验证版本:


bun --version

如果你使用 macOS 且安装了 Homebrew,也可以:


brew install oven-sh/bun/bun

核心功能一:极速的包管理器

Bun 内置了包管理器,命令为 bun install。它的速度得益于全局模块缓存和硬链接,避免了 npm 的重复下载。

让我们创建一个新项目并安装依赖:


mkdir bun-demo
cd bun-demo
bun init -y
bun add express

bun add 会同时更新 package.json 并生成 bun.lockb 锁文件。注意,锁文件是二进制格式,用于确保依赖的确定性。

💡 小技巧:如果项目已有 package-lock.jsonyarn.lock,Bun 也能读取它们,但建议删除后重新生成 bun.lockb 以获得最佳性能。

核心功能二:内置打包器

Bun 可以直接打包 JavaScript/TypeScript 文件,无需额外配置。这对于快速原型或小项目非常方便。

创建一个入口文件 src/index.ts


// src/index.ts
import { add } from './math';

console.log('2 + 3 =', add(2, 3));

创建 src/math.ts


// src/math.ts
export function add(a: number, b: number) {
    return a + b;
}

执行打包:


bun build ./src/index.ts --outdir ./dist

打包产物在 dist/index.js,可以直接运行:


node dist/index.js

Bun 的打包器支持 JSX、TypeScript、CSS 模块等,并且可以 tree-shaking。对于更复杂的场景,你可能还是需要配置 bundler,但 Bun 已经足够简单。

核心功能三:内置测试运行器

Bun 的测试运行器兼容 Jest 的 API,但速度更快。我们写一个测试文件 src/math.test.ts


import { describe, expect, test } from 'bun:test';
import { add } from './math';

describe('math', () => {
    test('adds 2 + 3', () => {
        expect(add(2, 3)).toBe(5);
    });
});

运行测试:


bun test

输出会显示测试结果和耗时。Bun 的测试运行器还支持快照测试、mock 等,但需要注意,某些 Jest 的生态库可能不兼容。

核心功能四:作为运行时运行 TypeScript

Bun 原生支持 TypeScript,无需编译步骤。你可以直接运行 .ts 文件:


bun run src/index.ts

这在开发时非常方便,因为你不再需要 ts-nodetsx。Bun 的转译速度极快,启动时间几乎可以忽略。

注意:Bun 的 TypeScript 支持是转译(transpile),不做类型检查。如果你需要类型检查,请使用 tsc --noEmit 或 IDE 插件。

实战:用 Bun 构建一个简单的 HTTP 服务器

结合 Bun 的 API,我们可以创建一个高性能的 HTTP 服务器。Bun 提供了 Bun.serve 方法:


// server.ts
const server = Bun.serve({
    port: 3000,
    fetch(request) {
        const url = new URL(request.url);
        if (url.pathname === '/') {
            return new Response('Hello from Bun!');
        }
        if (url.pathname === '/json') {
            return Response.json({ message: 'Hello JSON' });
        }
        return new Response('Not Found', { status: 404 });
    },
});

console.log(`Server running at http://localhost:${server.port}`);

运行:


bun run server.ts

在浏览器访问 http://localhost:3000,你会看到响应。这个服务器的性能比 Node.js 的 Express 高很多,因为 Bun 底层使用原生代码处理请求。

生态概览:现状与挑战

Bun 的生态正在快速发展,但相比 Node.js 仍有差距。以下是一些关键点:

  • 框架支持:主流框架如 Next.js、Nuxt 已经支持 Bun(通过 bun run dev),但部分边缘功能可能不兼容。
  • 工具链:像 Prisma、TypeORM 等 ORM 在 Bun 下可能有问题,因为 Bun 的 Node.js 兼容层并非 100%。
  • 原生模块:Bun 支持通过 bun build --compile 将应用编译为可执行文件,但依赖原生模块(如 sharp)时可能需要额外配置。

💡 我的建议:如果你在开发新项目,且依赖较新,可以尝试 Bun;如果是维护老项目,建议先在 CI 中测试兼容性。

常见坑与踩坑经验

  1. Node.js 兼容性:Bun 实现了大部分 Node.js API,但并非全部。例如,process.nextTick 的行为略有不同。
  2. 锁文件bun.lockb 是二进制的,不能像 package-lock.json 那样直接阅读,但保证了确定性。
  3. 全局安装bun add -g 安装的全局包,路径与 npm 不同,可能导致某些工具找不到。
  4. Windows 支持:Bun 在 Windows 上需要 WSL,原生 Windows 支持仍在开发中。

总结与下一步

Bun 以其极致的性能和一体化的工具链,正在成为 JavaScript 生态中不可忽视的力量。通过本文的实践,你已经掌握了 Bun 的安装、包管理、打包、测试和服务器开发。

下一步,你可以尝试将现有的 Node.js 项目迁移到 Bun,或者用 Bun 构建一个完整的全栈应用。关注 Bun 的官方博客和 GitHub,了解最新进展。

如果你觉得本文有帮助,欢迎点赞和分享,让更多人了解 Bun!