Bun 通过 JavaScript 重写核心模块、内置全局对象以及连接 Node.js 模式与 Bun 运行时架构的兼容层,实现了全面的 Node.js API 兼容性。这种兼容性使得大多数 Node.js 应用程序能够以最少的或无需代码更改即可在 Bun 上运行。
Bun 的 Node.js 兼容性通过以下几个关键机制实现:
node:fs、node:http、node:events 等)的JavaScript 重写。process、Buffer 和 global)的全局对象模拟。兼容层旨在提供高保真的 Node.js 行为模拟,同时利用 Bun 的性能特性。
来源: src/bun.js/node/types.zig17-328 src/js/node/fs.ts1-42 src/js/node/http.ts1-72
Bun 实现了全面的 Node.js 兼容类型系统,用于处理 Node.js API 模式与 Bun 内部表示之间的转换。
| Node.js 类型 | Bun 实现 | 目的 |
|---|---|---|
StringOrBuffer | bun.SliceWithUnderlyingString | 高效处理字符串和 Buffer 对象 |
BlobOrStringOrBuffer | bun.SliceWithUnderlyingString 和 JSC.WebCore.Blob 的联合 | 支持 Blob 对象的扩展类型 |
PathLike | 带有 Buffer/URL 支持的 bun.PathString | 跨平台路径处理 |
编码 | 枚举,映射到 Bun 的编码系统 | 文本编码兼容性 |
来源: src/bun.js/node/types.zig483-922 src/bun.js/node/types.zig137-328 src/js/node/http.ts1-72
Bun 提供了 Node.js 核心模块的 JavaScript 重写,在保持 API 兼容性的同时利用了 Bun 的性能优化。
node:fs 模块是 Bun 中最全面的兼容性实现之一。
| 功能 | 实现 | 位置 |
|---|---|---|
| 异步操作 | 带有 JSC.WorkPoolTask 的线程池 | src/bun.js/node/node_fs.zig338-444 |
| 路径验证 | 带有跨平台处理的 PathLike.fromJS() | src/bun.js/node/types.zig636-734 |
| 错误处理 | sys.Error 到 JSC.SystemError 的转换 | src/sys.zig323-623 |
| 编码支持 | Encoding 枚举,支持 utf8、base64、hex 等。 | src/bun.js/node/types.zig333-474 |
| Windows 支持 | 平台特定路径规范化 | src/bun.js/node/types.zig565-634 |
Bun 的 HTTP 模块在 Node.js 的事件驱动 API 与 Bun 的 fetch API 之间架起了桥梁。
HTTP 实现包括复杂的 Socket 模拟,以弥合 Node.js 的基于 Socket 的模型与 Bun 的基于 Fetch 的架构之间的差距。
node:events 模块提供了 Node.js 中广泛使用的基础 EventEmitter 模式。
| 模块 | 状态 | 主要功能 | 实现位置 |
|---|---|---|---|
node:fs | 🟢 完全实现 | 异步/同步操作、流、监听器 | src/js/node/fs.ts |
node:http | 🟢 完全实现 | 服务器、客户端、代理、WebSocket 升级 | src/js/node/http.ts |
node:events | 🟢 完全实现 | EventEmitter、异步迭代器、捕获拒绝 | src/js/node/events.ts |
node:stream | 🟢 完全实现 | Readable、Writable、Transform、pipeline | src/js/node/stream.ts |
node:buffer | 🟢 完全实现 | Buffer 类、编码/解码 | 内置全局 |
node:path | 🟢 完全实现 | 跨平台路径操作 | 内置 |
node:crypto | 🟡 大部分实现 | Hash、HMAC、加密、缺少部分高级功能 | 内置 |
node:process | 🟡 大部分实现 | 基本 process 对象,缺少部分高级功能 | 内置全局 |
来源: src/js/node/fs.ts1-1715 src/js/node/http.ts1-72 src/js/node/events.ts1-713 src/bun.js/node/node_fs_binding.zig89-206
Bun 实现了全面的跨平台抽象,以确保 Node.js 兼容性在不同操作系统上的一致性。
Bun 提供了全面的错误兼容性,以匹配 Node.js 的错误模式。
| 错误类型 | Node.js 模式 | Bun 实现 |
|---|---|---|
SystemError | 具有 code、errno、syscall、path 属性 | sys.Error.toSystemError() 转换 |
ValidationError | ERR_INVALID_ARG_TYPE、ERR_INVALID_ARG_VALUE | 带有兼容消息的内置验证器 |
FileSystemError | 特定于路径的错误消息 | 路径信息通过错误链保留 |
NetworkError | Socket 和 HTTP 特定错误 | 从 Bun 的 fetch/WebSocket 错误映射而来 |
来源: src/sys.zig323-623 src/bun.js/node/types.zig736-786 src/bun.js/node/node_fs.zig338-444
为了最大程度地在 Bun 中运行 Node.js 代码的兼容性:
Bun 通过连接 Bun 的 WebSocket 实现与 Node.js 的基于事件的模式,实现了 Node.js 兼容的 WebSocket 支持。
来源: src/bun.js/api/server/NodeHTTPResponse.zig121-206
Bun 将在每个版本中继续扩展和改进其 Node.js 兼容性。持续的开发领域包括:
来源: test/js/node/http/node-http.test.ts test/napi/napi.test.ts