为什么要从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
- macOS/Linux/WSL执行:
curl -fsSL https://bun.sh/install | bash - Windows用户:
• 推荐方案:WSL2装Ubuntu再装Bun
• 原生方案:Bun 1.4+支持Windows native
• 验证安装:bun --version - 添加环境变量:
export PATH="$HOME/.bun/bin:$PATH" - 升级Bun:
bun upgrade
第二步:性能对比测试
用一个Hello World HTTP服务器对比:
Node.js版本
- 创建
server-node.js - 代码:
const http = require('http');
http.createServer((req, res) => {
res.end('Hello World');
}).listen(3000); - 启动:
node server-node.js - 压测:
wrk -t4 -c100 -d10s http://localhost:3000 - 结果:约32000 req/s
Bun版本
- 创建
server-bun.js - 代码:
Bun.serve({
port: 3000,
fetch(req) {
return new Response('Hello World');
}
}); - 启动:
bun server-bun.js - 压测同样命令
- 结果:约108000 req/s,3.4倍提升
冷启动对比
- Node.js:约85ms
- Bun:约22ms
提示:实际业务场景性能提升可能不如”Hello World”夸张,但对于I/O密集型Web服务通常有2-3倍提升
第三步:用Bun运行TypeScript
Bun原生支持TypeScript,无需编译步骤:
- 创建
app.ts文件 - 直接写TypeScript:
interface User { id: number; name: string; }
const users: User[] = [
{ id: 1, name: "张三" },
{ id: 2, name: "李四" }
];
console.log(users); - 直接运行:
bun run app.ts - 无需tsc编译
- 支持ESM和CommonJS混用
第四步:从npm迁移到Bun
Bun完全兼容npm生态:
- 安装依赖:
bun install(比npm快10倍) - 运行package.json scripts:
bun run dev - 替代命令:
• npm install → bun install
• npm run dev → bun run dev
• npx tsc → bunx tsc
• npm exec → bun x
迁移实战案例(Express项目):
- 原项目:Express + TypeScript + npm
- 替换package.json:
"scripts": { "dev": "bun run --watch src/index.ts" } - 删除tsconfig的”target”: “ES2020″(Bun可处理)
- 安装:
bun install - 启动:
bun run dev - 多数代码无需修改
第五步:内置SQLite的使用
Bun内置SQLite客户端,无需安装额外包:
- 创建
db.js - 代码:
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()); - 运行:
bun run db.js - 速度比better-sqlite3快约2倍
第六步:用Bun的内置测试器
无需Jest或Vitest:Bun自带测试框架:
- 创建
test.ts - 代码:
import { test, expect } from "bun:test";
test("2 + 2", () => {
expect(2 + 2).toBe(4);
});
- 运行:
bun test - 支持并发测试、mock、快照测试
- 比Jest快5-10倍
第七步:生产环境Docker部署
- 创建
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"] - 构建:
docker build -t my-bun-app . - 运行:
docker run -p 3000:3000 my-bun-app - 镜像大小约150MB(vs Node镜像约350MB)
与Node.js共存策略
不建议一次性切换所有项目,建议:
- 新建项目直接用Bun
- 老项目保留Node,按模块迁移
- 用worker_threads在Node项目中调用Bun
- 关注官方Bun:Node兼容性表
- 避免在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+已被多家公司用于生产,但需做好回滚方案