本文档涵盖了 Bun 对 fs、http、stream 等 Node.js 内置模块的实现。它解释了 Bun 如何在模块级别提供 Node.js 兼容性,同时利用其自身高性能的运行时。
有关更广泛的 Node.js 兼容性系统的更多信息,请参阅 Node.js 兼容性。有关原生插件支持的详细信息,请参阅 原生插件支持 (NAPI)。有关事件驱动编程 API,请参阅 EventEmitter 和事件系统。
Bun 的 Node.js 核心模块实现遵循多层架构,通过 Zig 和 C++ 实现连接 JavaScript API 与原生系统调用。
来源:src/bun.js/node/node_fs_binding.zig src/js/node/fs.ts src/bun.js/bindings/NodeHTTP.cpp src/bun.js/node/node.classes.ts
Node.js 兼容性的基础在于 Bun 对 Node.js 兼容数据类型和转换工具的实现。
types.zig 模块定义了几个关键的联合类型,用于处理不同的输入格式
BlobOrStringOrBuffer - 处理 Web API Blob 对象以及 Node.js 的 buffer 和 stringStringOrBuffer - 支持编码的文本/二进制数据的核心类型PathLike - 统一处理字符串、buffer 和 URL 的路径PathOrFileDescriptor - 同时处理文件路径和数字文件描述符来源:src/bun.js/node/types.zig17-135 src/bun.js/node/types.zig137-328 src/bun.js/node/types.zig507-734
来源:src/bun.js/node/types.zig333-474
Bun 的 fs 模块实现展示了从 JavaScript API 到系统调用的完整堆栈。
来源:src/js/node/fs.ts src/js/node/fs.promises.ts src/bun.js/node/node_fs_binding.zig src/bun.js/node/node_fs.zig
文件系统操作通过统一的异步任务系统支持回调式和 Promise 式 API。
来源:src/bun.js/node/node_fs.zig338-444 src/bun.js/node/node_fs_binding.zig42-78
来源:src/bun.js/node/node_fs.zig117-336 src/bun.js/node/node_fs.zig28-78
Bun 在利用其高性能服务器实现的同时,提供了 Node.js 的 HTTP 兼容性。
来源:src/js/node/http.ts src/bun.js/bindings/NodeHTTP.cpp
HTTP 实现包括复杂的 Socket 生命周期管理,具有适当的清理和事件处理。
来源:src/bun.js/bindings/NodeHTTP.cpp102-164 src/bun.js/bindings/NodeHTTP.cpp130-140
Bun 通过轻量级的包装器来包装内部流实现,提供了 Node.js 的流兼容性。
来源:src/js/node/stream.ts test/js/node/stream/node-stream.test.js
Bun 使用多种绑定机制将 JavaScript API 连接到原生实现。
来源:src/bun.js/node/node.classes.ts src/bun.js/node/node_fs_binding.zig89-206
绑定系统使用一致的模式将 JavaScript 函数调用映射到原生实现。
来源:src/bun.js/node/node_fs_binding.zig12-80
核心模块的实现包括全面的测试,以验证 Node.js 的兼容性。
来源:test/js/node/fs/fs.test.ts test/js/node/http/node-http.test.ts test/js/node/stream/node-stream.test.js test/js/bun/http/serve.test.ts
测试方法强调与 Node.js 行为的兼容性,同时验证 Bun 的优化不会破坏预期的语义。尽可能在 Bun 和 Node.js 环境中运行测试,以确保行为一致。
来源:test/js/node/http/node-http.test.ts1-10 test/js/node/fs/fs.test.ts1-50