模块依赖全景图
完整的模块依赖关系、分层架构与跨层调用分析
职责概述
本页呈现 Claude Code 的完整模块依赖关系。通过对顶层 .ts/.tsx 文件的 import 语句和各子目录的交叉引用分析,构建出从入口到底层的全栈依赖图。系统按六层架构组织:入口层(main.tsx / setup.ts)、编排层(QueryEngine.ts / query.ts)、工具层(tools/)、服务层(services/)、工具库层(utils/)、原生层(native-ts/)。依赖方向严格自上而下,跨层调用通过明确接口解耦。
分层依赖架构
模块依赖网格
以下网格展示了主要模块之间的直接依赖关系。每行是一个模块,deps 列出其直接依赖。
跨层依赖关系图
L1 → L3: main.tsx 直接 import tools.ts(工具注册)
L2 → L4: QueryEngine 调用 services/api(API 客户端)
L3 → L5: 工具实现使用 utils/bash、utils/shell、utils/git 等
L4 → L6: services/compact 使用 native-ts/yoga-layout;services/api 使用 upstreamproxy
L5 → L6: utils/shell 使用 native-ts/color-diff;UI 使用 native-ts/file-index
bootstrap/state.ts 是全局状态单例,被 L2-L5 所有层依赖(依赖方向标记为垂直贯穿)
循环依赖
query.ts → commands.ts → query.ts(query 调用 slash command,slash command 可能触发新 query)缓解策略: 通过动态 import 和
getAllTasks() / getCommands() 工厂函数延迟求值,避免模块加载时循环。TypeScript 的 import type 也用于打断循环——只导入类型不导入值。
关键类型与接口
全局状态单例 (bootstrap/state.ts)
// bootstrap/state.ts 被所有层依赖的核心状态
// 以下是被广泛 import 的函数签名:
export function getSessionId(): string
export function getCwd(): string
export function setCwd(cwd: string): void
export function getProjectRoot(): string | undefined
export function getModelUsage(): ModelUsage
export function getTokenCounter(): number
export function getCostCounter(): number
export function getMainLoopModelOverride(): string | undefined
export function getInlinePlugins(): string[]
export function getSessionBypassPermissionsMode(): boolean
export function isSessionPersistenceDisabled(): boolean
// ... 40+ getter/setter 函数
Feature Gate 模式 (bun:bundle)
// 死代码消除模式 — 外部构建时 feature() 返回 false,整个代码块被移除
import { feature } from 'bun:bundle'
const REPLTool = process.env.USER_TYPE === 'ant'
? require('./tools/REPLTool/REPLTool.js').REPLTool
: null
// 或使用 feature() gate:
const reactiveCompact = feature('REACTIVE_COMPACT')
? require('./services/compact/reactiveCompact.js')
: null
设计模式与亮点
1. 工厂函数打破循环
tools.ts 导出的 getAllTools()、tasks.ts 的 getAllTasks()、commands.ts 的 getCommands() 都使用函数而非顶层常量。这避免了模块加载时的循环求值问题——调用者只在需要时才调用工厂函数获取列表。
2. Feature Gate 二进制剔除
通过 bun:bundle 的 feature() 函数和 process.env.USER_TYPE === 'ant' 条件,外部构建可以从二进制中完全移除 Ant 专用代码(REPLTool、Perfetto、reactiveCompact 等)。这是一种编译时多态——同一份源码产出不同功能的二进制。
3. 懒加载重模块
OTLP 导出器(@opentelemetry/exporter-*-otlp-*)、@grpc/grpc-js、highlight.js 等重型依赖都使用动态 import() 按需加载。instrumentation.ts 中的注释明确指出:"静态导入会加载全部 6 个导出器 (~1.2MB) 到每次启动"。
4. bootstrap/state.ts 作为依赖注入容器
全局状态不使用 class 单例或全局变量,而是通过 bootstrap/state.ts 导出的 40+ getter/setter 函数。这个文件充当轻量级 DI 容器——所有层都通过这些函数访问共享状态,而非直接引用变量。这使得测试时可以通过 setter 替换状态。
开发者实践指南
添加新工具的依赖路径
- 在
tools/下创建新工具文件(如tools/MyTool/MyTool.ts) - 实现
Tool接口(Tool.ts中的 type) - 在
tools.ts的getAllTools()中添加 import 和注册 - 如果工具依赖 utils/ 中的模块,确保依赖方向向下(L3 → L5)
- 如果工具是 Ant 专用,使用
feature()或USER_TYPE门控
添加新命令的依赖路径
- 在
commands/下创建命令文件 - 在
commands.ts中 import 并注册 - 命令可直接调用 L2(query.ts)或 L4(services/)的函数
架构师决策指南
依赖管理策略
Claude Code 采用扁平模块结构(无深层嵌套的 namespace),依赖方向通过约定而非编译器强制。关键保障机制:
bootstrap/state.ts作为唯一的全局状态汇聚点,避免了模块间的直接耦合- 工厂函数(
getAllTools())和动态 import 打断循环 - TypeScript 的
import type在类型层面允许"向上"引用而不引入运行时依赖
包体积优化
通过 Bun 的 feature() 死代码消除 + 动态 import() 懒加载,外部构建的二进制体积显著小于 Ant 构建。最重的依赖链路是 OTel(@opentelemetry/* 6 个包),仅在 CLAUDE_CODE_ENABLE_TELEMETRY=1 时激活导出器。
可扩展性评估
- 新工具类型: 容易——实现 Tool 接口,在 tools.ts 注册。无需修改核心逻辑。
- 新服务后端: 中等——需要实现对应 API 客户端,修改 services/api/ 层。
- 新 UI 框架: 困难——Ink + React 深度集成在多个层中,替换需要重写 UI 层和 layout 引擎。
代码索引
| 文件/目录 | 层 | 说明 |
|---|---|---|
main.tsx | L1 | CLI 入口:参数解析、命令注册、启动初始化 |
entrypoints/cli.tsx | L1 | CLI 入口点配置 |
entrypoints/init.ts | L1 | 运行时初始化:遥测、配置、MDM |
entrypoints/mcp.ts | L1 | MCP 子进程入口 |
setup.ts | L2 | 会话设置:CWD、项目根、内存初始化 |
QueryEngine.ts | L2 | 查询编排:API 调用、工具调度、上下文压缩 |
query.ts | L2 | 查询核心循环:消息构建、API 请求、工具调用 |
tools.ts | L3 | 工具注册表:getAllTools() 工厂 |
Tool.ts | L3 | Tool 接口定义与 findToolByName |
Task.ts / tasks.ts | L3 | 任务类型与注册表 |
commands.ts | L3 | 斜杠命令注册表(30+ 命令) |
context.ts | L3 | 系统提示词构建:claudemd、git 状态 |
cost-tracker.ts | L2 | 成本追踪与统计 |
services/ | L4 | API 客户端、MCP、压缩、分析、会话记忆 |
utils/ | L5 | 20+ 工具库模块(见外部集成页) |
native-ts/ | L6 | yoga-layout、color-diff、file-index |
upstreamproxy/ | L6 | CCR 代理中继 |
bridge/ | L6 | 远程会话桥接(20+ 文件) |
bootstrap/state.ts | L6 | 全局状态单例(40+ getter/setter) |
vim/ | L5 | Vim 模式状态机(5 文件) |
buddy/ | L5 | Companion 陪伴角色 |
assistant/ | L5 | 助手会话历史 |
memdir/ | L5 | 内存文件目录管理 |
moreright/ | L5 | useMoreRight hook |