
什么是 Bun?
Bun 是一个基于 JavaScriptCore(Safari 引擎)的全能 JavaScript 运行时。它将运行时、打包器、测试运行器和包管理器集成在一个二进制文件中。

安装与迁移
# 安装 Bun
curl -fsSL https://bun.sh/install | bash
# 使用 Bun 运行 Node.js 应用(大多数应用无需修改即可运行)
bun run src/index.ts # 原生支持 TypeScript!
# 替换 npm 脚本
bun install # 比 npm 快约 25 倍
bun run dev
bun run build
Bun 内置 HTTP 服务器
// 比 Express/Fastify 快得多
const server = Bun.serve({
port: 3000,
async fetch(req) {
const url = new URL(req.url)
if (url.pathname === '/') {
return new Response('Hello from Bun!')
}
if (url.pathname === '/json') {
return Response.json({ message: 'Hello', timestamp: Date.now() })
}
return new Response('Not found', { status: 404 })
},
})
console.log(`Listening on port ${server.port}`)
内置 SQLite
import { Database } from 'bun:sqlite'
const db = new Database('myapp.db')
// 创建表
db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL
)
`)
// 预编译语句(快速、安全)
const insertUser = db.prepare('INSERT INTO users (name, email) VALUES ($name, $email)')
const getUser = db.prepare('SELECT * FROM users WHERE id = $id')
const getAllUsers = db.prepare('SELECT * FROM users LIMIT $limit OFFSET $offset')
// 执行
insertUser.run({ $name: 'Alice', $email: 'alice@example.com' })
const user = getUser.get({ $id: 1 })
const users = getAllUsers.all({ $limit: 20, $offset: 0 })
Bun 测试运行器
import { describe, test, expect, beforeEach } from 'bun:test'
describe('UserService', () => {
let service: UserService
beforeEach(() => {
service = new UserService(mockDb)
})
test('创建用户', async () => {
const user = await service.create({ name: 'Bob', email: 'bob@test.com' })
expect(user.id).toBeDefined()
expect(user.name).toBe('Bob')
})
test('重复邮箱抛出异常', async () => {
await service.create({ name: 'Bob', email: 'bob@test.com' })
expect(() =>
service.create({ name: 'Bob 2', email: 'bob@test.com' })
).toThrow('Email taken')
})
})
bun test # 运行所有测试
bun test --watch # 监听模式
bun test --coverage # 覆盖率报告
Bun 打包器
// build.ts
await Bun.build({
entrypoints: ['./src/index.ts'],
outdir: './dist',
target: 'bun',
minify: true,
sourcemap: 'external',
splitting: true,
})
性能对比
| 基准测试 | Bun | Node.js 22 | Deno |
|---|---|---|---|
| HTTP 请求/秒 | ~120k | ~68k | ~72k |
| 安装依赖 | 1.2s | 31s | N/A |
| 测试运行 | 0.3s | 2.1s | 0.8s |
| 启动时间 | 2ms | 40ms | 50ms |
迁移注意事项
__filename和__dirname在 Bun 中可用(不仅限于 ESM)- 大多数 npm 包可用;某些原生插件可能不兼容
node:前缀导入可用:import fs from 'node:fs'process.env按预期工作