让 Claude 理解你的项目
Claude Code 最强大的能力之一,是它能够直接读取和操作你的代码库。但"能读取"和"读得懂"是两个完全不同的层次。一个刚启动的 Claude 会话对你的项目一无所知——它不知道你用的是什么框架,不知道你的目录结构遵循什么约定,不知道哪些文件是核心入口,哪些只是生成的产物。
本章将系统讲解 Claude Code 如何"读取"和理解代码库,以及你如何通过主动提供上下文、使用正确的提问策略,让 Claude 从"盲人摸象"快速进化为"胸有成竹"。无论你是面对一个陌生的开源项目、接手一个遗留系统,还是想在日常开发中最大化 Claude 的效率,这些策略都至关重要。
一、Claude Code 如何"读取"代码库
1.1 Agentic Loop:观察-推理-行动的循环
Claude Code 不是一个静态的代码分析工具,而是一个动态的 Agent。当你向它提出一个涉及代码库的问题时,它会进入一个被称为 Agentic Loop 的三阶段循环^1:
┌─────────────────────────────────────────────────────────────┐
│ Agentic Loop │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户提问 │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌─────────────┐ │
│ │ Gather │───▶│ Take │───▶│ Verify │ │
│ │ Context │ │ Action │ │ Results │ │
│ │ (收集上下文) │ │ (执行操作) │ │ (验证结果) │ │
│ └──────────────┘ └──────────────┘ └─────────────┘ │
│ │ │ │ │
│ └───────────────────┴───────────────────┘ │
│ (循环直到完成) │
│ │
└─────────────────────────────────────────────────────────────┘
收集上下文(Gather Context):Claude 首先判断需要了解哪些信息才能回答你的问题。它可能会搜索文件、读取目录结构、查看配置文件,甚至运行命令来获取项目状态。
执行操作(Take Action):基于收集到的信息,Claude 决定下一步行动——可能是读取更多文件、编辑代码、运行测试,或者向你请求澄清。
验证结果(Verify Results):执行后,Claude 检查结果是否符合预期。如果测试失败或输出不符合预期,它会回到收集上下文阶段,调整策略后重试。
这个循环的关键在于:Claude 不是一次性读取整个代码库,而是按需、渐进式地探索。这种设计既是优势(节省 token),也是挑战(需要正确引导)。
1.2 自动发现策略:Claude 如何决定读什么
当你问"这个项目做什么"时,Claude 会启动一套启发式的自动发现策略^2:
第一层:项目根目录扫描
Claude 首先会查看项目根目录下的"信号文件":
| 文件类型 | 识别内容 |
|---|---|
package.json / Cargo.toml / pyproject.toml / go.mod | 技术栈、依赖、脚本命令 |
README.md | 项目描述、使用说明 |
Dockerfile / docker-compose.yml | 部署架构、服务依赖 |
.gitignore | 项目类型线索(如 node_modules、target/) |
CLAUDE.md | 项目特定的 AI 指令 |
第二层:目录结构解析
Claude 会递归扫描目录树,识别常见的项目结构模式:
# 典型的 Web 项目结构
src/
├── components/ ← 识别为 UI 组件目录
├── pages/ ← 识别为路由页面(Next.js/Nuxt 模式)
├── api/ ← 识别为 API 路由
├── utils/ ← 工具函数
└── types/ ← 类型定义
# 典型的后端项目结构
app/
├── models/ ← 数据库模型
├── routes/ ← 路由处理器
├── services/ ← 业务逻辑
└── core/ ← 核心配置
第三层:入口点发现
Claude 会寻找程序的执行入口:
- 前端:
index.html、main.tsx、app.vue - 后端:
main.py、server.ts、app.js - CLI 工具:
cli.py、cmd/root.go - 库/包:
__init__.py、index.ts、lib.rs
第四层:配置文件分析
通过读取框架配置文件,Claude 推断项目使用的技术细节:
vite.config.ts→ Vite 构建工具next.config.js→ Next.js 框架tailwind.config.js→ Tailwind CSSjest.config.js→ Jest 测试框架.eslintrc→ ESLint 规则
1.3 文件选择算法:为什么 Claude 读了 A 而不是 B
Claude Code 内置了一套文件选择优先级算法^3。当你提出一个具体问题时,它会按以下优先级决定读取哪些文件:
优先级 1:显式提及的文件
如果你直接提到了文件路径,Claude 会优先读取:
claude> 检查 src/auth.ts 中的登录逻辑
# Claude 直接读取 src/auth.ts
优先级 2:与问题语义相关的文件
Claude 使用关键词匹配和文件路径推断:
claude> 用户认证是怎么实现的?
# Claude 会搜索包含 "auth"、"login"、"session" 的文件名和内容
优先级 3:入口点和核心配置文件
对于架构级问题,Claude 会读取项目的核心骨架:
claude> 解释这个项目的整体架构
# Claude 读取 package.json、主入口文件、路由配置等
优先级 4:最近修改的文件
Claude 会查看 git 状态,优先关注当前工作区中已更改的文件:
claude> 我最近的改动有什么问题?
# Claude 读取 git diff 中涉及的文件
优先级 5:测试文件
当问题涉及功能验证时,Claude 会查找对应的测试:
claude> 这个函数应该怎么用?
# Claude 可能读取对应的 .test.ts 文件看用法示例
1.4 内置工具集:Claude 的"感官系统"
Claude Code 通过一套内置工具来感知代码库^1:
| 工具类别 | 具体能力 | 用途 |
|---|---|---|
| 文件操作 | Read、Edit、Write、Glob | 读取、修改、创建文件,按模式匹配文件 |
| 搜索 | Grep、Glob | 按正则搜索内容,按模式查找文件 |
| 执行 | Bash | 运行 shell 命令、测试、git 操作 |
| 代码智能 | 类型检查、定义跳转、引用查找 | 理解代码间的依赖关系 |
| 委派 | Task(Subagent) | 将探索任务交给子代理 |
这些工具的组合使用,构成了 Claude 探索代码库的基础能力。例如,当 Claude 需要理解一个函数时,它可能会:
- 用
Read读取函数定义 - 用
Grep查找所有调用该函数的地方 - 用
Read读取关键的调用点 - 用
Bash运行测试验证理解
二、项目结构分析:从混沌到清晰
2.1 技术栈识别:Claude 如何"猜"你用什么
Claude Code 的技术栈识别是一个多信号融合的过程。当你首次进入一个项目,可以通过以下方式快速建立技术栈认知:
提问模板 1:技术栈概览
claude> 分析这个项目的技术栈。列出:1) 主要编程语言和框架 2) 构建工具 3) 测试框架 4) 数据库/ORM 5) 部署方式
预期响应:
基于对项目文件的分析,技术栈如下:
1. 主要编程语言和框架:
- TypeScript(主语言)
- Next.js 15(React 框架,App Router)
- React 19(UI 库)
2. 构建工具:
- Vite 6(开发服务器和构建)
- pnpm(包管理器)
3. 测试框架:
- Vitest(单元测试)
- Playwright(E2E 测试)
4. 数据库/ORM:
- PostgreSQL(数据库)
- Drizzle ORM(类型安全的数据库操作)
5. 部署方式:
- Docker(容器化)
- 从 Dockerfile 推断可能使用 AWS ECS 或类似平台
提问模板 2:依赖分析
claude> 分析 package.json 中的关键依赖。哪些是直接依赖?哪些是开发依赖?有没有已知的安全风险或过时包?
2.2 目录结构解析:理解项目的"地形"
目录结构是项目架构的最直观表达。Claude 可以帮你快速建立对项目"地形"的认知:
提问模板 3:目录结构解释
claude> 解释这个项目的目录结构。每个主要目录的作用是什么?遵循什么设计模式?
预期响应(以典型 Next.js 项目为例):
项目采用 Next.js App Router 的标准结构,遵循功能模块组织原则:
src/
├── app/ # Next.js App Router 路由
│ ├── (marketing)/ # 路由组:营销页面(无共享布局)
│ ├── dashboard/ # 仪表盘路由
│ ├── api/ # API 路由端点
│ └── layout.tsx # 根布局
├── components/
│ ├── ui/ # 基础 UI 组件(Button, Input 等)
│ └── features/ # 功能组件(与业务逻辑耦合)
├── lib/
│ ├── db/ # 数据库相关(schema, queries)
│ ├── auth/ # 认证工具
│ └── utils/ # 通用工具函数
├── types/ # 全局 TypeScript 类型
└── hooks/ # 自定义 React Hooks
设计模式:
- 使用 Barrel exports(index.ts)简化导入
- UI 组件与功能组件分离,便于复用
- API 路由与页面路由共存,全栈开发
提问模板 4:寻找关键文件
claude> 列出这个项目中最重要的 10 个文件,并说明每个文件的作用
2.3 入口点发现:程序的"起点"在哪里
理解入口点是理解程序执行流程的关键。不同项目类型的入口点各不相同:
提问模板 5:入口点分析
claude> 找出这个项目的所有入口点:1) 应用程序入口 2) 库/包的导出入口 3) 测试入口 4) CLI 入口(如果有)
预期响应(以全栈项目为例):
入口点分析:
1. 应用程序入口:
- 前端:src/app/layout.tsx(Next.js 根布局)
- 后端 API:src/app/api/[[...route]]/route.ts(API 路由聚合)
2. 库/包导出:
- src/index.ts(主包导出)
- src/components/ui/index.ts(UI 组件桶文件)
3. 测试入口:
- vitest.config.ts 中定义的入口
- src/**/*.test.ts 模式匹配
4. CLI 入口:
- bin/cli.js(如果项目包含 CLI 工具)
三、代码库导航:精准定位与深度探索
3.1 文件搜索:从"大海捞针"到"精准定位"
Claude Code 提供了多种文件搜索方式,掌握它们可以大幅提升导航效率。
方式 1:自然语言描述搜索
claude> 找到处理用户登录逻辑的文件
# Claude 自动搜索包含 login、auth、signin 等关键词的文件
方式 2:使用 @ 符号快速引用
claude> 看看 @src/auth.ts 里的登录函数有什么问题
# @ 触发文件路径自动补全,直接读取指定文件
方式 3:让 Claude 使用 Grep 精确搜索
claude> 搜索所有包含 "JWT" 这个词的文件,并显示上下文
# Claude 使用 Grep 工具执行正则搜索
方式 4:模式匹配(Glob)
claude> 列出所有以 .service.ts 结尾的文件
# Claude 使用 Glob 工具匹配文件模式
3.2 符号跳转:追踪函数和类型的定义
Claude Code 支持代码智能功能,可以帮助你追踪符号的定义和引用:
提问模板 6:符号追踪
claude> 找到 `validateUser` 函数的定义,以及所有调用它的地方
预期响应:
`validateUser` 函数定义在 src/lib/auth.ts:45:
```typescript
export async function validateUser(
email: string,
password: string
): Promise<User | null> {
// ... 实现
}
调用位置:
- src/app/api/auth/login/route.ts:12 — 登录 API 端点
- src/app/api/auth/refresh/route.ts:8 — Token 刷新端点
- src/components/LoginForm.tsx:34 — 前端登录表单
**提问模板 7:类型追踪**
```bash
claude> `User` 类型在哪里定义?哪些文件使用了这个类型?
3.3 依赖关系追踪:理解模块间的"血脉"
理解模块间的依赖关系是掌握大型项目的关键。Claude 可以帮你绘制依赖图谱:
提问模板 8:依赖分析
claude> 分析 src/services/ 目录下各模块的依赖关系。哪个模块被最多其他模块引用?有没有循环依赖?
提问模板 9:数据流追踪
claude> 追踪一个用户注册请求从 API 入口到数据库的完整数据流。列出涉及的所有文件和函数调用链。
预期响应:
用户注册数据流:
1. API 入口
src/app/api/auth/register/route.ts
└── POST handler (line 15)
2. 输入验证
└── validateRegistrationInput()
src/lib/validation/auth.ts:23
3. 业务逻辑
└── authService.register()
src/services/auth.ts:45
├── checkExistingUser() — src/services/user.ts:12
├── hashPassword() — src/lib/crypto.ts:8
└── createUser() — src/services/user.ts:34
4. 数据库操作
└── db.insert(users).values(...)
src/lib/db/queries/user.ts:56
└── 使用 Drizzle ORM 的 schema
src/lib/db/schema.ts:23 (users 表定义)
5. 响应构造
└── 返回 { success: true, user: {...} }
src/app/api/auth/register/route.ts:42
涉及文件:6 个
函数调用深度:4 层
3.4 使用 Subagent 进行并行探索
对于大型代码库,Claude Code 的 Subagent(子代理) 功能是一个强大的探索工具^4。Subagent 在独立的上下文窗口中运行,不会消耗主会话的 token 预算。
提问模板 10:委派探索任务给 Subagent
claude> 使用 subagent 并行探索:1) 认证模块的代码结构 2) 支付模块的代码结构 3) 通知模块的代码结构。每个 subagent 返回该模块的关键文件列表和职责说明。
Subagent 的三种类型^4:
| 类型 | 模型 | 权限 | 用途 |
|---|---|---|---|
| Explore | Haiku(快速、低成本) | 只读 | 代码库搜索和分析 |
| General-purpose | Sonnet | 读写 | 复杂多步骤任务 |
| Plan | Sonnet | 只读 | 计划阶段的研究 |
实际使用示例:
claude> 使用 explore subagent 查找所有与 WebSocket 相关的代码。返回文件路径、关键代码片段和整体架构说明。
四、上下文构建:Claude 如何决定读什么
4.1 上下文窗口的构成
Claude Code 的上下文窗口是一个有限的"工作记忆"空间,包含以下内容^5:
| 内容类别 | 说明 | 占比估算 |
|---|---|---|
| 系统提示和 CLAUDE.md | 项目指令、规则 | ~5-10% |
| 用户消息 | 你的提问和指令 | ~10-15% |
| Claude 的响应 | 生成的回答和代码 | ~25-35% |
| 文件读取 | 读取的文件内容 | ~20-30% |
| 命令输出 | 终端命令的执行结果 | ~5-10% |
| 工具输出 | 搜索、分析结果 | ~5-10% |
4.2 优先级策略:什么最重要
Claude Code 在决定保留哪些上下文时,遵循以下优先级^5:
最高优先级(始终保留):
- 系统提示和 CLAUDE.md 内容
- 最近的 3-5 轮对话
- 当前正在编辑的文件
高优先级(尽量保留):
- 用户明确提及的文件
- 当前任务直接相关的代码
- 最近的命令输出
可压缩(需要时总结):
- 早期的对话历史(可用
/compact压缩) - 已完成的探索结果
- 不相关的文件内容
最低优先级(首先丢弃):
- 过时的工具输出
- 已验证通过的测试输出
- 与当前任务无关的文件
4.3 使用 /context 查看当前上下文状态
Claude Code 提供了 /context 命令,让你实时了解上下文使用情况:
claude> /context
预期输出:
Context usage: 68% (142,000 / 200,000 tokens)
Breakdown:
- System prompt + CLAUDE.md: 12,000 tokens (8%)
- Conversation history: 45,000 tokens (32%)
- File reads: 62,000 tokens (44%)
- Command outputs: 18,000 tokens (13%)
- Tool definitions: 5,000 tokens (4%)
Optimization suggestions:
- Run /compact to free up ~20,000 tokens
- 5 files in context haven't been referenced in 10+ turns
- Consider starting a new session for a different task
4.4 使用 /compact 主动管理上下文
当上下文接近上限时,/compact 命令可以总结并压缩对话历史^6:
claude> /compact 保留关于认证模块重构的决策
/compact 的工作原理:
- 保留关键决策和结论
- 丢弃详细的探索过程和中间步骤
- 保留文件修改记录
- 释放 20-40% 的上下文空间
什么在压缩后保留^5:
| 机制 | 压缩后状态 |
|---|---|
| 系统提示和输出样式 | 不变(不在消息历史中) |
| 项目根目录 CLAUDE.md | 从磁盘重新注入 |
| 自动记忆 | 从磁盘重新注入 |
| 路径限定规则 | 丢失,直到再次读取匹配文件 |
| 嵌套 CLAUDE.md | 丢失,直到再次读取该子目录文件 |
| 已调用的 Skill | 重新注入,但受 5,000 token/Skill 和 25,000 token 总计上限限制 |
五、与 Claude 对话的最佳实践
5.1 如何描述项目:给 Claude 一张"地图"
最有效的项目描述方式是提供一张清晰的"地图",让 Claude 知道在哪里找什么。
最佳实践 1:使用 CLAUDE.md 提供持久上下文
CLAUDE.md 是 Claude Code 最重要的上下文机制^7。放置在项目根目录的 CLAUDE.md 会在每个会话开始时自动加载,成为系统提示的一部分。
<!-- CLAUDE.md 示例 -->
# 项目上下文
## 项目概述
这是一个基于 Next.js 15 的全栈 SaaS 应用,使用 TypeScript 和 Tailwind CSS。
## 关键目录
- `src/app/` — App Router 页面和 API 路由
- `src/components/ui/` — 基础 UI 组件(shadcn/ui)
- `src/components/features/` — 业务功能组件
- `src/lib/db/` — 数据库 schema 和查询
- `src/lib/auth/` — 认证相关工具
- `src/services/` — 业务逻辑层
## 技术栈
- Next.js 15 + React 19
- TypeScript 5.7
- Tailwind CSS 4
- Drizzle ORM + PostgreSQL
- NextAuth.js v5
- Vitest + Playwright
## 代码规范
- 所有函数必须有类型注解
- 使用 async/await,避免回调
- 错误处理使用 Result 模式,不抛异常
- UI 组件使用 cn() 工具合并 Tailwind 类名
## 常用命令
```bash
pnpm dev # 启动开发服务器
pnpm test # 运行单元测试
pnpm test:e2e # 运行 E2E 测试
pnpm db:generate # 生成 Drizzle 迁移
pnpm db:migrate # 执行迁移
注意事项
- 所有 API 路由必须使用
/api/v1前缀 - JWT token 24 小时过期,refresh token 7 天过期
- 不要在组件中直接调用数据库,必须通过 service 层
**最佳实践 2:使用 `/init` 自动生成 CLAUDE.md**
Claude Code 提供了 `/init` 命令,可以自动分析项目并生成初始的 `CLAUDE.md`[^7]:
```bash
claude> /init
Claude 会:
- 读取 package.json / 等配置文件
- 扫描目录结构
- 识别技术栈和框架
- 生成包含项目概述、关键目录、常用命令的 CLAUDE.md
注意:/init 生成的文件是一个起点,你需要根据实际项目情况补充团队约定、架构决策等它无法推断的内容。
最佳实践 3:分层 CLAUDE.md
对于 monorepo 或大型项目,可以在不同层级放置 CLAUDE.md^8:
~/.claude/CLAUDE.md # 全局:个人偏好、通用标准
./CLAUDE.md # 项目根:架构、技术栈
./packages/api/CLAUDE.md # 子包:API 层的特定约定
./packages/web/CLAUDE.md # 子包:前端层的特定约定
加载优先级:子目录 > 项目根 > 全局。这让 Claude 在工作的具体位置获得最相关的上下文。
5.2 如何提问:从模糊到精确
提问的质量直接决定了 Claude 的回答质量。以下是不同精确度的提问对比:
模糊提问(低效):
claude> 这个项目有点问题,帮我看看
# Claude 不知道从哪里开始,可能读取大量无关文件
中等精确度:
claude> 登录功能有问题,帮我检查一下
# Claude 会搜索 auth 相关文件,但仍需探索
精确提问(高效):
claude> 在 src/app/api/auth/login/route.ts 中,POST 处理函数(约第 15 行)没有验证请求体。添加 Zod schema 验证,确保 email 是有效邮箱格式,password 至少 8 位。参考 src/lib/validation/user.ts 中的现有验证模式。
# Claude 直接定位到具体文件,理解约束条件,参考现有模式
高效提问的公式:
[具体位置] + [当前行为] + [期望行为] + [约束/参考]
5.3 "探索-计划-编码"框架
对于复杂任务,采用分阶段的方法可以显著提高成功率^9:
阶段 1:探索(Explore)
claude> 我需要给通知系统添加 Slack 渠道支持。先不要写代码,先探索 /src/notifications/ 目录,了解:1) 文件结构 2) 渠道基类接口 3) 现有渠道(Email、SMS)是如何注册的。只读模式,不要修改任何文件。
阶段 2:计划(Plan)
claude> 基于刚才的探索,制定一个详细的实施计划。需要:1) 创建哪些文件 2) 修改哪些文件 3) 遵循什么模式 4) 测试策略是什么。列出每一步的具体操作。
阶段 3:编码(Code)
claude> 按照计划实施。先创建 SlackChannel 类,然后注册到通知路由器,最后写测试。每完成一步告诉我结果。
这个框架的核心思想是:先理解,再计划,最后执行。它避免了 Claude 在不了解上下文的情况下盲目修改代码。
六、常见提问模板与预期响应
模板 1:"这个项目做什么?"
claude> 用一段话概括这个项目是做什么的。它的核心功能是什么?目标用户是谁?
预期响应:
这是一个开源的在线协作白板应用,核心功能包括:
1. 实时多人协作:基于 WebSocket 的同步编辑
2. 丰富的绘图工具:便签、连线、图形、手绘
3. 导出功能:支持 PNG、SVG、PDF 导出
4. 自托管支持:提供 Docker 部署方案
目标用户是需要远程协作进行头脑风暴、流程图绘制、UI 原型设计的团队。
技术亮点:
- 使用 CRDT 算法处理并发编辑冲突
- Canvas 渲染引擎支持万级元素流畅操作
- 端到端加密选项保护敏感内容
模板 2:"技术栈是什么?"
claude> 详细分析这个项目的技术栈。包括:前端、后端、数据库、基础设施、开发工具。对每个主要技术选择,说明它的作用。
模板 3:"目录结构解释"
claude> 用树状图展示项目的目录结构(只显示到 2 级深度),然后解释每个主要目录的设计意图和包含的内容类型。
模板 4:"找到 X 功能的实现"
claude> 找到用户密码重置功能的完整实现。包括:1) 触发重置的 API 端点 2) 生成重置 token 的逻辑 3) 发送邮件的代码 4) 验证 token 并重置密码的逻辑 5) 对应的测试文件。列出每个文件的绝对路径和关键函数名。
模板 5:"这个函数/类是做什么的?"
claude> 解释 src/services/payment.ts 中的 `processRefund` 函数。包括:1) 输入参数和返回值 2) 核心逻辑步骤 3) 错误处理策略 4) 调用的外部服务 5) 可能的边界情况。
模板 6:"数据流/调用链分析"
claude> 追踪"创建订单"这个业务操作的完整调用链。从前端提交表单开始,到数据写入数据库结束。列出每个步骤涉及的文件、函数和数据转换。
模板 7:"找出所有使用 X 的地方"
claude> 找出项目中所有使用 `useAuth` hook 的地方。对每个使用点,说明:1) 文件路径 2) 使用方式(读取了哪些返回值)3) 使用场景(在哪个组件中,做什么用)。
模板 8:"生成架构文档"
claude> 基于代码库生成一份架构文档,包含:1) 系统架构图(用 Mermaid 语法)2) 核心模块说明 3) 数据模型关系 4) API 端点列表 5) 部署架构。保存为 docs/architecture.md。
七、大型代码库的处理策略
7.1 大型代码库的挑战
当代码库超过约 5 万行时,Claude Code 面临三个核心挑战^10:
挑战 1:盲目编辑(The Blind Edit)
Claude 修改了一个文件,但没有看到它的调用者、测试或相关类型定义。修改在局部是正确的,但在全局是破坏性的。
挑战 2:上下文抖动(Context Thrashing)
Claude 读取了十个文件来理解问题,消耗了 60% 的上下文窗口。当它开始写代码时,已经忘记了最早读取的文件细节。
挑战 3:过度读取(The Over-read)
你让 Claude 修复一个模块的 bug,它却预先读取了整个目录树、所有相关测试、package.json、README 和三个配置文件。80% 的上下文被无关信息占据。
7.2 "放大-缩小"工作流
这是处理大型代码库的核心工作流^10:
缩小模式(Zoomed-out):定向探索
在缩小模式下,Claude 只做一件事:建立对当前任务相关代码区域的心智模型。不编写任何代码。
claude> 我需要给通知系统添加 Slack 渠道。在写任何代码之前,先探索 /src/notifications/。告诉我:1) 文件结构 2) 渠道基类接口 3) 现有渠道(Email、SMS)是如何注册的。只读,不修改。
放大模式(Zoomed-in):精确执行
在放大模式下,Claude 基于缩小阶段建立的心智模型,精确地修改代码。
claude> 现在实现 Slack 通知渠道。严格按照 EmailChannel 在 /src/notifications/channels/email.ts 中的模式。在 /src/notifications/channels/slack.ts 创建新文件。使用 /src/lib/slack.ts 中的 SlackWebhookClient 发送消息。
振荡原则:复杂任务需要多次放大-缩小循环。实现(放大)→ 运行测试(缩小看失败)→ 修复(放大)→ 检查集成(缩小)。这种振荡不是低效,而是可靠 AI 辅助开发的节奏。
7.3 外科手术式上下文加载
核心原则:给 Claude 每个步骤所需的最小上下文,让它按需请求更多^10。
反模式(不要这样做):
claude> 先读取整个 src/ 目录了解项目结构,然后修复这个 bug
# 消耗大量上下文在探索上
正确做法:
claude> 修复 src/auth.ts 中第 45 行的类型错误
# 只读取一个文件,如果需要更多 Claude 会请求
上下文预算心智模型:
把上下文窗口想象成一个预算。每次文件读取都是一笔支出。每次推理都是一笔支出。每行生成的代码都是一笔支出。你的工作是确保支出是高价值的——直接与任务相关。
7.4 Monorepo 专项策略
Monorepo 将上下文管理的挑战放大了十倍^10:
原则 1:包隔离
把每个包当作独立的代码库。从包根目录开始 Claude 的上下文,而不是 monorepo 根。
claude> 我们在 packages/api 中工作。入口点是 packages/api/src/index.ts。相关类型在 packages/shared/src/types/ 中,但只读取需要的类型文件,不要探索整个 shared 包。
原则 2:顺序修改,不要并行
跨包修改时,一次改一个包。先改共享类型,验证通过。再更新消费者,再次验证。
原则 3:维护依赖关系图
在根目录 CLAUDE.md 中维护一个简单的依赖关系图:
## 包依赖关系
- `packages/api` 依赖 `packages/shared` 和 `packages/db`
- `packages/web` 依赖 `packages/shared` 和 `packages/ui`
- 无其他跨包依赖
7.5 长会话管理策略
当会话超过 30 轮时,上下文质量会显著下降。以下是管理长会话的策略^6:
策略 1:定期使用 /compact
每 10-15 轮运行一次 /compact,压缩对话历史。
策略 2:检查点模式
每完成一个逻辑子任务,让 Claude 总结当前状态:
claude> 总结一下我们目前完成了什么、什么还在进行中、还有什么待做。保存到 /tmp/progress.md。
策略 3:会话拆分
将大功能拆分为多个会话:
- 会话 1:数据层修改
- 会话 2:API 端点实现
- 会话 3:前端组件
- 会话 4:集成测试
策略 4:新鲜重启
当会话已经深入调试死胡同、Claude 明显在"挣扎"时,最好的策略是开一个新会话,用一个简洁的简报重新开始:
# 新会话
claude> 问题:用户随机被登出。已尝试:1) 检查 token 过期逻辑(无果)2) 检查 cookie 设置(无果)。怀疑:session 刷新中间件有竞态条件。请检查 /src/middleware/session-refresh.ts 找出根本原因。
7.6 使用 .claudeignore 排除无关文件
类似于 .gitignore,你可以创建 .claudeignore 文件来告诉 Claude Code 忽略某些文件和目录^11:
# .claudeignore
node_modules/
dist/
build/
.coverage/
*.min.js
*.min.css
public/assets/
test/fixtures/
这可以防止 Claude 在探索时读取生成的文件、测试夹具、构建产物等无关内容。
八、实战案例:从零理解一个陌生项目
让我们通过一个完整的实战案例,展示如何使用本章介绍的技术快速理解一个陌生代码库。
场景:你刚加入一个团队,需要快速理解一个电商平台的代码库。
步骤 1:启动并初始化
cd ecommerce-platform
claude
# 如果项目没有 CLAUDE.md,先运行 /init
claude> /init
步骤 2:获取高层概览
claude> 分析这个项目的技术栈和架构。用 3 句话概括它是做什么的,然后列出主要技术选择和目录结构。
步骤 3:理解核心领域
claude> 这个电商平台有哪些核心领域模块?(如商品、订单、用户、支付等)每个领域的主要文件在哪里?
步骤 4:追踪一个完整业务流程
claude> 追踪"用户下单"的完整业务流程。从点击"购买"按钮开始,到订单创建成功结束。列出涉及的所有文件、API 端点、数据库表和外部服务调用。
步骤 5:理解数据模型
claude> 列出所有数据库表(或模型),并说明它们之间的关系。用 Mermaid ER 图语法表示。
步骤 6:识别关键约定和模式
claude> 这个项目使用了哪些设计模式?代码中有哪些反复出现的约定?(如错误处理、API 响应格式、认证检查等)
步骤 7:生成个人速查文档
claude> 基于以上分析,生成一份我个人的 onboarding 速查文档,保存为 ONBOARDING.md。包含:1) 项目一句话描述 2) 技术栈 3) 关键文件速查表 4) 常见任务的操作指南 5) 需要注意的坑。
通过这 7 个步骤,你可以在 30 分钟内建立起对一个陌生中大型项目的系统性理解,而传统方式可能需要数天。
九、常见错误与避免方法
| 错误 | 后果 | 正确做法 |
|---|---|---|
| 一次性让 Claude "理解整个代码库" | 上下文爆炸,什么都记不住 | 给 Claude 地图(CLAUDE.md),让它按需探索 |
| 把完整文件粘贴到对话中 | 消耗大量上下文 | 引用文件路径,让 Claude 用工具读取 |
| 会话过长不清理 | 上下文质量下降,回答变糟 | 定期 /compact,任务完成后开新会话 |
| 让 Claude 做搜索而非推理 | 浪费推理能力 | 用 grep/fd 做搜索,Claude 做分析和决策 |
| 不提供约束条件 | Claude 做出不符合项目约定的选择 | 在 CLAUDE.md 中记录约定,提问时明确约束 |
| 忽略验证步骤 | 代码有 bug 未被发现 | 每次修改后要求运行测试和类型检查 |
| 在 monorepo 中从根目录开始所有工作 | 上下文被无关包污染 | 从具体包的目录开始,明确指定工作范围 |
十、参考来源
本文档内容综合整理自以下权威来源:
- Claude Code 官方文档 - How Claude Code works — Agentic Loop、工具集和核心架构的官方说明
- Claude Code 官方文档 - Explore the context window — 上下文窗口的交互式模拟和机制说明
- Claude Code 官方博客 - Using CLAUDE.md files — CLAUDE.md 的使用方法和最佳实践
- Nate Ross - Claude Code Tutorials Part 3 — 使用 Claude Code 理解新代码库的系统方法
- eesel.ai - How to navigate any codebase with Claude Code — 代码库导航的核心技巧和高级工作流
- Kane.mx - Context Engineering Secrets for Claude Code — 上下文工程的四个关键模式
- Osvaldo Restrepo - Claude Code context limits — 上下文限制管理的实战经验
- Iceberg Lakehouse - Context Management Strategies — 完整的上下文管理策略指南
- Ralphable - Navigate 100K+ Line Codebases — 大型代码库处理的实战系统
- Hashbuilds - Handle Large Codebases — 大型项目的上下文管理策略
- John Lindquist - Claude Code Task Tool Deep Dive — Subagent 的深入技术解析
- AGI In Progress - Dissecting Claude Code — Claude Code 的技术架构深度分析
- Claude Code 官方文档 - Subagents — 子代理的官方文档
- Claude Code 官方文档 - CLI reference — 命令行参考
- CometAPI - Managing Claude Code's Context — 上下文管理的实用手册
十一、本章速查卡
| 我想做... | 命令/操作 |
|---|---|
| 让 Claude 了解项目 | 先运行 /init 生成 CLAUDE.md,然后补充团队约定 |
| 分析技术栈 | 分析这个项目的技术栈,列出主要框架和工具 |
| 解释目录结构 | 解释这个项目的目录结构和设计模式 |
| 找到功能实现 | 找到 [功能] 的完整实现,列出涉及的文件 |
| 追踪数据流 | 追踪 [操作] 的完整调用链,从入口到数据库 |
| 理解单个函数 | 解释 [文件] 中 [函数] 的功能、参数和返回值 |
| 并行探索多个模块 | 使用 subagent 并行探索 [模块A] 和 [模块B] |
| 查看上下文使用 | /context |
| 压缩对话历史 | /compact [保留重点] |
| 排除无关文件 | 创建 .claudeignore 文件 |
| 探索但不修改 | 先不要写代码,先探索... |
| 切换任务时 | /clear 或开新会话 |
| 引用文件 | @path/to/file |
| 精确修改 | [文件] + [当前行为] + [期望行为] + [约束] |