CLAUDE.md 是 Claude Code 最被低估的功能——一行代码不用写,就能把 AI 编程助手的准确率从 60% 提升到 90%。但你很可能只用到了它 10% 的能力。
痛点:你的 Claude Code 为什么总写"差不多对"的代码?
如果你每天用 Claude Code 写代码,大概率经历过以下场景:
- 让它写一个 API 接口,它用了 Flask 而不是你项目里一直用的 FastAPI
- 让它加个错误处理,它用了
try/except而不是团队约定的Result<T>模式 - 让它改个样式,它写了 CSS 而不是你项目在用的 Tailwind
- 每次都要在 prompt 里重复:"记得用 FastAPI""记得用 TypeScript strict mode""不要用 any"
这不是 Claude 不够聪明——它只是不知道你的项目规则。
Claude Code 每次启动新会话时,上下文是空白的。它能看到你的代码,但看不到你团队约定、你的技术栈偏好、你的代码风格。你每次都要"重新教它一遍"。
CLAUDE.md 就是解决方案——它是一个放在项目根目录的 Markdown 文件,Claude Code 会在每次对话开始时自动加载它。
CLAUDE.md 是什么?
简单到不可思议:在你的项目根目录创建一个 CLAUDE.md 文件,写几段话告诉 Claude 你的项目规则。 Claude Code 启动时会自动读取它。
# 创建你的第一个 CLAUDE.md
touch CLAUDE.md
它的威力不在于技术复杂度,而在于让 AI 拥有了"项目记忆"——不需要 API 调用、不需要数据库、不需要任何基础设施。就是一个文件。
项目根目录
├── CLAUDE.md ← Claude Code 自动读取
├── src/
├── package.json
└── ...
三层配置体系:从全局到局部
很多人只知道项目根目录的 CLAUDE.md,但实际上 Claude Code 支持三层配置:
第一层:全局配置(~/.claude/CLAUDE.md)
对所有项目生效。适合放你的个人编码偏好:
# 全局编码偏好
## 语言偏好
- 所有解释、注释、commit message 优先使用中文
- 代码标识符、变量名使用英文
## 交互风格
- 做任何可能产生副作用的操作前先确认(如删除文件、git push)
- 遇到不确定的决策时,列出选项让我选择,而不是自作主张
- 回复简洁,不要过度解释已知概念
## 工具偏好
- 优先使用 ripgrep (rg) 搜索代码,而不是 grep
- 构建工具优先用 pnpm,其次是 npm,不要用 yarn
第二层:项目配置(./CLAUDE.md)
放在项目根目录。适合放这个项目的技术规则:
# 项目:用户管理系统 API
## 技术栈
- 后端:Python 3.12+ / FastAPI / SQLModel / PostgreSQL 16
- 测试:pytest + pytest-asyncio,覆盖率要求 ≥85%
- 部署:Docker + docker-compose
## 代码规范
- 所有 API 返回统一格式:`{"code": 0, "data": ..., "message": "ok"}`
- 错误处理:使用项目封装的 `AppError` 异常类,不要直接 `raise HTTPException`
- 数据库查询:用 SQLModel 的 `select()` 语法,不要手写 SQL
- 类型注解:所有函数参数和返回值必须有完整类型注解
## 项目结构
- `src/models/` - 数据模型
- `src/routes/` - API 路由
- `src/services/` - 业务逻辑
- `src/utils/` - 工具函数
第三层:子目录配置(src/backend/CLAUDE.md)
Claude Code 还会读取当前工作目录及其父目录的 CLAUDE.md。如果你在 src/backend/ 目录下启动 Claude Code,它会合并:
1. ~/.claude/CLAUDE.md(全局)
2. ./CLAUDE.md(项目根目录)
3. ./src/backend/CLAUDE.md(当前目录)
这意味着你可以为不同子系统设置不同的规则:
# src/backend/CLAUDE.md - 后端子系统规则
## 缓存策略
- 所有读接口必须有 Redis 缓存层(TTL 默认 300s)
- 缓存键命名:`{服务名}:{资源类型}:{资源ID}`
- 写操作必须主动 invalidate 相关缓存
## 日志规范
- 使用 structlog,不要用 print 或 logging.info
- 每条日志包含:request_id, user_id, action, duration_ms
3个实战模板(复制即用)
模板1:Python 后端项目
# CLAUDE.md - Python 后端项目模板
## 核心约束(Always)
- Python 版本:3.12+
- 依赖管理:uv(不要用 pip/poetry)
- Web 框架:FastAPI(不要用 Flask/Django)
- ORM:SQLModel(不要用纯 SQLAlchemy)
- 类型检查:mypy --strict 模式,零容忍
## 代码风格
- 遵循 ruff 规则集(自动格式化由 pre-commit 处理)
- 函数最大行数:50 行
- 类最大方法数:无限制,但单个方法不超过 30 行
- 不要写 `# type: ignore` — 把类型写对,而不是屏蔽检查
## 错误处理模式
```python
# ✅ 正确:使用项目自定义异常
from app.errors import NotFoundError, ValidationError
raise NotFoundError(f"用户 {user_id} 不存在")
# ❌ 错误:不要用 HTTPException
from fastapi import HTTPException
raise HTTPException(status_code=404) # 禁止
测试要求
- 每个新功能必须有测试
- 测试文件命名:
test_{模块名}.py - 使用 pytest.mark.parametrize 覆盖边界情况
- 数据库测试使用 testcontainers,不要 mock 数据库
### 模板2:React + TypeScript 前端项目
```markdown
# CLAUDE.md - React 前端项目模板
## 技术栈
- React 19 + TypeScript 5.6+
- 状态管理:Zustand(不要用 Redux)
- 样式:Tailwind CSS v4
- 构建:Vite 6
- 包管理:pnpm
## TypeScript 规范
- strict 模式必须开启
- 禁止使用 `any` — 用 `unknown` + 类型守卫代替
- Props 类型必须导出:`export interface ButtonProps {}`
- 事件处理器类型用 React 内置类型:
```tsx
// ✅ 正确
const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {}
// ❌ 错误
const handleClick = (e: any) => {}
```
## 组件规范
- 一个文件一个组件(除非是纯工具函数)
- 组件命名:PascalCase
- 文件命名:kebab-case(button-group.tsx → ButtonGroup)
- 导出方式:named export,不要 default export
## 样式规范
- 始终用 Tailwind,不写自定义 CSS 文件
- 复用样式用 `@apply` 或提取组件,不复制 class 字符串
- 响应式设计:移动端优先(从 sm: 开始加断点)
模板3:AI 创业者的通用配置
# CLAUDE.md - AI 创业者通用模板
## 工作原则
- 快速迭代优先于完美架构:先做出能跑的 MVP,再优化
- 每个功能从用户故事开始,不要从技术方案开始
- 我是一名独立开发者,不需要企业级的过度工程
## 技术选型偏好
- 能用 SaaS 就不自建(支付用 Stripe/Lemon Squeezy,不自己写)
- 能用 Serverless 就不自己管服务器(Cloudflare Workers > VPS)
- 数据库优先选 SQLite + Turso/Litestream,够用且运维成本为零
## 开发流程
1. 先讨论方案(5-10分钟,列出 trade-offs)
2. 再写代码(专注于核心功能,延后非关键特性)
3. 每个功能完成后 commit(commit message 用中文)
## 成本意识
- 提醒我可能产生费用的操作(API 调用、云服务创建资源)
- 优先推荐有免费层的服务
- 估算新功能带来的月成本变化
高级技巧:让你的 CLAUDE.md 更强大
技巧1:引用其他文件
当规则太长时,拆分成多个文件:
# CLAUDE.md
## 项目概述
[简短描述]
## 规则文件
详见以下文件:
- 代码规范:@./docs/CODING_STANDARDS.md
- API 设计规范:@./docs/API_DESIGN.md
- 部署流程:@./docs/DEPLOY.md
## 快速参考
[最常违反的 3 条规则]
技巧2:用"禁止清单"代替"建议清单"
Claude 对否定指令的遵守率远高于肯定建议。对比:
# ❌ 低效(Claude 经常忽略)
- 使用 async/await
- 添加错误处理
- 写单元测试
# ✅ 高效(Claude 严格遵守)
- 禁止:使用同步代码进行 I/O 操作
- 禁止:让异常逃逸到 API 层(必须用 AppError 包装)
- 禁止:提交没有测试的新代码
技巧3:给出"而不是"的明确替代
模糊的规则 Claude 理解不了。每条规则都给出反例:
## 数据访问层
- 使用 Prisma Client 而不是手写 SQL
- 使用 Zod 做输入验证,而不是 if/else 手动检查
- 使用 tRPC 的过程调用,而不是手动定义 REST endpoint
技巧4:设置 Claude Code 的系统级 Hook
在 CLAUDE.md 同级目录创建 .claude/settings.json:
{
"permissions": {
"allow": ["Bash(npm run *)", "Bash(pnpm run *)", "Bash(git *)", "Bash(npx tsc *)"],
"deny": ["Bash(rm -rf *)", "Bash(git push --force *)", "Bash(git reset --hard *)"]
},
"model": "claude-sonnet-4-20250514"
}
这让 Claude Code 可以自动执行安全的命令(运行测试、类型检查),但阻止危险操作(强制推送、硬重置)。
常见问题
Q:CLAUDE.md 和 .claude/settings.json 有什么区别?
CLAUDE.md 是给 Claude 看的——自然语言规则、偏好、约定。
.claude/settings.json 是给 Claude Code 程序看的——权限、模型选择、工具配置。
前者影响 Claude "怎么想",后者影响 Claude "能做什么"。
Q:CLAUDE.md 太长会影响性能吗?
会。CLAUDE.md 的内容会占用上下文窗口。建议项目级 CLAUDE.md 控制在 500 行以内,全局 CLAUDE.md 控制在 200 行以内。如果规则很多,用 @ 引用外部文件,Claude 按需读取。
Q:我的 CLAUDE.md 改了,Claude Code 需要重启吗?
不需要。下一次对话会自动加载新的 CLAUDE.md。你也可以在对话中用 /init 命令重新加载。
Q:多个 CLAUDE.md 冲突怎么办?
Claude Code 的合并策略是"越近越优先":子目录 > 项目根目录 > 全局。如果子目录的 CLAUDE.md 说"用 Flask",项目根目录说"用 FastAPI",子目录的规则生效。
Q:CLAUDE.md 能放敏感信息(API Key)吗?
绝对不要。 CLAUDE.md 是明文文件,通常会被 git 跟踪。敏感信息放 .env 文件或用环境变量。
总结
CLAUDE.md 是 Claude Code 生态里 ROI 最高的功能——5 分钟设置,每天省下的时间远超这个投入。
三步开始:
- 创建
~/.claude/CLAUDE.md,写入你的全局编码偏好(语言、工具、交互风格) - 在你最常用的项目根目录创建
CLAUDE.md,写入至少 3 条"禁止规则" - 用
/init重载,然后让 Claude Code 实现一个新功能——感受一下不再需要"教它规则"的快感
进阶挑战:一周后回来读你的 CLAUDE.md。删掉那些 Claude 没有遵循的模糊规则,改成"禁止"句式。迭代 3 次后,你会发现 Claude Code 的准确率显著提升。
下一篇预告:【Agent工坊】OpenClaw 定时任务实战——搭建24小时无人值守的 AI 监控系统
