Bun 运行时特性 #
概述 #
Bun 运行时基于 Apple 的 JavaScriptCore 引擎,提供了高性能的 JavaScript 和 TypeScript 执行环境。Bun 不仅兼容 Node.js API,还提供了许多现代化的内置功能。
全局对象 #
Bun 全局对象 #
Bun 提供了全局的 Bun 对象,包含许多实用功能:
typescript
console.log(Bun);
Bun 对象属性 #
typescript
// Bun 版本信息
Bun.version; // "1.2.0"
Bun.revision; // Git commit hash
// 环境变量
Bun.env; // 环境变量对象
Bun.env.NODE_ENV; // "development" | "production"
// 当前工作目录
Bun.cwd(); // 当前工作目录
// 主入口文件
Bun.main; // 入口文件路径
// 命令行参数
Bun.argv; // 命令行参数数组
Bun.file() #
创建文件引用对象:
typescript
// 创建文件引用
const file = Bun.file("./data.txt");
// 获取文件信息
console.log(file.size); // 文件大小
console.log(file.type); // MIME 类型
console.log(file.name); // 文件名
console.log(file.lastModified); // 最后修改时间
// 读取内容
const text = await file.text();
const json = await file.json();
const arrayBuffer = await file.arrayBuffer();
const blob = file.slice(0, 1024);
Bun.write() #
写入文件:
typescript
// 写入文本
await Bun.write("./output.txt", "Hello, Bun!");
// 写入 JSON
await Bun.write("./data.json", { name: "Bun" });
// 写入 Buffer
const buffer = new TextEncoder().encode("Hello");
await Bun.write("./binary.bin", buffer);
// 写入 Blob
const blob = new Blob(["content"], { type: "text/plain" });
await Bun.write("./blob.txt", blob);
// 写入另一个文件
const source = Bun.file("./source.txt");
await Bun.write("./dest.txt", source);
Bun.serve() #
创建 HTTP 服务器:
typescript
Bun.serve({
port: 3000,
fetch(request) {
return new Response("Hello, Bun!");
},
});
console.log("Server running on http://localhost:3000");
Bun.$ #
Shell 命令执行:
typescript
// 执行命令
const result = await $`echo "Hello, Bun!"`;
console.log(result.text());
// 获取命令输出
const { stdout, stderr, exitCode } = await $`ls -la`;
// 管道
const files = await $`ls`.text();
console.log(files);
// 错误处理
try {
await $`exit 1`;
} catch (error) {
console.error("Command failed:", error);
}
// 环境变量
await $`echo $HOME`.env({ HOME: "/custom/path" });
// 工作目录
await $`pwd`.cwd("/tmp");
Bun.spawn() #
创建子进程:
typescript
// 基本用法
const proc = Bun.spawn(["echo", "Hello"]);
// 等待完成
await proc.exited;
console.log(proc.exitCode);
// 获取输出
const proc = Bun.spawn(["ls", "-la"]);
const text = await new Response(proc.stdout).text();
console.log(text);
// 输入输出
const proc = Bun.spawn(["cat"], {
stdin: "pipe",
stdout: "pipe",
});
proc.stdin.write("Hello");
proc.stdin.end();
const output = await new Response(proc.stdout).text();
console.log(output);
Bun.sleep() #
异步睡眠:
typescript
// 睡眠 1 秒
await Bun.sleep(1000);
await Bun.sleep("1s");
// 睡眠 500 毫秒
await Bun.sleep(500);
await Bun.sleep("500ms");
Web 标准 API #
fetch API #
typescript
// GET 请求
const response = await fetch("https://api.example.com/data");
const data = await response.json();
// POST 请求
const response = await fetch("https://api.example.com/users", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ name: "Bun" }),
});
// 处理响应
console.log(response.status);
console.log(response.headers.get("content-type"));
const text = await response.text();
const json = await response.json();
const buffer = await response.arrayBuffer();
Request 对象 #
typescript
const request = new Request("https://api.example.com", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Bun" }),
});
console.log(request.url);
console.log(request.method);
console.log(request.headers);
const body = await request.json();
Response 对象 #
typescript
// 创建响应
const response = new Response("Hello, World!", {
status: 200,
headers: { "Content-Type": "text/plain" },
});
// JSON 响应
const jsonRes = Response.json({ message: "Hello" });
// 重定向
const redirect = Response.redirect("https://example.com", 302);
// 错误响应
const error = Response.error();
Headers 对象 #
typescript
const headers = new Headers();
headers.set("Content-Type", "application/json");
headers.append("X-Custom", "value");
console.log(headers.get("Content-Type"));
console.log(headers.has("X-Custom"));
headers.delete("X-Custom");
// 从对象创建
const headers2 = new Headers({
"Content-Type": "application/json",
"Authorization": "Bearer token",
});
URL 对象 #
typescript
const url = new URL("https://example.com/path?foo=bar&baz=qux");
console.log(url.protocol); // "https:"
console.log(url.hostname); // "example.com"
console.log(url.pathname); // "/path"
console.log(url.search); // "?foo=bar&baz=qux"
// 查询参数
console.log(url.searchParams.get("foo")); // "bar"
url.searchParams.set("new", "value");
console.log(url.toString());
FormData 对象 #
typescript
const formData = new FormData();
formData.append("name", "Bun");
formData.append("file", new Blob(["content"]), "file.txt");
// 从表单数据获取
console.log(formData.get("name"));
console.log(formData.get("file"));
// 遍历
for (const [key, value] of formData) {
console.log(key, value);
}
WebSocket #
typescript
// 客户端 WebSocket
const ws = new WebSocket("wss://example.com/socket");
ws.onopen = () => {
console.log("Connected");
ws.send("Hello!");
};
ws.onmessage = (event) => {
console.log("Received:", event.data);
};
ws.onerror = (error) => {
console.error("Error:", error);
};
ws.onclose = () => {
console.log("Disconnected");
};
Blob #
typescript
// 创建 Blob
const blob = new Blob(["Hello, World!"], { type: "text/plain" });
// 读取内容
const text = await blob.text();
const arrayBuffer = await blob.arrayBuffer();
// 切片
const slice = blob.slice(0, 5);
// 大小和类型
console.log(blob.size);
console.log(blob.type);
TextEncoder / TextDecoder #
typescript
// 编码
const encoder = new TextEncoder();
const uint8Array = encoder.encode("Hello, Bun!");
// 解码
const decoder = new TextDecoder();
const text = decoder.decode(uint8Array);
// 流式解码
const streamDecoder = new TextDecoderStream();
Crypto API #
typescript
// 随机值
const array = new Uint8Array(16);
crypto.getRandomValues(array);
// UUID
crypto.randomUUID();
// 摘要算法
const hashBuffer = await crypto.subtle.digest(
"SHA-256",
new TextEncoder().encode("Hello")
);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, "0")).join("");
Node.js 兼容 API #
process 对象 #
typescript
// 进程信息
process.pid; // 进程 ID
process.ppid; // 父进程 ID
process.title; // 进程标题
process.version; // Node 版本字符串
process.versions; // 版本信息对象
// 环境变量
process.env.NODE_ENV;
process.env.PATH;
// 命令行参数
process.argv; // 参数数组
process.cwd(); // 当前目录
// 标准流
process.stdin;
process.stdout;
process.stderr;
// 退出
process.exit(0);
process.exitCode = 1;
// 事件
process.on("exit", (code) => {
console.log(`Exiting with code ${code}`);
});
process.on("uncaughtException", (error) => {
console.error("Uncaught exception:", error);
});
Buffer #
typescript
// 创建 Buffer
const buf1 = Buffer.from("Hello");
const buf2 = Buffer.alloc(10);
const buf3 = Buffer.allocUnsafe(10);
// 操作
buf1.write("World");
const str = buf1.toString();
const json = buf1.toJSON();
// 拼接
const combined = Buffer.concat([buf1, buf2]);
// 比较
buf1.equals(buf2);
buf1.compare(buf2);
内置模块 #
typescript
// 文件系统
import fs from "fs";
import { readFileSync, writeFileSync } from "fs";
// 路径
import path from "path";
import { join, dirname, basename } from "path";
// HTTP
import http from "http";
import https from "https";
// 加密
import crypto from "crypto";
// 事件
import { EventEmitter } from "events";
// 流
import { Readable, Writable, Transform } from "stream";
// 工具
import util from "util";
// URL
import { URL, URLSearchParams } from "url";
// 查询字符串
import qs from "querystring";
fs 模块 #
typescript
import fs from "fs";
// 同步读取
const data = fs.readFileSync("./file.txt", "utf-8");
// 异步读取
fs.readFile("./file.txt", "utf-8", (err, data) => {
if (err) throw err;
console.log(data);
});
// Promise 版本
import { promises as fsPromises } from "fs";
const data = await fsPromises.readFile("./file.txt", "utf-8");
// 写入
fs.writeFileSync("./output.txt", "Hello");
// 目录操作
fs.mkdirSync("./new-dir", { recursive: true });
const files = fs.readdirSync("./");
fs.rmSync("./dir", { recursive: true });
// 状态
const stats = fs.statSync("./file.txt");
console.log(stats.isFile());
console.log(stats.isDirectory());
console.log(stats.size);
path 模块 #
typescript
import path from "path";
// 路径拼接
path.join("/foo", "bar", "baz"); // "/foo/bar/baz"
// 解析路径
path.resolve("./file.txt"); // 绝对路径
path.dirname("/foo/bar/baz.txt"); // "/foo/bar"
path.basename("/foo/bar/baz.txt"); // "baz.txt"
path.extname("/foo/bar/baz.txt"); // ".txt"
// 规范化
path.normalize("/foo//bar/../baz"); // "/foo/baz"
events 模块 #
typescript
import { EventEmitter } from "events";
const emitter = new EventEmitter();
// 监听事件
emitter.on("message", (data) => {
console.log("Received:", data);
});
// 触发事件
emitter.emit("message", { text: "Hello" });
// 一次性监听
emitter.once("connect", () => {
console.log("Connected!");
});
// 移除监听
const handler = (data) => console.log(data);
emitter.on("data", handler);
emitter.off("data", handler);
stream 模块 #
typescript
import { Readable, Writable, Transform } from "stream";
// 可读流
const readable = new Readable({
read() {}
});
readable.push("Hello");
readable.push("World");
readable.push(null);
// 可写流
const writable = new Writable({
write(chunk, encoding, callback) {
console.log(chunk.toString());
callback();
}
});
// 转换流
const transform = new Transform({
transform(chunk, encoding, callback) {
this.push(chunk.toString().toUpperCase());
callback();
}
});
// 管道
readable.pipe(transform).pipe(writable);
性能特性 #
启动优化 #
typescript
// Bun 启动时自动优化
// 1. 预编译 TypeScript
// 2. 缓存模块解析
// 3. 延迟加载
// 查看启动时间
console.time("startup");
// ... 代码
console.timeEnd("startup");
内存管理 #
typescript
// 手动触发 GC(如果需要)
if (global.gc) {
global.gc();
}
// 内存使用
const used = process.memoryUsage();
console.log({
rss: `${used.rss / 1024 / 1024} MB`,
heapTotal: `${used.heapTotal / 1024 / 1024} MB`,
heapUsed: `${used.heapUsed / 1024 / 1024} MB`,
});
热重载 #
typescript
// 使用 --hot 参数
// bun --hot run server.ts
// 代码变化自动重载
Bun.serve({
fetch() {
return new Response(`Time: ${Date.now()}`);
},
});
错误处理 #
全局错误捕获 #
typescript
// 未捕获异常
process.on("uncaughtException", (error) => {
console.error("Uncaught Exception:", error);
process.exit(1);
});
// 未处理的 Promise 拒绝
process.on("unhandledRejection", (reason, promise) => {
console.error("Unhandled Rejection:", reason);
});
// 警告
process.on("warning", (warning) => {
console.warn("Warning:", warning);
});
自定义错误 #
typescript
class AppError extends Error {
constructor(
public message: string,
public code: number = 500
) {
super(message);
this.name = "AppError";
}
}
try {
throw new AppError("Something went wrong", 400);
} catch (error) {
if (error instanceof AppError) {
console.error(`Error ${error.code}: ${error.message}`);
}
}
下一步 #
现在你已经了解了 Bun 运行时的核心特性,接下来学习 模块系统 深入了解 Bun 的模块解析机制。
最后更新:2026-03-29