为什么要从Node.js迁移到Bun

Bun是Jarred Sumner在2022年创建、2024年达到1.0稳定版的JavaScript运行时。它用Zig语言编写,目标是”比Node.js更快、更简单”。在2026年Bun 1.3版本实测中:HTTP服务器吞吐量是Node.js的3.2倍、冷启动速度快4倍、TypeScript原生支持无需编译、内置打包器、内置测试器、内置SQLite客户端。对Node.js生态的兼容性已经达到95%以上,多数项目可以近乎零成本迁移。本教程从实践角度详解迁移策略。

第一步:安装Bun

  1. macOS/Linux/WSL执行:curl -fsSL https://bun.sh/install | bash
  2. Windows用户:
    • 推荐方案:WSL2装Ubuntu再装Bun
    • 原生方案:Bun 1.4+支持Windows native
    • 验证安装:bun --version
  3. 添加环境变量:export PATH="$HOME/.bun/bin:$PATH"
  4. 升级Bun:bun upgrade

第二步:性能对比测试

用一个Hello World HTTP服务器对比:

Node.js版本

  1. 创建 server-node.js
  2. 代码:
    const http = require('http');
    http.createServer((req, res) => {
    res.end('Hello World');
    }).listen(3000);
  3. 启动:node server-node.js
  4. 压测:wrk -t4 -c100 -d10s http://localhost:3000
  5. 结果:约32000 req/s

Bun版本

  1. 创建 server-bun.js
  2. 代码:
    Bun.serve({
    port: 3000,
    fetch(req) {
    return new Response('Hello World');
    }
    });
  3. 启动:bun server-bun.js
  4. 压测同样命令
  5. 结果:约108000 req/s,3.4倍提升

冷启动对比

  • Node.js:约85ms
  • Bun:约22ms

提示:实际业务场景性能提升可能不如”Hello World”夸张,但对于I/O密集型Web服务通常有2-3倍提升

第三步:用Bun运行TypeScript

Bun原生支持TypeScript,无需编译步骤:

  1. 创建 app.ts 文件
  2. 直接写TypeScript:
    interface User { id: number; name: string; }
    const users: User[] = [
    { id: 1, name: "张三" },
    { id: 2, name: "李四" }
    ];
    console.log(users);
  3. 直接运行:bun run app.ts
  4. 无需tsc编译
  5. 支持ESM和CommonJS混用

第四步:从npm迁移到Bun

Bun完全兼容npm生态:

  1. 安装依赖:bun install(比npm快10倍)
  2. 运行package.json scripts:bun run dev
  3. 替代命令:
    • npm install → bun install
    • npm run dev → bun run dev
    • npx tsc → bunx tsc
    • npm exec → bun x

迁移实战案例(Express项目):

  1. 原项目:Express + TypeScript + npm
  2. 替换package.json:"scripts": { "dev": "bun run --watch src/index.ts" }
  3. 删除tsconfig的”target”: “ES2020″(Bun可处理)
  4. 安装:bun install
  5. 启动:bun run dev
  6. 多数代码无需修改

第五步:内置SQLite的使用

Bun内置SQLite客户端,无需安装额外包:

  1. 创建 db.js
  2. 代码:
    import { Database } from "bun:sqlite";
    const db = new Database("mydb.sqlite");
    db.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
    db.exec("INSERT INTO users (name) VALUES ('张三')");
    const query = db.query("SELECT * FROM users");
    console.log(query.all());
  3. 运行:bun run db.js
  4. 速度比better-sqlite3快约2倍

第六步:用Bun的内置测试器

无需Jest或Vitest:Bun自带测试框架:

  1. 创建 test.ts
  2. 代码:
    import { test, expect } from "bun:test";
    test("2 + 2", () => {
    expect(2 + 2).toBe(4);
    });
  1. 运行:bun test
  2. 支持并发测试、mock、快照测试
  3. 比Jest快5-10倍

第七步:生产环境Docker部署

  1. 创建 Dockerfile:
    FROM oven/bun:1.3
    WORKDIR /app
    COPY package.json bun.lockb ./
    RUN bun install --frozen-lockfile
    COPY . .
    EXPOSE 3000
    CMD ["bun", "run", "start"]
  2. 构建:docker build -t my-bun-app .
  3. 运行:docker run -p 3000:3000 my-bun-app
  4. 镜像大小约150MB(vs Node镜像约350MB)

与Node.js共存策略

不建议一次性切换所有项目,建议:

  1. 新建项目直接用Bun
  2. 老项目保留Node,按模块迁移
  3. 用worker_threads在Node项目中调用Bun
  4. 关注官方Bun:Node兼容性表
  5. 避免在Bun中用node:vm等实验模块

效率数据

实测某SaaS产品(Express+SQLite项目)迁移Bun后:
• 启动时间:3.2秒 → 0.8秒
• 内存占用:120MB → 78MB
• HTTP吞吐:提升2.8倍
• npm install:40秒 → 4秒

常见误区

  • Q:Bun是否能完全替代Node?A:还不行,少数原生模块(如某些Python绑定)需要Node
  • Q:Bun的兼容性?A:对Node API的兼容度约95%,少数ESM细节有差异
  • Q:生产环境稳定吗?A:Bun 1.2+已被多家公司用于生产,但需做好回滚方案