CLAUDE.md 最佳实践:打造项目记忆
如何编写高效的 CLAUDE.md 让 Claude Code 真正理解你的项目
什么是 CLAUDE.md
CLAUDE.md 是 Claude Code 的”项目记忆文件”。每次启动会话时,Claude Code 会自动读取它,用来理解项目的上下文、约定和规则。
可以把它想象成给 AI 写的一份”项目入职手册”——你希望一个新同事加入团队时知道什么,就写什么。
项目根目录/
├── CLAUDE.md ← Claude Code 启动时自动读取
├── src/
│ ├── CLAUDE.md ← 进入 src 目录时额外加载
│ └── ...
├── package.json
└── ...
文件层级
CLAUDE.md 支持多层级配置,从全局到局部逐级细化:
| 层级 | 位置 | 作用范围 | 优先级 |
|---|---|---|---|
| 用户级 | ~/.claude/CLAUDE.md | 所有项目 | 最低 |
| 项目根级 | 项目根/CLAUDE.md | 当前项目 | 中 |
| 子目录级 | 项目根/src/CLAUDE.md | 特定目录 | 最高 |
用户级 CLAUDE.md
放在 ~/.claude/CLAUDE.md,适合写通用偏好:
# 个人偏好
- 我偏好 TypeScript,使用 strict 模式
- 代码注释用中文
- commit message 用英文,遵循 Conventional Commits
- 测试框架偏好 Vitest
项目根级 CLAUDE.md
这是最重要的一层,放在项目根目录:
# 项目:AI Learning Blog
## 技术栈
- Astro 5.x + TypeScript
- Tailwind CSS 4.x
- 部署在 Cloudflare Pages
## 常用命令
- `npm run dev` - 启动开发服务器
- `npm run build` - 构建生产版本
- `npm run preview` - 预览构建结果
## 项目结构
- `src/content/blog/` - 博客文章(Markdown)
- `src/components/` - Astro 组件
- `src/layouts/` - 页面布局
- `src/pages/` - 路由页面
## 约定
- 文章使用中文撰写
- 技术术语保留英文
- 组件使用 PascalCase 命名
子目录级 CLAUDE.md
针对特定目录的补充说明:
# src/components/
## 组件约定
- 每个组件一个 .astro 文件
- Props 使用 TypeScript interface 定义
- 样式使用 Tailwind CSS class
- 不使用 CSS Modules
应该写什么
一份好的 CLAUDE.md 应该包含以下内容:
1. 项目概述
让 Claude Code 快速理解”这是什么项目”:
## 项目概述
这是一个面向中文开发者的 AI 学习博客,使用 Astro 构建。
主要内容包括 Claude Code 教程、Prompt Engineering 技巧和 AI 工具评测。
目标读者是有 1-3 年经验的中级开发者。
2. 技术栈和版本
明确技术选型,避免 Claude Code 用错版本的 API:
## 技术栈
| 技术 | 版本 | 说明 |
|------|------|------|
| Astro | 5.x | 静态站点生成器 |
| TypeScript | 5.x | 类型系统 |
| Tailwind CSS | 4.x | 原子化 CSS |
| Node.js | 22.x | 运行时 |
3. 常用命令
Claude Code 经常需要执行命令,提前告诉它:
## 常用命令
```bash
npm run dev # 开发服务器 (localhost:4321)
npm run build # 生产构建
npm run check # Astro 类型检查
npm run lint # ESLint 检查
npm run lint:fix # ESLint 自动修复
npm test # 运行测试
npm run test:watch # 测试监听模式
### 4. 项目结构
帮助 Claude Code 快速定位文件:
```markdown
## 项目结构
src/ ├── components/ # 可复用组件 │ ├── Header.astro │ ├── Footer.astro │ └── … ├── content/ │ └── blog/ # 博客文章 │ ├── claude-code/ # Claude Code 系列 │ └── prompt/ # Prompt 系列 ├── layouts/ # 页面布局 │ ├── BaseLayout.astro │ └── ArticleLayout.astro ├── pages/ # 路由 │ ├── index.astro │ └── category/[category].astro └── styles/ # 全局样式
5. 编码约定
这是最容易被忽略但最重要的部分:
## 编码约定
### 命名规范
- 组件:PascalCase(`ShareButtons.astro`)
- 工具函数:camelCase(`formatDate.ts`)
- 常量:UPPER_SNAKE_CASE(`MAX_POSTS_PER_PAGE`)
- CSS class:kebab-case(`article-card`)
### TypeScript
- 启用 strict 模式
- 优先使用 interface 而非 type
- 避免 any,使用 unknown 替代
- 函数参数和返回值必须有类型注解
### Git
- commit message 遵循 Conventional Commits
- 分支命名:feature/xxx, fix/xxx, docs/xxx
- PR 必须通过 CI 检查才能合并
6. 架构决策
记录重要的技术决策和原因:
## 架构决策
### 为什么选择 Astro
- 博客以静态内容为主,Astro 的 Islands 架构最合适
- 零 JS 默认策略,性能优秀
- 原生支持 Markdown/MDX
### 为什么不用数据库
- 内容通过 Markdown 文件管理,Git 即数据库
- 部署在 Cloudflare Pages,无需服务器
### 为什么用 Tailwind CSS 4.x
- 原子化 CSS 减少样式冲突
- 4.x 版本使用 CSS-first 配置,更简洁
不应该写什么
CLAUDE.md 不是万能的。以下内容应该避免:
1. 不要写太长
Claude Code 每次启动都会读取 CLAUDE.md,太长会浪费 Token:
<!-- 不好:把整个 API 文档复制进来 -->
## API 文档
### GET /api/users
### GET /api/users/:id
### POST /api/users
... (500 行)
<!-- 好:给出指引 -->
## API 文档
API 文档在 `docs/api.md`,需要时请查阅。
2. 不要写显而易见的内容
<!-- 不好 -->
- JavaScript 文件以 .js 结尾
- 使用 npm install 安装依赖
<!-- 好 -->
- 使用 pnpm 而非 npm(项目锁文件是 pnpm-lock.yaml)
3. 不要写频繁变化的内容
<!-- 不好 -->
- 当前版本:v2.3.1
- 最近修改了 Header 组件的样式
<!-- 好 -->
- 版本号在 package.json 中管理
- 组件变更记录在 CHANGELOG.md 中
4. 不要写敏感信息
<!-- 绝对不要 -->
- API Key: sk-xxxxx
- 数据库密码: password123
<!-- 应该 -->
- 环境变量在 .env 文件中配置(不要提交到 Git)
- 参考 .env.example 了解需要的环境变量
实战模板
这是一个经过实践验证的 CLAUDE.md 模板:
# 项目名称
## 概述
一句话描述项目是什么、做什么。
## 技术栈
- 框架:xxx
- 语言:xxx
- 包管理器:xxx
## 快速开始
```bash
npm install
npm run dev
项目结构
src/
├── ...
编码约定
- 命名规范
- 代码风格
- 测试要求
常用命令
- 开发:
npm run dev - 构建:
npm run build - 测试:
npm test - Lint:
npm run lint
重要注意事项
- 不要修改 xxx 文件
- xxx 功能有已知限制
- 部署前必须运行 xxx
---
## 保持 CLAUDE.md 更新的技巧
CLAUDE.md 最大的问题是容易过时。这里有几个保持它新鲜的方法:
### 1. 用 Hook 自动提醒
```bash
#!/bin/bash
# .claude/hooks/check-claude-md.sh
# 如果 CLAUDE.md 超过 30 天没更新,提醒一下
CLAUDE_MD="CLAUDE.md"
if [ -f "$CLAUDE_MD" ]; then
LAST_MODIFIED=$(stat -f %m "$CLAUDE_MD" 2>/dev/null || stat -c %Y "$CLAUDE_MD" 2>/dev/null)
NOW=$(date +%s)
DAYS_AGO=$(( (NOW - LAST_MODIFIED) / 86400 ))
if [ "$DAYS_AGO" -gt 30 ]; then
echo "提醒:CLAUDE.md 已经 ${DAYS_AGO} 天没有更新了,考虑检查一下是否需要更新。"
fi
fi
2. 在 PR 模板中加入检查项
## PR Checklist
- [ ] 代码通过 lint 检查
- [ ] 添加了必要的测试
- [ ] 如果修改了项目结构或约定,更新了 CLAUDE.md
3. 让 Claude Code 帮你更新
当你做了重大变更后,直接告诉 Claude Code:
我刚把测试框架从 Jest 迁移到 Vitest,请帮我更新 CLAUDE.md 中的相关内容。
4. 定期审查
每个 Sprint 结束时花 5 分钟检查 CLAUDE.md:
- 技术栈版本是否正确?
- 项目结构是否有变化?
- 有没有新的约定需要记录?
多人协作中的 CLAUDE.md
在团队项目中,CLAUDE.md 是共享的。这意味着:
统一团队认知
## 团队约定
### Code Review 标准
- 每个 PR 至少需要 1 个 Approve
- 不允许直接 push 到 main 分支
- CI 必须全部通过
### 分支策略
- main:生产分支
- develop:开发分支
- feature/*:功能分支
- hotfix/*:紧急修复
个人偏好放在用户级
团队共享的 CLAUDE.md 不应该包含个人偏好。个人偏好放在 ~/.claude/CLAUDE.md:
# 我的偏好
- 我习惯用 Vim 键位
- 代码注释用中文
- 喜欢函数式编程风格
常见误区
误区 1:“写得越详细越好”
CLAUDE.md 不是文档,是”记忆”。记忆应该是精炼的、关键的信息。一份 50 行的 CLAUDE.md 比 500 行的更有效。
误区 2:“写一次就不管了”
项目在演进,CLAUDE.md 也需要跟着演进。过时的信息比没有信息更糟糕——它会误导 Claude Code。
误区 3:“只写技术信息”
业务上下文同样重要。告诉 Claude Code “这是一个面向初学者的教育平台”,它生成的代码会更注重可读性和注释。
误区 4:“把所有文档都放进去”
CLAUDE.md 应该是索引,不是百科全书。指向详细文档的路径比复制内容更好:
## 参考文档
- API 设计规范:`docs/api-design.md`
- 数据库 Schema:`docs/database.md`
- 部署流程:`docs/deployment.md`
CLAUDE.md 是你和 AI 之间的契约。写好它,Claude Code 就不再是一个”什么都不知道的新人”,而是一个”读过项目文档的老手”。花 10 分钟写好 CLAUDE.md,能为你节省数小时的重复解释。
相关文章
评论
加载中...
评论
加载中...