Bun 哪比 Node.js 快?

启动快 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

七、模块系统与标准库:更顺畅的开发体验

  • • 完美混用 importrequire:同一文件内随意切换

  • __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

那份"真香"感,只有亲手跑过才能体会。🚀

相关推荐
copyer_xyf2 小时前
Agent 记忆管理
后端·python·agent
葫芦和十三8 小时前
图解 MongoDB 02|BSON:你以为存的是 JSON,其实是带类型的二进制
后端·mongodb·agent
葫芦和十三8 小时前
图解 MongoDB 01|文档数据库
后端·mongodb·agent
JieE2129 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
陈随易10 小时前
VSCode的Copilot扩展支持接入DeepSeek,Kimi了!
前端·后端·程序员
我不是外星人12 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
candyTong12 小时前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
Rust研习社14 小时前
组合真的优于继承吗?为什么 Rust 和 Go 都拥抱组合舍弃继承?
后端·rust·编程语言
IT_陈寒14 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端