本文档介绍了 Bun 的核心运行时架构,重点关注 ZigGlobalObject 类和异步事件循环系统。 ZigGlobalObject 作为主要的 JavaScript 全局对象实现,充当 JavaScriptCore 与 Bun 的原生功能之间的桥梁,而事件循环则负责协调异步任务执行和微任务处理。
有关模块加载和解析的信息,请参阅 模块系统和加载。有关 JavaScript VM 生命周期和内存管理的详细信息,请参阅 JavaScript VM 生命周期。
ZigGlobalObject 和事件循环构成了 Bun 中 JavaScript 执行的核心运行时基础。 ZigGlobalObject 扩展了 WebCore 的全局对象功能,而事件循环负责管理异步操作。
来源: src/bun.js/bindings/ZigGlobalObject.h93-327 src/bun.js/event_loop.zig1-47
ZigGlobalObject 类(Zig::GlobalObject)是主要的全局对象实现,它扩展了 Bun::GlobalScope 并提供了 JavaScript 执行环境。
来源: src/bun.js/bindings/ZigGlobalObject.h93-180 src/bun.js/bindings/ZigGlobalObject.h408-650
ZigGlobalObject 为运行时操作提供了几个关键方法
| 方法 | 目的 | 位置 |
|---|---|---|
create() | 创建全局对象实例的工厂方法 | ZigGlobalObject.h143-146 |
moduleLoaderImportModule() | 处理 ES 模块导入 | ZigGlobalObject.h191 |
promiseRejectionTracker() | 跟踪未处理的 Promise 拒绝 | ZigGlobalObject.h198 |
scriptExecutionStatus() | 管理脚本执行状态 | ZigGlobalObject.h197 |
queueTask() | 将任务加入事件循环队列 | ZigGlobalObject.h170-172 |
来源: src/bun.js/bindings/ZigGlobalObject.h143-198
事件循环是用 Zig 实现的,负责管理异步任务执行、微任务以及与底层 uSockets 事件循环的集成。
来源: src/bun.js/event_loop.zig1-30 src/bun.js/event_loop.zig32-58
来源: src/bun.js/event_loop.zig445-477 src/bun.js/event_loop.zig188-224
ZigGlobalObject 和事件循环通过几个关键机制进行集成
集成主要通过任务排队方法实现
来源: src/bun.js/bindings/ZigGlobalObject.h170-172 src/bun.js/event_loop.zig512-531
微任务处理通过 thenable 函数系统与 JSC 的微任务队列集成
| 组件 | 职责 | 实现 |
|---|---|---|
JSC__JSGlobalObject__drainMicrotasks() | 清空 JSC 微任务队列 | event_loop.zig114 |
deferred_tasks.run() | 处理 Bun 的延迟任务 | event_loop.zig117 |
vm.releaseWeakRefs() | 释放弱引用 | event_loop.zig113 |
resetOnEachMicrotaskTick() | 重置每个 tick 的状态 | ZigGlobalObject.cpp895-907 |
来源: src/bun.js/event_loop.zig110-123 src/bun.js/bindings/ZigGlobalObject.cpp895-907
该系统通过 thenable 函数系统处理 Promise
来源: src/bun.js/bindings/ZigGlobalObject.h347-399 src/bun.js/bindings/bindings.cpp546-569
该系统通过几个机制与 JSC 的垃圾回收集成
| 方法 | 目的 | 位置 |
|---|---|---|
visitChildren() | 标记 GC 可达对象 | ZigGlobalObject.h161 |
clearDOMGuardedObjects() | 清理DOM对象 | ZigGlobalObject.h185 |
processGCTimer() | 管理GC计时 | event_loop.zig441-443 |
performGC() | 触发垃圾回收 | event_loop.zig552-554 |
来源: src/bun.js/bindings/ZigGlobalObject.h161-185 src/bun.js/event_loop.zig441-443 src/bun.js/event_loop.zig552-554