正在加载,请稍候…

Bun 运行时:迁移 Node.js 应用实现 3 倍性能

将 Node.js 应用迁移到 Bun——兼容层、内置打包器、SQLite、热重载、测试运行器,以及与 Node.js 和 Deno 的基准测试对比。

Bun 运行时:迁移 Node.js 应用实现 3 倍性能

什么是 Bun?

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

Bun 运行时:迁移 Node.js 应用实现 3 倍性能 插图

安装与迁移

# 安装 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}`)

Bun 运行时:迁移 Node.js 应用实现 3 倍性能 插图

内置 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 运行时:迁移 Node.js 应用实现 3 倍性能 插图

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 按预期工作