菜单

核心模块实现

相关源文件

本文档涵盖了 Bun 对 fshttpstream 等 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 和 string
  • StringOrBuffer - 支持编码的文本/二进制数据的核心类型
  • 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

HTTP 实现

Bun 在利用其高性能服务器实现的同时,提供了 Node.js 的 HTTP 兼容性。

HTTP 模块结构

来源:src/js/node/http.ts src/bun.js/bindings/NodeHTTP.cpp

Socket 管理

HTTP 实现包括复杂的 Socket 生命周期管理,具有适当的清理和事件处理。

来源:src/bun.js/bindings/NodeHTTP.cpp102-164 src/bun.js/bindings/NodeHTTP.cpp130-140

Stream 实现

Bun 通过轻量级的包装器来包装内部流实现,提供了 Node.js 的流兼容性。

Stream 模块集成

来源: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