Claude Code: CLAUDE.md 使用指南
最后更新:2026-08-31
CLAUDE.md 是 Claude Code 的"项目说明书"——写得好,Claude Code 就像一个熟悉项目的老员工;写得差,它就像一个什么都不懂的新人。
💡 提示:CLAUDE.md 的核心原则是"显式优于隐式"——把你认为理所当然的项目约定写出来,因为 Claude Code 不会猜。
📋 前置知识:第八章 基础用法
1. 你将学到
- CLAUDE.md 的完整语法与结构
- 分层配置策略(全局/项目/目录)
- 编写最佳实践
- 常见陷阱与避坑
- 实战案例对比
2. CLAUDE.md 语法与结构
(1) 核心结构
MARKDOWN
# CLAUDE.md
## 项目概述
[一句话描述项目是什么、做什么]
## 技术栈
[语言、框架、数据库、工具链]
## 常用命令
[构建、测试、部署、开发命令]
## 代码约定
[命名规范、文件组织、风格要求]
## 约束与限制
[不能做什么、必须做什么]
## 已知问题
[需要特别注意的技术债和坑]
(2) 指令类型
| 类型 | 示例 | 优先级 |
|---|---|---|
| 必须做 | "所有 API 必须有错误处理" | 高 |
| 不能做 | "不要直接修改数据库表" | 高 |
| 建议做 | "优先使用函数式风格" | 中 |
| 参考信息 | "项目使用 Monorepo 结构" | 低 |
▶ 示例 1: 高质量 CLAUDE.md
MARKDOWN
# CLAUDE.md
## 项目概述
SaaS 计费平台后端,处理订阅管理、发票生成和支付集成。
## 技术栈
- Node.js 20 + TypeScript 5.3
- Express 4.18 + middleware chain
- Prisma 5.x (PostgreSQL)
- Redis (缓存 + 队列)
- Jest + Supertest (测试)
## 常用命令
- `npm run dev` — 启动开发服务器 (port 3000)
- `npm test` — 运行全量测试
- `npm test -- --watch` — 监视模式
- `npm run lint` — ESLint 检查
- `npx prisma migrate dev` — 数据库迁移
## 代码约定
- Service 层只处理业务逻辑,不直接访问 HTTP 对象
- Controller 层负责请求/响应转换
- 所有数据库操作通过 Repository 模式
- 错误使用 AppError 类,包含 statusCode 和 code
- API 响应格式:`{ success: boolean, data: T, error?: string }`
## 约束
- ❌ 禁止直接使用 pg 客户端,必须用 Prisma
- ❌ 禁止在 Service 层访问 req/res
- ❌ 禁止硬编码密钥和凭证
- ✅ 每个 API endpoint 必须有集成测试
- ✅ 所有金额使用 cents(整数),避免浮点误差
## 已知问题
- PaymentService.processRefund 有并发问题(见 ISSUE-342)
- InvoiceService.generatePDF 在大量项目时性能差(见 ISSUE-156)
3. 分层配置策略
(1) 三层配置体系
TEXT
📖 仅展示
~/.claude/CLAUDE.md # 全局:个人偏好
项目根/CLAUDE.md # 项目:团队约定
项目根/src/api/CLAUDE.md # 目录:局部指令
| 层级 | 作用域 | 典型内容 | 优先级 |
|---|---|---|---|
| 全局 | 所有项目 | 个人编码风格偏好 | 最低 |
| 项目 | 当前项目 | 技术栈、命令、约束 | 中 |
| 目录 | 子目录 | 局部特定指令 | 最高 |
(2) 全局 CLAUDE.md
MARKDOWN
<!-- ~/.claude/CLAUDE.md -->
# 全局偏好
## 代码风格
- 使用 TypeScript 严格模式
- 优先 const,避免 let
- 函数不超过 20 行
- 添加 JSDoc 注释
## 测试偏好
- 使用 describe/it 风格
- 每个 test 独立,不依赖执行顺序
- mock 外部依赖,不 mock 内部模块
(3) 目录级 CLAUDE.md
MARKDOWN
<!-- src/api/CLAUDE.md -->
# API 模块约定
## 路由注册
- 所有路由在 index.ts 统一注册
- 中间件顺序:auth → rateLimit → validate → handler
## 响应格式
- 成功:{ success: true, data: T }
- 失败:{ success: false, error: { code, message } }
## 禁止
- ❌ 不要在 handler 中直接写业务逻辑
- ❌ 不要跳过参数验证
▶ 示例 2: Monorepo 分层配置
TEXT
📖 仅展示
my-monorepo/
├── CLAUDE.md # 全局:Monorepo 结构和公共命令
├── packages/
│ ├── web/
│ │ └── CLAUDE.md # 前端:React 约定
│ ├── api/
│ │ └── CLAUDE.md # 后端:API 约定
│ └── shared/
│ └── CLAUDE.md # 共享:纯逻辑,无 I/O
4. 编写最佳实践
(1) 有效指令 vs 无效指令
| 无效 | 有效 | 原因 |
|---|---|---|
| "写好代码" | "函数不超过 20 行,圈复杂度 < 10" | 可量化 |
| "注意安全" | "所有用户输入必须 sanitize,禁止拼接 SQL" | 具体可执行 |
| "遵循最佳实践" | "使用 Repository 模式,Service 不直接访问 DB" | 明确模式 |
| "代码要快" | "数据库查询必须加索引,N+1 查询用 DataLoader" | 有具体方法 |
(2) 避坑清单
| 陷阱 | 示例 | 正确做法 |
|---|---|---|
| 太模糊 | "保持代码整洁" | 写具体规范 |
| 太冗长 | 500 行的 CLAUDE.md | 精简到核心约定 |
| 自相矛盾 | "用 REST"又"用 GraphQL" | 保持一致 |
| 过时 | 还在写"使用 Express 3.x" | 随项目更新 |
| 无关信息 | 写团队组织架构 | 只写影响代码的 |
5. 动态更新 CLAUDE.md
▶ 示例 3: 让 Claude Code 维护 CLAUDE.md
TEXT
📖 仅展示
> 根据最近的代码变更,更新 CLAUDE.md
Claude Code:
→ Reading recent commits (last 2 weeks)
→ Reading current CLAUDE.md
→ Changes detected:
1. Migrated from Express to Fastify
2. Added Redis caching layer
3. Changed test framework from Jest to Vitest
→ Updating CLAUDE.md:
- Tech stack: Express → Fastify
- Commands: npm test → npm run test (vitest)
- Added: Redis caching conventions
- Updated: API response format (Fastify style)
CLAUDE.md updated ✓
6. 综合示例:从零编写完整 CLAUDE.md
TEXT
📖 仅展示
# Alice 为新项目编写 CLAUDE.md
> 分析项目并生成 CLAUDE.md
Claude Code:
→ Reading package.json, tsconfig.json
→ Scanning src/ directory structure
→ Reading ESLint and Prettier config
→ Reading existing test files for patterns
→ Generating CLAUDE.md...
# Alice 手动补充业务约定:
## 业务规则
- 订阅状态:active/past_due/canceled/expired
- 订阅降级:立即生效,不退差价
- 计费周期:monthly/yearly,按自然月/年
- 退款策略:7 天内全额退款,超过 7 天按比例退款
## 数据约束
- 金额使用 cents (integer)
- 日期使用 ISO 8601
- 货币使用 ISO 4217 (USD, EUR, CNY)
❓ 常见问题
Q CLAUDE.md 多长合适?
A 50-150 行最佳。太短信息不够,太长 Claude Code 可能忽略部分内容。核心约定优先,参考信息可少写。
Q CLAUDE.md 里的指令 Claude Code 一定会遵守吗?
A 大部分会,但不是 100%。高优先级指令("禁止""必须")遵守率高,建议性指令可能被忽略。关键约束用 ❌ 和 ✅ 标记。
Q 多个 CLAUDE.md 会冲突吗?
A 会。目录级覆盖项目级,项目级覆盖全局。如果冲突,以更具体的为准。
Q 敏感信息能写进 CLAUDE.md 吗?
A 绝对不行。CLAUDE.md 会被提交到 git,API Key、密码等敏感信息用环境变量。
Q CLAUDE.md 支持条件逻辑吗?
A 不支持编程逻辑。只能写静态文本指令。条件判断由 Claude Code 自行决定。
Q 什么时候该更新 CLAUDE.md?
A 技术栈变更、新增约定、发现 Claude Code 反复犯错时,都应该更新。
📖 小节
- CLAUDE.md 是给 Claude Code 看的项目说明书,核心原则"显式优于隐式"
- 三层配置:全局(个人偏好)→ 项目(团队约定)→ 目录(局部指令)
- 有效指令:具体、可执行、可量化,避免模糊和冗长
- ❌/✅ 标记提高指令遵守率
- 随项目演进持续更新,不要让 CLAUDE.md 过时
📝 作业
- 基础题(难度⭐):为你的项目编写一个 50 行的 CLAUDE.md,包含项目概述、技术栈和常用命令。
- 进阶题(难度⭐⭐):实现三层 CLAUDE.md 配置(全局+项目+目录),测试不同层级的指令优先级。
- 挑战题(难度⭐⭐⭐):故意写模糊指令和精确指令,对比 Claude Code 的执行差异,总结 CLAUDE.md 编写的黄金法则。