
一个真实故事
去年10月,我手里有个React项目要重构,2000多行的上帝类,看着就头疼。每次让Claude Code帮我优化代码,我都要重复交代一遍:
- "记得用TypeScript严格模式"
- "API调用要加错误处理"
- "组件要符合单一职责原则"
复制粘贴这些要求,少说也得两三分钟。更烦的是,聊了十几轮之后,Claude Code经常会"忘记"我最初的要求,又开始写出不符合规范的代码。
直到我在文档里翻到了Skill功能。
试了一周后,我把那些重复的要求全封装成了几个skill文件。现在只要一句@skill react-refactor,Claude Code立刻就知道该怎么做。那个2000行的类,原本估计要花三天时间重构,最后两个下午就搞定了。
Skill到底是什么
说白了,Skill就是给Claude Code装技能包。
你在.claude/skills/目录下创建一个markdown文件,把常用的提示词、工作流程、代码规范写进去。需要的时候,一句@skill 技能名就能调用。就像游戏里给角色装备不同技能,需要输出的时候装输出技能,需要坦克的时候装防御技能。
来看个最简单的例子:
markdown
---
title: "React代码审查专家"
description: "专门审查React代码的质量、性能和最佳实践"
---
# React代码审查流程
你是一位经验丰富的React代码审查专家。请按以下标准审查代码:
## 审查重点
1. **组件设计**
- 单一职责原则
- Props类型定义的完整性
- 组件拆分的合理性
2. **性能优化**
- 不必要的重渲染
- useMemo/useCallback的使用
- 列表渲染的key值
3. **代码质量**
- TypeScript类型安全
- 错误边界处理
- 可访问性(a11y)
## 输出格式
- 问题列表(按严重程度排序)
- 具体的代码建议
- 优先级标注(P0/P1/P2)
把这个文件保存为.claude/skills/react-review.md,以后审查React代码时,直接@skill react-review就行。Claude Code会严格按照你定义的标准来审查。
为什么手写提示词撑不住了
我之前也是提示词工程师,Notion里存了几十条精心打磨的提示词模板。但用了几个月后,发现这玩法有硬伤:
重复劳动太多 每次都要从Notion复制粘贴,有时候还要根据当前项目调整几个词。一天下来光是复制粘贴提示词,就要花半小时。
版本管理混乱 今天用的提示词和上周的不一样,效果也不稳定。想回溯"上次那个好用的版本"?抱歉,找不到了。
团队协作是灾难 我的好提示词,同事想用?手动发微信。同事改进了?又要手动同步回来。这效率跟石器时代没区别。
AI会遗忘 长对话里,Claude Code很容易忘记你最初的要求。聊到第20轮,你发现它又在犯之前说过不要犯的错误。
Skill把这些问题一次性解决了:
- 版本化:用Git管理,回溯随便
- 可共享:团队仓库一拉,所有人同步
- 始终生效:不会因为对话太长而失效
我的第一个Skill:API接口生成器
那个电商项目里,后端给我扔了个100多个接口的Swagger文档。手动对接的话,一个接口要写:
- TypeScript类型定义
- axios请求函数
- 错误处理逻辑
- loading状态管理
算了一下,100个接口差不多要30个小时。
我花了1个小时,写了个api-generator的skill:
markdown
---
title: "API接口代码生成器"
description: "根据接口文档生成TS类型定义和axios封装"
version: "1.3.0"
---
# API代码生成专家
你是一位全栈工程师,擅长前后端接口对接。你的任务是根据API文档生成高质量的TypeScript代码。
## 生成内容
### 1. TypeScript类型定义
```typescript
// 请求参数类型
interface GetUserRequest {
userId: string;
includeDetails?: boolean;
}
// 响应数据类型
interface GetUserResponse {
id: string;
name: string;
email: string;
createdAt: string;
}
2. Axios请求函数
typescript
import request from '@/utils/request';
export const getUserAPI = async (
params: GetUserRequest
): Promise<GetUserResponse> => {
try {
const response = await request.get<GetUserResponse>('/api/user', { params });
return response.data;
} catch (error) {
console.error('获取用户信息失败:', error);
throw error;
}
};
3. React Hook封装(可选)
typescript
export const useGetUser = (userId: string) => {
const [data, setData] = useState<GetUserResponse | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
const fetchData = async () => {
setLoading(true);
try {
const result = await getUserAPI({ userId });
setData(result);
} catch (err) {
setError(err as Error);
} finally {
setLoading(false);
}
};
fetchData();
}, [userId]);
return { data, loading, error };
};
代码规范
- 命名遵循驼峰命名法
- API函数以
API结尾 - Hook函数以
use开头 - 所有异步函数都要有错误处理
- 导出的类型和函数都要加JSDoc注释
输出格式
- 先输出类型定义
- 再输出API函数
- 如果是常用接口,再生成Hook封装
- 最后给出使用示例
python
有了这个skill,对接一个接口从30分钟缩短到了5分钟。100个接口,前后只花了两天时间就全部搞定。更关键的是,团队里的新人也能用同样的规范生成代码,整个项目的代码风格高度统一。
## 高级玩法:让Skill配合起来干活
用熟了之后,我发现单个skill还不够。真实的开发场景往往需要多个skill配合。
比如我重构老代码时的标准流程:
```bash
# 第1步:分析代码问题
@skill code-analyzer src/legacy/UserService.ts
# 第2步:制定重构方案
@skill refactor-planner
# 第3步:生成测试用例(重构前必须有测试保底)
@skill test-generator
# 第4步:执行重构
(手动重构或让Claude Code辅助)
# 第5步:最终代码审查
@skill code-reviewer
这四个skill依次调用,形成了完整的重构工作流。我甚至写了个shell脚本自动执行这个流程:
bash
#!/bin/bash
# refactor-workflow.sh
echo "🔍 步骤1/4: 分析代码问题..."
claude-code @skill code-analyzer $1
read -p "按回车继续..."
echo "📋 步骤2/4: 制定重构方案..."
claude-code @skill refactor-planner
read -p "按回车继续..."
echo "🧪 步骤3/4: 生成测试用例..."
claude-code @skill test-generator
read -p "执行测试并确认通过后,按回车继续..."
echo "✅ 步骤4/4: 最终代码审查..."
claude-code @skill code-reviewer
用这个脚本重构过一个2000行的上帝类,拆成了7个职责清晰的小类。测试覆盖率从40%提升到85%,整个过程比想象中顺利很多。
团队共享:把Skill当作基础设施
我们团队现在把skill当作基础设施来管理。创建了一个Git仓库专门存放team-skills:
bash
team-skills/
├── frontend/
│ ├── react-review.md # React代码审查
│ ├── vue-component-gen.md # Vue组件生成
│ └── css-optimizer.md # CSS性能优化
├── backend/
│ ├── api-design.md # API设计规范
│ ├── database-review.md # 数据库审查
│ └── security-audit.md # 安全审计
└── common/
├── code-cleaner.md # 代码清理
├── test-generator.md # 测试生成
└── commit-msg.md # Git提交信息生成
每个开发者在本地项目里软链接到这个仓库:
bash
# 一次性配置
git clone git@github.com:your-team/team-skills.git ~/.team-skills
ln -s ~/.team-skills/* .claude/skills/
好处立竿见影:
- 新人友好:入职第一天就有完整的skill库,立刻就能按规范写代码
- 自动同步:团队更新skill后,所有人git pull就能获取最新版本
- 代码一致:不管谁写的代码,风格都高度统一
上个月来了个实习生,第二天就能写出符合团队规范的代码。要在以前,至少得培训一周。
Skill和CLAUDE.md是黄金搭档
Skill更强大的玩法,是配合项目根目录的CLAUDE.md一起用。
在CLAUDE.md里定义项目全局规则:
markdown
# 项目上下文
- 技术栈:React 18 + TypeScript 5.0 + Vite 4
- 代码规范:Airbnb ESLint规则
- 提交规范:Conventional Commits
- 状态管理:Zustand(禁止使用Redux)
## 重要约定
- 所有组件必须有完整的TypeScript类型定义
- API调用统一使用 src/utils/request.ts 封装
- 组件文件名使用PascalCase(如UserProfile.tsx)
- 工具函数文件名使用camelCase(如formatDate.ts)
## 目录结构
src/
├── components/ # 公共组件
├── pages/ # 页面组件
├── hooks/ # 自定义Hooks
├── utils/ # 工具函数
├── services/ # API服务
└── stores/ # Zustand状态管理
然后在skill里引用这些规则:
markdown
---
title: "React组件生成器"
---
# 组件生成指令
严格按照CLAUDE.md中定义的技术栈、目录结构和命名规范生成React组件。
生成的组件必须:
- 使用TypeScript
- 符合项目的ESLint规则
- 放在正确的目录下
- 使用项目约定的状态管理方案
这样skill会自动读取CLAUDE.md的配置,生成的代码完全符合项目规范。新项目克隆下来,skill也能立刻适配。
我的5个必备Skill
用了半年,我的skills目录里积累了20多个skill。挑几个最常用的分享一下:
1. 测试用例生成器(test-gen.md)
写完功能代码后最烦的就是补测试。这个skill能分析函数逻辑,自动生成单元测试,包括边界情况和异常场景。
效果:我的测试覆盖率从40%提升到85%,节省了至少一半的测试编写时间。
2. Git提交信息生成器(commit-msg.md)
每次提交都要想commit message,挺浪费脑细胞的。这个skill分析git diff内容,自动生成符合Conventional Commits规范的提交信息。
示例输出:
diff
feat(user-auth): 添加OAuth2.0登录功能
- 集成Google和GitHub第三方登录
- 添加JWT token刷新机制
- 完善用户权限校验中间件
Closes #123
虽然只有30行代码,但这是我每天都要用的skill。累计节省的时间已经好几个小时了。
3. 代码重构助手(refactor.md)
老代码需要优化但不知从何下手时,这个skill能:
- 识别代码坏味道
- 给出重构优先级排序
- 提供step-by-step重构计划
- 保证重构前后功能一致
那个2000行的上帝类就是靠这个skill搞定的。
4. 安全审查专家(security-audit.md)
专门检查代码安全问题:
- SQL注入风险
- XSS攻击防护
- 敏感信息泄露
- 权限校验完整性
有次准备上线前用这个skill扫了一遍,发现3个潜在的安全漏洞,吓出一身冷汗。
5. 文档生成器(doc-gen.md)
项目文档总是滞后于代码?这个skill能根据代码自动生成API文档,提取函数注释生成Markdown,还能维护更新日志。
文档更新时间从2小时缩短到10分钟,而且再也不会出现"代码改了文档没改"的情况。
写好Skill的5个技巧
半年下来,我总结了几个编写skill的经验:
1. Frontmatter要认真写
虽然看起来可有可无,但title和description会显示在skill列表里:
markdown
---
title: "全栈代码审查专家"
description: "审查前后端代码,关注安全性、性能和可维护性"
version: "2.1.0"
tags: ["代码审查", "安全", "性能"]
---
version字段方便版本管理,tags方便分类查找。
2. 角色定义要清晰
"你是一位...专家"这种开头很有用,能让Claude Code快速进入角色:
markdown
你是一位拥有10年经验的全栈工程师,擅长代码审查和安全审计。
比直接说"请审查代码"效果好很多。
3. 用对比示例说明
用✅和❌对比好坏代码,Claude Code理解起来更准确:
markdown
### SQL注入风险
❌ 危险写法:
```javascript
const query = `SELECT * FROM users WHERE id = ${userId}`;
✅ 安全写法:
javascript
const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [userId]);
shell
### 4. 输出格式要具体
别说"请给出建议",要说"按以下格式输出":
```markdown
## 输出格式
### 🔴 严重问题(必须修复)
- [文件名:行号] 问题描述
- 风险说明
- 修复建议(附代码示例)
### 🟡 建议改进(推荐优化)
- [文件名:行号] 问题描述
- 改进理由
- 优化方案
5. 加上错误处理规则
告诉AI遇到问题怎么办:
markdown
## 错误处理
如果遇到以下情况:
- 代码语法错误:先指出错误位置,不继续审查
- 文件无法访问:提示用户检查路径
- 代码量过大(>5000行):建议分批审查
常见问题
Skill太多记不住名字?
用好命名规范:
review-*: 代码审查类gen-*: 代码生成类util-*: 工具类fix-*: 问题修复类
我的命名:review-frontend.md、gen-api.md、util-commit.md
Skill输出太长看不完?
在skill里加上简洁模式:
markdown
默认使用详细模式。如果用户添加`--brief`参数,输出简洁版:
- 问题清单(一行一个)
- 严重程度标注
- 关键修复建议
Skill在不同项目中表现不一致?
让skill主动请求上下文:
markdown
## 分析前置步骤
开始前请先:
1. 读取package.json了解依赖版本
2. 检查tsconfig.json了解TS配置
3. 查看.eslintrc了解代码规范
4. 浏览README.md了解项目架构
最后说两句
用了半年的skill功能,我的开发效率至少提升了40%。更重要的是,很多重复性的脑力劳动被解放出来了,我可以把时间花在真正需要思考的架构设计和业务逻辑上。
如果你现在还在手写提示词,建议你:
- 今天就开始:从一个简单的skill开始,比如代码审查或测试生成
- 逐步完善:每次用完后反思哪里可以改进,更新版本
- 团队共享:好的skill就像好的工具库,要分享出去
- 持续学习:关注官方文档更新,新功能可能会改变写法
最后分享一个心得:Skill的价值不在于有多复杂,而在于解决真实问题。我那个最简单的commit-msg生成器只有30行,但每天都在用,累计节省的时间已经好几个小时了。
从现在开始,试着把你每天重复输入的提示词整理成skill吧。三个月后,你会感谢今天的自己。
相关资源
本文首发自个人博客