CLAUDE.md 的最佳实践为什么你的配置文件基本上是废的你花了两个小时精心编写 CLAUDE.md结果 Claude Code 还是在做同样的错误。不是它故意忽略你——是你在用错误的方式写它。先理解一个工程事实指令容量是有上限的很多人不知道这件事Claude 能可靠遵循的指令数量大约是 150-200 条。而 Claude Code 的内置系统提示本身已经消耗了约 50 条。这意味着你的 CLAUDE.md 实际可用的指令预算只有100-150 条。写了 300 行后面那 150 行基本上处于薛定谔状态——有没有被执行全靠运气。这不是 Claude 的态度问题而是注意力分配的工程约束。更长的文件并不等于更好的结果往往恰恰相反。核心原则一CLAUDE.md 不是文档是有限预算的约束集合。每一行都有成本。最常见的错误写了一堆无效指令打开大多数人的 CLAUDE.md你会看到这类内容你是一个经验丰富的高级工程师。 请逐步思考确保代码质量。 遵循最佳实践。 保持代码简洁易读。这些指令消耗了你宝贵的预算但对 Claude 的实际行为零改变。原因很简单Claude 本来就会逐步思考本来就会遵循最佳实践——这些是它的默认行为用语言再说一遍并不会强化它。更关键的是Claude 在处理指令时会做一个内在区分指令类型例子Claude 的处理方式可验证的约束永远不要直接编辑 package-lock.json当作硬性规则执行模糊的建议对依赖要小心当作可以合理化忽略的建议身份/氛围描述你是高级工程师基本无效本来就是这个区别不是玄学。Claude 经过 RLHF 训练后会把可以检查自己是否做到的指令当作约束把无法自我验证的指令当作软性建议——而软性建议在遇到其他优先级更高的任务目标时会被自然地让路。核心原则二有效的指令只有一种——阻止一个 Claude 会犯的具体错误且 Claude 自己能验证是否遵守了。如何写出有效的指令❌ 无效写法- 写代码时注意安全性 - - 保持代码风格一致 - - 谨慎处理数据库操作 - - 确保测试覆盖率 - ### ✅ 有效写法 markdown - 永远不要直接编辑 package-lock.json只通过 npm install 修改 - - 所有数据库迁移文件必须有对应的 rollback 脚本 - - 新增功能前先检查 /tests 目录是否存在对应测试文件 - - 环境变量只从 .env.example 读取不硬编码在代码里 - - 修改 API 接口前先确认没有其他模块依赖该接口签名 - 对比一下后者的每一条Claude 都可以在执行完后自问我做到了吗——答案是明确的是或否。前者的每一条Claude 都可以在做了任何事之后说我觉得我做到了。 **判断标准如果一条指令无法被违反它就不是约束是废话。** ## 三层结构大多数人完全不知道 Claude Code 支持三个层级的配置文件绝大多数人只用了其中一个~/.claude/CLAUDE.md ← 全局层每个项目都生效.claude/CLAUDE.md ← 项目层入 git团队共享./CLAUDE.local.md ← 本地层gitignore个人 override### 全局层 ~/.claude/CLAUDE.md 放**跨项目通用的硬性规则**。这里的规则适用于你用 Claude Code 做的一切事情。 markdown ## 安全红线全局 - 永远不要在代码里硬编码 API key、密码或 token - - 不要提交 .env 文件即使用户要求也不行 - - 看到 credentials/ 目录里的文件只读不写 ## 输出规范全局 - 修改文件前先说明你要做什么等我确认 - - 不要一次性修改超过 3 个文件除非我明确要求 - ### 项目层 .claude/CLAUDE.md 放**这个项目的技术栈上下文和团队规范**。这个文件应该入 git让团队所有人共享。 markdown ## 技术栈 - Node.js 20 TypeScript 5.3使用 ESM 模块 - - 数据库PostgreSQL 15ORMPrisma - - 测试框架Vitest不是 Jest ## 项目约定 - API 路由统一放在 /src/routes/每个文件对应一个资源 - - 数据库查询只能在 /src/services/ 里不能在 routes 里直接查 - - 错误处理统一用 /src/utils/errors.ts 里的 AppError 类 ## 常见错误已验证 - 不要用 req.body 直接存数据库必须先经过 Zod schema 验证 - - Prisma 查询记得加 .catch() 或 try/catch不要让 unhandled rejection 冒泡 - ### 本地层 ./CLAUDE.local.md 放**个人偏好和临时 override**。这个文件加入 .gitignore不影响团队。 markdown ## 我的个人偏好 - 我习惯用 tabs 不用 spaces项目用 spaces但我本地格式化用 tabs - - 生成代码时少用注释我自己会加 - - 解释方案时直接给结论不要先列三个选项让我选 - 三层分离的好处**不同生命周期、不同受众的规则各归其位不互相污染。** ## 实战精简 CLAUDE.md 的四步法 ### Step 1审计现有内容 把你现有的 CLAUDE.md 逐行过一遍对每一条问 - 这条指令 Claude 违反了会怎样如果没有后果删掉 - - 这条指令来自一次真实的、让我痛苦的错误吗如果不是删掉 - - 这条指令 Claude 能自我验证吗如果不能重写 ### Step 2从错误倒推规则 最好的 CLAUDE.md 是从痛苦经历里提炼出来的。 每次 Claude 犯了一个让你头疼的错误不要只是修复它而是 1. 把这个错误写成一条具体的不要做 X规则 2. 2. 加进对应层级的 CLAUDE.md 3. 3. 验证下次这个错误是否消失了 这样你的 CLAUDE.md 会随着使用越来越精准而不是越来越臃肿。 ### Step 3控制总长度 给自己设一个硬性预算项目层 CLAUDE.md **不超过 50 条规则**。 超过了说明你在往里堆文档而不是写约束。把多余的内容移到 README 或单独的设计文档里。 ### Step 4定期清理 每隔一段时间过一遍删掉已经不再相关的规则。比如不要用 Vue 2 的 Options API——如果你的项目已经全面升级到 Vue 3 Composition API这条规则就是噪音。 **CLAUDE.md 应该是活的约束集不是历史档案。** ## 一个可以直接用的模板 markdown # [项目名] — Claude Code 配置 ## 项目上下文简短 [2-3 句话描述项目是什么用什么技术栈] ## 硬性约束Claude 必须遵守的 - [具体规则 1] - - [具体规则 2] - - [具体规则 3] ## 常见错误历史上 Claude 犯过的 - 不要做 [具体行为]因为 [具体后果] - - 不要做 [具体行为]正确做法是 [具体替代方案] ## 目录结构约定如果项目结构非标准 - [路径] → [用途] - - [路径] → [用途] - 注意这个模板里没有 - 任何关于 Claude 应该是什么样的人的描述 - - 任何模糊的质量建议 - - 任何 Claude 本来就会做的事情的提醒 ## 写在最后写给机器的规则和写给人的文档是两件事 大多数人的 CLAUDE.md 写不好是因为他们在用写文档的思维写约束。 文档可以模糊可以依赖读者的推断能力可以用注意、尽量、最好这类词。约束不行——约束要么是硬的要么没有意义。 把 CLAUDE.md 想象成单元测试每一条都在断言一个具体的、可验证的行为。通过的测试是隐形的Claude 默默做对了失败的测试会立刻让你知道Claude 犯了你已经预见到的错误。 **少即是多。50 条精准的约束远好过 500 行的愿望清单。** --- *参考来源Reddit r/ClaudeCode 社区讨论、Claude Code 官方文档、Anthropic 提示工程指南*