WEB项目地址:AI智能商品导购系统
安卓APP下载地址:精打细算
你有没有遇到过这种情况:让 AI 帮你写代码,结果它用了你从来不用的技术栈;让它处理一个文件,它顺手改了其他不该动的地方;明明团队约定用单引号,它老给你输出双引号……
折腾半天,改来改去,比你自己写还累。
这其实不是 AI 笨,是你没告诉它“规矩”。就像来了个新同事,你不给他讲项目规范,他肯定按自己习惯来。
今天要说的 CLAUDE.md 就是干这个用的——写一个文件,让 AI 进门就懂你的规矩。全程手把手,跟着做就行。
① 为什么需要项目规则文件
先说痛点。你用 AI 写代码,最怕什么?
- 风格不一致:有的文件缩进 2 格,有的 4 格,有的用 tab,看得脑仁疼
- 技术栈乱入:你明明用 Vue,它建议你装 React 组件
- 越界操作:让它改一个函数,它顺手帮你重命名了文件夹
- 重复踩坑:上次修复过的 bug,换个对话又犯
CLAUDE.md 就是解决这些问题的。它不是给程序员看的文档,是给 AI 读的“员工手册”。你把技术栈、代码风格、文件边界、禁止事项全写进去,AI 每次干活前先读一遍,之后的行为就规规矩矩。
核心价值就三条:
- 一致性:AI 输出跟你手写的一模一样
- 安全性:明确告诉它哪些不能碰
- 省时间:不用每次都重复交代“用 TypeScript 啊”“别动配置文件”
② 命名与存放位置
文件名
就用 CLAUDE.md,大小写别搞错。别的名字 AI 不认,别自作聪明改成 PROJECT_RULES.md。
放哪
项目根目录,和 package.json、README.md 平级。
你的项目/
├── CLAUDE.md ← 放这
├── src/
├── tests/
└── package.json
如果你项目比较大,分了多个子模块,也可以在子目录里放额外的 CLAUDE.md——后面会讲多文件怎么玩。
一个例外
有些团队会用 .claude/CLAUDE.md(放一个隐藏文件夹里)。也行,但新手不推荐,容易找不到。先老老实实放根目录。
③ 写一个最小可用的结构
别想得太复杂。第一版能跑通就行,后面慢慢加。
最简单的 CLAUDE.md 长这样:
# 项目:我的博客系统
## 技术栈
- 前端:React 18 + TypeScript
- 状态:Zustand
- 样式:TailwindCSS
- 后端:Node.js + Express
- 数据库:PostgreSQL
## 代码风格
- 缩进:2 空格
- 字符串:双引号
- 分号:必须加
## 禁止事项
- 不要改动 `.env` 文件
- 不要直接修改 `node_modules`
- 不要自动安装新依赖
就这几行,AI 就不会给你乱推 Vue 了。你可以把它复制过去,改改技术栈就能用。
④ 定义技术栈和代码风格(含写法)
新手最容易漏的就是“写清楚版本号”。光写“React”不够,得写“React 18.2 + TypeScript 5.0”,不然 AI 可能用旧版语法。
技术栈的标准写法
## 技术栈(必读)
### 前端
- 框架:Next.js 14 (App Router)
- 语言:TypeScript 5.x(严格模式,禁用 any)
- UI 库:shadcn/ui
- 样式:CSS Modules(不是 Tailwind)
### 后端
- 运行时:Node.js 20 LTS
- 框架:NestJS 10
- ORM:Prisma 5.x
### 测试
- 单元测试:Vitest
- E2E 测试:Playwright
为什么写这么细?因为 Next.js 有 Pages Router 和 App Router 两套写法,不指明的话 AI 混着写,你改都改不过来。
代码风格怎么描述
不要只说“保持整洁”,AI 不懂什么叫整洁。要写死规则:
## 代码风格(强制执行)
### 命名
- 组件:PascalCase(`UserProfile.tsx`)
- 函数/变量:camelCase(`getUserInfo`)
- 常量:SCREAMING_SNAKE_CASE(`MAX_RETRY_COUNT`)
- 文件夹:kebab-case(`user-profile/`)
### 格式
- 缩进:2 空格(不要 tab)
- 行宽:100 字符(超了就换行)
- 引号:单引号(JS/TS 里用 `'`,JSON 里用 `"`)
- 分号:必须加
- 尾随逗号:多行对象/数组必须加
### 导入顺序(按这个排)
1. 内置模块(`fs`, `path`)
2. 第三方库(`react`, `lodash`)
3. 项目内别名(`@/`)
4. 相对路径(`./`)
有个小技巧:把你团队已有的 ESLint/Prettier 配置贴进去,AI 会自动遵守。比如:
## 代码规范参照
本项目使用以下配置,生成代码请遵守:
- ESLint: `.eslintrc.js`(见文件末尾的配置摘要)
- Prettier: `.prettierrc`(单引号、无尾随逗号、120 字符)
⑤ 设定工作流约束和禁止行为
这是 AI 最容易闯祸的地方。你得把它当“实习生”管——明确什么不能碰。
禁止行为清单
用“不要”“禁止”“避免”这种强否定词,比“建议不”管用得多。
## 绝对禁止(碰到就拒绝)
❌ 不要修改以下文件:
- `.env` / `.env.local`(环境变量)
- `package-lock.json` / `yarn.lock`(锁文件)
- `node_modules/` 整个目录
- 任何以 `.secret.` 结尾的文件
❌ 不要做的事:
- 自动运行 `npm install` / `yarn add`
- 删除 `tests/` 以外的任何文件夹
- 修改数据库迁移文件(`migrations/`)
- 提交代码到 git(由开发者手动操作)
## 需确认才能做(先问)
⚠️ 如果遇到以下情况,先问我:
- 需要安装新依赖包
- 要删除超过 10 行的代码
- 需要改动 `tsconfig.json` 或 `vite.config.ts`
- 不确定某个 API 是否废弃
工作流约束
比如你在一个 Next.js 项目里,App Router 下页面用 app/ 文件夹,但老代码还有 pages/。你可以规定:
## 工作流规则
1. **新增页面**:一律放在 `app/` 下,使用 `page.tsx` 命名
2. **API 路由**:放在 `app/api/`,不要再用 `pages/api/`
3. **组件复用**:优先用 `@/components/ui/` 里的,没有再自己写
4. **状态管理**:局部用 useState,全局用 Zustand,不用 Redux
⑥ 用示例代码强化理解
光说“写一个获取用户信息的函数”不够,AI 不知道你的错误处理偏好、返回值格式。给个例子,它就懂了。
## 代码示例(按这个风格来)
### 好的写法 ✅
typescript
async function fetchUser(userId: string): Promise {
try {
const response = await api.get(/users/${userId});
return response.data;
} catch (error) {
console.error(‘Failed to fetch user:’, error);
return null; // 失败返回 null,不抛异常
}
}
### 坏的写法 ❌
typescript
async function fetchUser(userId) { // 缺类型
const res = await fetch(‘/users/’ + userId); // 没用 api 实例
return res.json(); // 没处理错误
}
## 组件模板
新建页面组件时,套用这个模板:
tsx
export default function PageName() {
return (
{/* 你的内容 */}
);
}
```
注意:示例里的注释要写清楚“为什么好”“为什么坏”,AI 会记住这些原则。
## ⑦ 多文件协作时的优先级
大项目一个 `CLAUDE.md` 可能不够用,因为前端、后端、工具脚本的规则不一样。这时候可以用多级文件。
规则很简单:**子目录的规则覆盖父目录的**。
### 实际例子
项目/
├── CLAUDE.md # 全局规则(后端 + 前端通用)
├── frontend/
│ ├── CLAUDE.md # 前端专属(覆盖样式相关规则)
│ └── src/
└── backend/
└── CLAUDE.md # 后端专属(覆盖 API 相关规则)
**全局规则** (`/CLAUDE.md`):
markdown
- 技术栈:全栈项目,前端 React,后端 NestJS
- 缩进:2 空格
- 禁止:改数据库 schema
**前端规则** (`/frontend/CLAUDE.md`):
markdown
- 继承全局规则(缩进 2 空格保留)
- 覆盖:样式用 TailwindCSS(全局没定义样式方案)
- 新增:组件必须写单元测试
**后端规则** (`/backend/CLAUDE.md`):
markdown
- 继承全局规则
- 覆盖:允许改数据库 schema(只在 dev 环境)
- 新增:所有 API 需要 Swagger 注解
AI 在处理 `frontend/src/App.tsx` 时,会先读全局的,再读 `frontend/` 的,后者优先级更高。
### 优先级口诀
> 叶子目录 > 上级目录 > 根目录
别把同一个规则在不同文件里写成相反的值,AI 会混乱。
## ⑧ 快速验证规则是否生效
写了半天规则,怎么知道 AI 真读了?有两种土办法。
### 方法一:问它
直接在聊天里问:
> “根据项目规则,我的代码应该用单引号还是双引号?”
如果它答“单引号”,说明读对了。如果答“都可以”,那它可能没加载上你的 `CLAUDE.md`。
### 方法二:写一个测试请求
故意让它写一段违反规则的代码,看它会不会自己纠正。
比如你的规则写“不能用 `var`,只能用 `const/let`”,你问:
> “写一个循环,从 1 到 10 求和”
如果它给出:
javascript
let sum = 0;
for (let i = 1; i <= 10; i++) {
sum += i;
}
那就对了。如果它写 `var sum = 0;`,说明规则没生效。
### 常见不生效的原因
- 文件名写错了(大小写,下划线等)
- 放错了目录(要放根目录或正在操作的子目录)
- 没保存文件(有时候你改了但 IDE 没自动保存)
- 对话上下文已满(开新对话试试)
## ⑨ 常见配置错误与修正
新手容易踩的坑,我列几个高频的。
### 坑1:规则写得太“虚”
markdown
- 代码要整洁
- 性能要好
- 注释要清楚
没用。AI 不知道什么叫“整洁”。改成具体可执行的:
markdown
- 每个函数不超过 30 行
- 循环里避免频繁创建新对象
- 每个文件顶部写一段注释说明用途
### 坑2:规则之间矛盾
markdown
- 字符串用双引号
- JSON 文件用单引号 ← 矛盾了(JSON 标准是双引号)
AI 会卡住。建议统一成“所有地方都用双引号,除了 JSON 里不用纠结”。
### 坑3:忘了更新规则
项目升级了,从 Vue 2 换到 Vue 3,但规则文件还写“Vue 2 Options API”,AI 给你的代码全是旧写法。
**修正方案**:每次技术栈大改,顺手改一下 `CLAUDE.md`,花不了两分钟。
### 坑4:规则太长
有些人写几千行的规则,AI 读着读着就忘了前半部分。
建议把最重要的 20 条写在前面,加个“核心规则(必读)”的标题。次要的放后面,或者拆到子目录的 `CLAUDE.md` 里。
## ⑩ 进阶技巧:动态调整与团队共享
用顺手之后,可以玩点高级的。
### 技巧1:动态规则(按场景切换)
你可以在不同分支用不同规则。比如 `feature-xx` 分支要实验新架构,就在分支里临时改 `CLAUDE.md`,合并回主分支时删掉。
更优雅的做法:用 Git hooks,在切换分支时自动替换规则文件。
### 技巧2:团队共享
把 `CLAUDE.md` 提交到 Git 仓库里,所有人共享一套规则。新人 clone 项目后,AI 自动遵守团队规范。
但注意:有些个人偏好(比如有人喜欢用 tab 缩进,有人喜欢空格)不适合放全局。可以每个人自己维护一个 `CLAUDE.local.md`(我在规则里写“优先读 `CLAUDE.local.md`,如果没有再读 `CLAUDE.md`”)。不过这个需要配合脚本,不是原生支持的。
### 技巧3:集成 CI 检查
你可以写个简单的脚本,在 PR 时检查 AI 生成的代码是否符合 `CLAUDE.md` 里的规则。比如用正则匹配一下有没有出现 `var`、双引号等。不符合的就拦截。
这只是个思路,真要做的话,可以用 `grep` 或写个 Node 脚本。
### 技巧4:规则模板化
把你常用的规则存成模板,新项目直接复制过去改改就行。我自己的模板长这样:
markdown
项目:[项目名]
技术栈(替换成你的)
- 语言:TypeScript
- 框架:Next.js (App Router)
- UI:shadcn/ui + TailwindCSS
核心规则(前 10 条)
- 函数必须有返回值类型注解
- 禁止使用
any - 所有异步操作要 try-catch
- 组件文件必须是
export default - 工具函数用
export const - 测试覆盖率 > 80%
- 提交前跑一遍 lint
- 注释用英文(代码用中文也行)
- 时间处理一律用 dayjs
- 请求用项目内的
request实例,不要裸写 fetch
(下面继续加项目特有规则)
## 收个尾
写 `CLAUDE.md` 就像给你的 AI 助手发一本员工手册。花 10 分钟写个初版,能省下以后无数次的“不是,你搞错了,我是要……”这种废话。
别追求完美,从今天开始,在你的项目根目录建一个 `CLAUDE.md`,把今天用到的技术栈和一条你最在意的规则写进去。比如:
markdown
我的项目
- 技术栈:React + Vite + TypeScript
- 最重要:不要用
any,永远不要
“`
试试看,然后问 AI 一个代码问题,你会回来感谢我的。