
启动快 20 倍。
HTTP 吞吐量高 3 倍。
WebSocket 快 7 倍。
SQLite 快 9 倍。
再加上内置的图像处理、无头浏览器、一体化工具链和单文件编译------
Bun 不是简单的性能优化,而是对 JavaScript 开发体验的全面重构。
一、引擎层:JavaScriptCore 带来的先天优势
Bun 选择 JavaScriptCore(JSC) 而非 V8。
核心目标?极致冷启动。
在 Serverless、CLI 工具和边缘计算场景中,启动速度直接决定用户体验和成本。
性能对比
| 指标 | Bun | Node.js | 领先 |
|---|---|---|---|
| 空脚本启动时间 | ~5ms | ~50ms | 10~20 倍 |
| 闲置内存占用 | 基准 | 多 40% | 少 40% |
| 底层语言 | Zig(正用 Rust 重写) | C++ | 更安全、更精细 |
实测代码
bash
# Bun - 约 5ms
time bun -e "console.log('hi')"
# Node - 约 50ms
time node -e "console.log('hi')"
二、HTTP 与 WebSocket:原生高性能网络
HTTP 服务器
Bun 的 Bun.serve() 语法极简。
吞吐量:59,026 req/s vs Node 的 19,039 req/s。
Bun(3 行):
bash
Bun.serve({
port: 3000,
fetch: () => new Response("Hello World")
});
Node(5+ 行):
bash
const http = require('http');
http.createServer((req, res) => {
res.end("Hello World");
}).listen(3000);
WebSocket(内置发布订阅)
Bun 原生支持 WebSocket,且内置 publish/subscribe。
吞吐量是 Node + ws 库的 7 倍。
bash
Bun.serve({
websocket: {
message(ws, msg) {
ws.publish("room", msg); // 广播给所有订阅者
}
},
fetch(req, server) {
if (req.url.endsWith("/ws")) return server.upgrade(req);
return new Response("WebSocket ready");
}
});
Node 需额外安装 ws 并手动实现广播逻辑。
三、数据库:SQLite 内置 + 统一 SQL 客户端
bun:sqlite ------ 比 better-sqlite3 快 3~9 倍
无需安装驱动,直接使用。
bash
import { Database } from 'bun:sqlite';
const db = new Database(':memory:');
db.run("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
db.run("INSERT INTO users (name) VALUES ('Bun')");
const rows = db.query("SELECT * FROM users").all();
console.log(rows); // [{ id: 1, name: "Bun" }]
Bun.SQL ------ 统一 PostgreSQL/MySQL/SQLite
完全相同的 API 操作三种数据库。
模板字符串自动防 SQL 注入。
bash
import { SQL } from "bun";
// PostgreSQL
const pg = new SQL("postgres://user:pass@localhost:5432/mydb");
const active = await pg`SELECT * FROM users WHERE active = ${true}`;
// MySQL
const mysql = new SQL("mysql://user:pass@localhost:3306/mydb");
await mysql`INSERT INTO users ${mysql([{ name: "Alice" }])}`;
// SQLite
const sqlite = new SQL("sqlite://myapp.db");
await sqlite`CREATE TABLE logs (msg TEXT)`;
await sqlite`INSERT INTO logs VALUES (${"Bun is fast"})`;
四、文件与图像处理:简洁且高性能
文件读写(快 2~5 倍)
Bun.file() 和 Bun.write() 一行搞定。
自动处理编码和 JSON 解析。
bash
await Bun.write("output.txt", "Hello Bun");
const text = await Bun.file("output.txt").text();
const json = await Bun.file("config.json").json();
Bun.Image ------ 零依赖图像处理
无需安装 sharp。
支持缩放、旋转、格式转换、元数据提取。
bash
// 生成缩略图并转 WebP
await Bun.file("photo.jpg")
.image()
.resize(1024, 1024, { fit: "inside" })
.rotate(90)
.webp({ quality: 85 })
.write("thumb.webp");
// 只读取元数据(不解码像素)
const meta = await Bun.file("large.jpg").image().metadata();
console.log(meta); // { width: 1920, height: 1080, format: "jpeg" }
// 生成模糊预览占位图
const placeholder = await Bun.file("hero.jpg").image().placeholder();
压缩与归档
bash
// 内置压缩
const compressed = Bun.deflateSync("hello");
const decompressed = Bun.inflateSync(compressed);
console.log(decompressed.toString()); // "hello"
五、浏览器自动化:Bun.WebView(Node 完全不具备)
Bun v1.3.12 内置无头浏览器。
-
• macOS:使用系统 WKWebView
-
• Linux/Windows:驱动已安装的 Chrome/Edge
所有交互事件都是 操作系统级真实事件,isTrusted 为 true。
网站无法识别为自动化。
核心能力
导航、点击、输入、截图、执行 JS、滚动、CDP 协议。
bash
// 自动关闭视图(using 语法)
await using view = new Bun.WebView({ width: 800, height: 600 });
// 导航并等待加载
await view.navigate("https://bun.sh");
// 点击链接(自动等待元素可见、稳定、可点击)
await view.click("a[href='/docs']");
// 执行页面脚本
const title = await view.evaluate("document.title");
// 截图
const png = await view.screenshot({ format: "png" });
await Bun.write("bun-homepage.png", png);
// 模拟键盘输入
await view.click("input[type='search']");
await view.type("Bun WebView");
await view.press("Enter");
持久化数据
bash
const view = new Bun.WebView({
dataStore: { directory: "./browser-profile" } // cookies/localStorage 保留
});
捕获页面控制台日志
bash
const view = new Bun.WebView({
console: (type, ...args) => console.log(`[页面 ${type}]`, ...args)
});
六、一体化工具链:一个命令替代十几种工具
Node 项目需要:
npm + jest + webpack + ts-node + nodemon + dotenv ...
Bun 自带全部。
| 功能 | Bun 命令 | Node 方案 | 速度优势 |
|---|---|---|---|
| 包管理器 | bun install |
npm install |
快 20~30 倍 |
| 测试运行器 | bun test |
jest / vitest | 快 3~5 倍 |
| 打包器 | bun build |
webpack / esbuild | 原生集成 |
| 任务运行器 | bun run |
npm run |
启动更快 |
| TypeScript | 直接运行 .ts | ts-node 或预编译 | 零配置 |
| JSX/TSX | 直接运行 .tsx | 需 Babel 配置 | 零配置 |
| 热重载 | bun --watch |
nodemon | 内置 |
实战命令
bash
# 初始化项目
bun init -y
# 安装依赖(比 npm 快 20 倍)
bun install
# 直接运行 TypeScript
bun server.ts
# 运行测试(Jest 风格)
bun test
# 构建生产包
bun build ./src/index.ts --outdir ./dist
# 监听文件变化自动重启
bun --watch server.ts
# 执行远程脚本(无需下载)
bun run https://gist.github.com/script.ts
七、模块系统与标准库:更顺畅的开发体验
-
• 完美混用
import和require:同一文件内随意切换 -
•
__dirname在 ESM 中直接可用(Node 需import.meta.url) -
• 自动加载
.env,无需 dotenv -
• 原生支持 Web 标准 API:fetch、WebSocket、ReadableStream 等
混用示例
bash
import lodash from 'lodash';
const fs = require('fs'); // 不报错
console.log(lodash.camelCase('hello_world')); // "helloWorld"
console.log(fs.readdirSync('.'));
八、打包与部署:单文件可执行文件 + 交叉编译
Bun 可将整个应用连同运行时编译为独立的可执行文件。
支持跨平台(--target)。
bash
# 编译为当前平台的可执行文件
bun build ./server.ts --compile --outfile myserver
# 编译为 Linux x64
bun build ./server.ts --compile --target linux-x64 --outfile myserver-linux
# 直接运行(无需 Bun 或 Node)
./myserver
Node.js 完全不具备此能力。
部署时必须安装 Node 环境及全部依赖。
九、性能数据总览(对比 Node.js)
| 场景 | Bun | Node.js | Bun 领先 |
|---|---|---|---|
| 启动速度 | ~5ms | ~50ms | 10~20 倍 |
| HTTP 吞吐量 | 59,026 req/s | 19,039 req/s | 3 倍 |
| WebSocket 吞吐量 | 2,536,227 msgs/s | ~800,000 | 3 倍 |
| 文件读写 | 1x 基准 | 慢 2~5 倍 | 2~5 倍 |
| SQLite 查询 | 1x 基准 | 慢 3~9 倍 | 3~9 倍 |
| FFI 调用 | 1x 基准 | 慢 2~6 倍 | 2~6 倍 |
| 包安装(10 个包) | ~2s | ~15s | 7~30 倍 |
| 内存占用(空闲) | 基准 | 多 40% | 少 40% |
🎯 总结
Bun 威胁 Node.js 地位的底气,源自 30+ 项原生功能的系统性超越:
引擎
JSC + Zig/Rust 实现 10~20 倍启动速度,内存少 40%
网络
HTTP 快 3 倍,WebSocket 快 7 倍,且内置 pub/sub
数据库
bun:sqlite 快 9 倍,Bun.SQL 统一 PostgreSQL/MySQL/SQLite
文件与图像
读写快 5 倍,Bun.Image 零依赖图像处理
浏览器自动化
Bun.WebView 内置无头浏览器,Node 完全缺失
工具链
一个 bun 替代 npm + Jest + Webpack + ts-node + nodemon 等十几种工具
部署
单文件可执行文件 + 交叉编译,Node 至今无法实现
Node 的生态成熟度依然是其护城河。
但 Bun 用 "更快、更全、更简单" 重构了开发者的体验基线。
对于新项目------尤其是 Serverless、边缘计算、实时应用、AI 工具、自动化测试------
Bun 已经是极具竞争力的首选。
立即开始体验
bash
curl -fsSL https://bun.sh/install | bash
bun create my-app
cd my-app
bun dev
那份"真香"感,只有亲手跑过才能体会。🚀