本文全面概述了Deno的Rust工作区组织、crate架构和扩展系统。它涵盖了代码库的结构布局、主要组件之间的关系以及模块化扩展系统如何实现对Web标准的支持。
有关特定运行时引导过程的信息,请参阅引导过程。有关CLI命令处理的详细信息,请参阅命令处理。
Deno组织为一个Rust工作区,包含47个成员crate,这些crate分为几个架构类别。该工作区对所有crate使用集中式依赖管理和共享构建配置。
工作区被划分为不同的功能组
| 类别 | 目的 | 示例Crate |
|---|---|---|
| 核心CLI | 命令行界面和工具 | cli、cli/lib、cli/rt、cli/snapshot |
| 运行时 | JavaScript 执行环境 | runtime、runtime/features、runtime/permissions |
| 扩展 | Web API 实现 | ext/http、ext/crypto、ext/fetch、ext/node |
| 解析器 | 模块解析系统 | resolvers/deno、resolvers/node、resolvers/npm_cache |
| 实用工具 | 共享工具和基准测试 | bench_util、tests/util/server |
| 测试 | 测试基础设施 | tests、tests/ffi、tests/napi |
工作区架构图
来源:Cargo.toml3-47 cli/Cargo.toml1-210 runtime/Cargo.toml1-116
工作区采用集中式依赖管理,对通用依赖项使用共享版本规范。这确保了所有crate之间的一致性并简化了维护。
共享依赖配置
来源:Cargo.toml56-524 cli/Cargo.toml71-187 ext/http/Cargo.toml25-58
Deno项目由三个主要的架构层组成,它们协同工作以提供完整的JavaScript运行时体验。
CLI层提供用户界面并协调所有运行时操作。它由几个专门的crate组成
| Crate | 包名称 | 目的 |
|---|---|---|
cli | deno | 主二进制和命令调度器 |
cli/lib | deno_lib | 共享CLI库代码 |
cli/rt | 未发布 | 运行时二进制实用程序 |
cli/snapshot | deno_snapshots | V8快照管理 |
主CLI crate作为入口点,通过其工厂模式实现协调所有其他组件。
运行时层提供核心JavaScript执行环境,并管理权限、功能和扩展注册
来源:runtime/Cargo.toml3-116 runtime/permissions/Cargo.toml runtime/features/Cargo.toml
扩展提供了Web标准和平台API的模块化实现。每个扩展都是一个独立的crate,可以独立开发和测试。
扩展类别和实现
| 类别 | 扩展 | 核心功能 |
|---|---|---|
| Web 标准 | ext/web、ext/url、ext/console | 核心Web API、URL解析、控制台实现 |
| 网络 | ext/http、ext/fetch、ext/websocket、ext/net | HTTP服务器/客户端、Fetch API、WebSocket、原始网络 |
| 安全 | ext/crypto、ext/tls | Web Crypto API、TLS实现 |
| 文件系统 | ext/fs、ext/io | 文件系统操作、I/O原语 |
| Node.js 兼容性 | ext/node、ext/napi | Node.js API polyfills、原生API支持 |
| 不稳定特性 | ext/kv、ext/cron、ext/canvas | 键值存储、定时任务、Canvas API |
扩展注册流程
来源:runtime/Cargo.toml47-79 ext/http/Cargo.toml1-67 ext/crypto/Cargo.toml1-49
扩展遵循一致的模式,通过deno_core操作系统实现Web标准并提供JavaScript API。
每个扩展crate都遵循标准化的结构,将Rust实现与JavaScript接口代码分离
HTTP扩展展示了典型的扩展架构,包括其操作、JavaScript接口以及与更广泛生态系统的集成
HTTP扩展依赖和集成
来源:ext/http/Cargo.toml25-58 ext/http/lib.rs
Node.js兼容性扩展是最大、最复杂的扩展之一,为Node.js内置模块提供了polyfills
Node扩展结构
来源:ext/node/Cargo.toml19-107 ext/node/lib.rs
该项目使用复杂的构建和CI基础设施来管理多crate工作区的复杂性,并确保所有平台上的质量。
持续集成系统通过一个TypeScript生成器配置,该生成器生成GitHub Actions工作流
CI 流水线结构
该项目包含广泛的工具配置,用于代码格式化、linting和开发工作流
| 工具 | 配置 | 目的 |
|---|---|---|
| dprint | .dprint.json | 代码格式化(Rust、TypeScript、JSON、Markdown) |
| Cargo | Cargo.toml | Rust工作区和依赖管理 |
| GitHub Actions | .github/workflows/ | CI/CD管道自动化 |
开发工具集成
来源:.github/workflows/ci.generate.ts1-1118 .dprint.json1-84 Cargo.toml389-524
该项目结构展示了一个组织良好、模块化的架构,通过工作区级配置和共享工具,实现了扩展的独立开发,同时保持了一致性。扩展系统在Web标准实现和核心运行时之间提供了清晰的分离,使代码库易于维护和扩展。