Skip to content

3.9 模块依赖关系:从「依赖图」理解演进边界

学习目标

完成本节后,你将能够:

  1. 读出 核心模块依赖图 的主干方向(UI → 编排 → 服务 → 工具)
  2. 解释为何要 隔离 analytics、配置、错误处理 以避免循环依赖
  3. 60+ npm 依赖 按职能 分桶(CLI、React、网络、协议、工具库)
  4. 识别 「内部包」(如定制 ink/)与外部 npm 的边界

3.9.1 生活类比:城市供水管网

应用模块像建筑,依赖像水管。循环依赖等于 A 楼用水要经过 B 楼,B 又要经过 A——一旦爆管,全城停水。工程上通过 水厂(services)分区阀门(接口层) 把网拓扑变成 有向无环图(DAG) 倾向。


3.9.2 核心内部模块依赖图(概念 DAG)

读图规则自上而下通常更安全;底向上引用呈现层 = 红色警报(多数情况下应避免)。


3.9.3 第二幅图:Agent 回合内的「动态依赖」

静态 import 图之外,运行时还有 每轮对话 的数据依赖:


3.9.4 npm 依赖分桶(60+ 包的读法)

具体包名与版本以仓库 package.json / bun.lock 为准。下表为 教学分桶,便于建立心智模型。

分桶代表依赖类型在 Claude Code 中的角色
CLI 与进程commanderwhichexeca参数路由、子进程
React 生态reactreact-reconciler(若显式)终端组件
终端与样式chalkansi-*wrap-ansi输出与测量
网络与 APIfetch 封装、ws模型与远程服务
协议与数据zodprotobuf/msgpack 类(若有)校验与序列化
Git 与 diffsimple-git仓库操作与展示
测试与构建vitest/eslint 等 devDeps质量保障

学习策略:不要背 60 个包名;遇到报错再 定位到桶,查文档效率更高。


3.9.5 关键内部包:ink/ 不是 node_modules

类别位置备注
定制终端渲染仓库内 ink/(示例路径,随版本)与 npm ink 不等价
布局Yoga TS 相关绑定components/ 协同
Bridge 协议bridge/ TS 模块IDE 消息类型密集

3.9.6 循环依赖治理:案例式理解

analytics 零依赖模式(概念)

typescript
// 设计意图(摘自架构文档常见写法)
// analytics 模块不 import 其他业务模块
// 通过 attachSink 在启动晚期接线

let sink: Sink | null = null;

export function attachAnalyticsSink(s: Sink) {
  sink = s;
  flushQueue();
}

export function logEvent(name: string, meta: object) {
  if (!sink) enqueue(name, meta);
  else sink.send(name, meta);
}

类比单向门——谁都能投递事件,但 analytics 不回调业务。


3.9.7 tools/services/ 的依赖原则

允许谨慎避免
读配置、日志重量级单例工具 import UI 组件
调用网络客户端隐式全局可变状态工具间横向 import 成网

3.9.8 bridge/ 依赖特点

  • 强依赖 services/(会话、配置、日志)
  • 弱耦合 components/(消息驱动 UI 更新,而非直接 new 组件)
  • 远程模式IDE 能力协商 交叉

3.9.9 依赖健康度自检清单

问题工具建议
谁引用了谁?madgeskott、或 ripgrep from \"../
循环依赖?madge --circular
包体积异常?bun pm / bundle 分析(若适用)
重复依赖?npm ls / lockfile 审查

3.9.10 与「技术栈篇」的交叉对照

栈层主要外部依赖主要内部模块
CLICommandermain.tsxcommands/
UIReact + 内部 inkcomponents/ink/
模型HTTP 客户端库services/ 内客户端封装
工具各类 utiltools/

3.9.11 小结图:依赖 = 约束未来的力


本节小结

  • 内部依赖图services/tools/coordinator 为枢纽;外部 npm分桶理解即可。
  • 防循环是大型 TS 项目的隐形架构;analytics 模式是经典教科书案例。
  • 真仓库请始终以 lockfile + madge 为准,文档只提供 导航语义

上一节08-main-entry.md · 下一节10-philosophy.md

本项目仅用于教育学习目的。Claude Code 源码版权归 Anthropic, PBC 所有。