本文档描述了 Deno 运行时系统的顶层架构,重点关注核心组件的结构以及它们如何交互以创建 JavaScript 执行环境。它涵盖了整体系统设计、扩展架构、Worker 管理以及 Rust 和 JavaScript 层之间的集成。
有关特定初始化序列的详细信息,请参阅 引导进程。有关暴露给 JavaScript 的 Deno API 的信息,请参阅 Deno 命名空间 API。有关安全模型实现的详细信息,请参阅 权限系统。
Deno 的运行时架构围绕分层设计构建,将核心功能分离到不同的、模块化的组件中。其基础是 V8 JavaScript 引擎,通过 deno_core 与 Rust 集成,而更高级的功能则由扩展系统提供。
来源: runtime/js/99_main.js1-1149 runtime/lib.rs1-61 runtime/worker_bootstrap.rs1-238
运行时功能组织为提供特定能力的扩展。每个扩展都封装了 Rust 操作和 JavaScript 实现,从而实现了关注点的清晰分离。
来源: ext/web/lib.rs55-127 ext/fs/lib.rs249-283 ext/net/lib.rs1-50 ext/http/lib.rs1-100
扩展遵循集成 Rust 操作与 JavaScript API 的一致模式
| 组件 | 目的 | 示例文件 |
|---|---|---|
| lib.rs | 扩展定义和设置 | ext/web/lib.rs55-127 |
| ops.rs | Rust 操作实现 | ext/fs/ops.rs166-200 |
| JavaScript 文件 | Web 标准 API 实现 | ext/web/02_timers.js29-60 |
| 状态管理 | 每个 Isolate 的状态存储 | ext/web/lib.rs120-126 |
来源: ext/web/lib.rs1-424 ext/fs/ops.rs1-2000 ext/web/02_timers.js1-150
Deno 实现两种不同的 Worker 类型,每种类型都为不同的执行上下文提供服务,它们共享基础设施但具有不同的能力。
来源: runtime/ops/worker_host.rs35-48 runtime/ops/worker_host.rs85-110 runtime/ops/worker_host.rs144-260
Worker 系统管理从创建到终止的整个生命周期
来源: runtime/ops/worker_host.rs60-83 runtime/web_worker.rs1-50
运行时引导进程可通过全面的选项系统进行配置,该系统决定执行模式、权限和功能可用性。
来源: runtime/worker_bootstrap.rs88-156 runtime/js/99_main.js790-989 runtime/js/99_main.js991-1111
不同的执行模式以特定的行为和 API 可用性来配置运行时
| 模式 | 目的 | 配置 |
|---|---|---|
| 运行 | deno run 执行 | 标准的运行时,具有完整的 API 访问权限 |
| 工作器 | Web Worker 上下文 | 隔离的环境,带有消息传递 |
| 测试 | deno test 执行 | 增强了测试 API 和 sanitizers |
| 服务 | deno serve 执行 | HTTP 服务器优化和多线程 |
| Repl | 交互模式 | 增强的内省和评估 |
来源: runtime/worker_bootstrap.rs13-56 runtime/js/99_main.js815-882
权限系统已深度集成到整个运行时架构中,在每个 API 访问级别都提供了安全边界。
来源: runtime/permissions.rs24-64 runtime/permissions/lib.rs367-671 runtime/permissions/prompter.rs59-76
所有访问系统资源的操作都经过权限验证
Deno.readFile()来源: ext/fs/ops.rs166-200 runtime/permissions.rs1-198 runtime/permissions/lib.rs1-100
运行时创建一个全面的 JavaScript 环境,包含 Web 标准全局变量、Deno 特有 API 和扩展提供的功能。
来源: runtime/js/99_main.js480-499 runtime/js/90_deno_ns.js45-169 runtime/js/99_main.js955-976
整个 API 表面被组织成逻辑分组
| 类别 | 实现 | 访问模式 |
|---|---|---|
| Web 标准 | ext/web/lib.rs55-127 | 直接全局访问 |
| Deno 核心 API | runtime/js/90_deno_ns.js45-169 | Deno.* 命名空间 |
| 文件系统 | ext/fs/30_fs.js1-1000 | Deno.readFile() 等。 |
| 网络 | ext/net/01_net.js1-500 | Deno.connect() 等。 |
| Node.js 兼容性 | ext/node/polyfills/ | require()、process.* |
| 不稳定特性 | runtime/js/90_deno_ns.js171-236 | 功能门控访问 |
来源: runtime/js/99_main.js975-976 runtime/js/90_deno_ns.js1-237 ext/web/lib.rs95-114
运行时实现了全面的错误处理,将 Rust 错误与 JavaScript 异常连接起来,同时保持正确的错误上下文和堆栈跟踪。
来源: runtime/js/99_main.js326-395 runtime/js/99_main.js414-462 runtime/js/99_main.js309-324
该运行时为不同类别的系统错误注册了特定的错误类,通过 runtime/js/99_main.js326-395确保了 Rust 和 JavaScript 上下文之间的正确错误类型映射。
来源: runtime/js/99_main.js1-1149 runtime/worker_bootstrap.rs1-238 runtime/permissions.rs1-198 runtime/ops/worker_host.rs1-350 ext/web/lib.rs1-424 ext/fs/lib.rs1-300