写在前面
作为高级开发者,我们不仅要会写代码,更要学会自动化!这一期我们将讲解如何使用 Claude Code 2.1.79 实现开发工作流自动化,从重复性任务中解放双手,大幅提升开发效率。
🎯 一、什么是工作流自动化?
工作流的定义
工作流 = 一系列重复性的开发任务,按特定顺序执行
例如:
- 代码编写 → 测试 → 部署
- 代码审查 → 合并 → 发布
- 数据处理 → 分析 → 报告
为什么需要工作流自动化?
作为开发者,我们每天都在重复做很多事情:
日常重复任务示例:
- 每天早上拉取最新代码
- 每次提交前运行格式化
- 代码审查时检查相同的问题
- 发布时执行固定的步骤
手动处理的典型问题:
- 时间浪费 - 每次重复操作都要花时间
- 人为错误 - 容易遗漏步骤或操作失误
- 不一致性 - 不同人处理方式不同
- 上下文切换 - 打断心流,影响效率
自动化的价值
| 任务类型 | 手动耗时 | 自动化耗时 | 节省时间 | 年节省(按每天1次算) |
|---|---|---|---|---|
| 代码格式化 | 5 分钟/次 | 1 秒 | 99% | ~30 小时 |
| 运行测试 | 3 分钟/次 | 10 秒 | 95% | ~18 小时 |
| 部署上线 | 10 分钟/次 | 30 秒 | 95% | ~60 小时 |
| 生成文档 | 30 分钟/次 | 1 分钟 | 97% | ~180 小时 |
一个小提示
自动化不仅仅是节省时间,更重要的是保证一致性和减少人为错误。想象一下手动部署时漏掉一个步骤的后果!
自动化适用场景判断
适合自动化的任务:
- 重复执行超过 3 次以上的任务
- 有明确规则的任务
- 步骤固定的任务
- 容易出错的任务
不适合自动化的任务:
- 一次性的任务
- 需要大量主观判断的任务
- 经常变化的流程
- 调试和探索性工作
🚀 二、快速任务自动化
本节内容
本节展示一些最常用的快速自动化任务,这些是开发者日常使用频率最高的场景。
1️⃣ 批量代码格式化
场景: 项目中有几十个文件需要统一格式,手动一个个格式化太麻烦。
案例一:JavaScript/TypeScript 项目
$ claude "格式化项目中所有的 JavaScript 文件"
🤖 正在分析项目结构...
✅ 已格式化:
- src/app.js
- src/utils/helpers.js
- src/components/Button.jsx
- src/pages/Home.jsx
- src/services/api.js
- src/config/index.js
- ...
共计:42 个文件
⏱️ 耗时:3.2 秒
案例二:Python 项目
$ claude "格式化项目中所有的 Python 文件,使用 black 和 isort"
✅ 已格式化:
- src/models/user.py
- src/views/auth.py
- src/utils/helpers.py
- tests/test_api.py
- ...
共计:28 个文件
应用了 black + isort 规范
案例三:多种语言混合项目
$ claude "格式化整个项目,按语言分别使用适当的工具"
✅ 格式化结果:
- TypeScript/JavaScript: 45 个文件 (Prettier)
- Python: 23 个文件 (black + isort)
- Go: 12 个文件 (gofmt)
- Rust: 8 个文件 (rustfmt)
- CSS/SCSS: 15 个文件 (stylelint)
共计:103 个文件
2️⃣ 批量添加注释
场景: 接手了一个没有注释的老项目,需要快速添加文档。
案例一:JSDoc 注释批量添加
$ claude "为 src/utils 目录下的所有函数添加 JSDoc 注释"
🤖 正在分析 15 个文件...
✅ 已添加注释:
- string-utils.js (5 个函数)
- capitalize() - 首字母大写
- truncate() - 截断字符串
- slugify() - URL 友好化
- template() - 模板替换
- escapeHtml() - HTML 转义
- date-utils.js (8 个函数)
- formatDate() - 日期格式化
- parseDate() - 日期解析
- getRelativeTime() - 相对时间
- ...
- validation.js (6 个函数)
- isEmail() - 邮箱验证
- isUrl() - URL 验证
- ...
总计:19 个函数添加了完整的 JSDoc 注释
案例二:Python docstring 批量添加
$ claude "为 src/api 目录下的所有函数添加 Google 风格的 docstring"
✅ 已添加 docstring:
- views.py (12 个函数)
- models.py (8 个函数)
- utils.py (6 个函数)
总计:26 个函数添加了完整的 docstring
3️⃣ 批量重命名
场景: 项目从 JavaScript 迁移到 TypeScript,需要重命名文件。
案例一:文件扩展名批量修改
$ claude "把所有组件的 .js 文件改成 .tsx"
🤖 找到 23 个组件文件...
✅ 已重命名 23 个文件
✅ 自动更新了 47 个文件中的导入语句
示例:
- Button.js → Button.tsx
- Modal.js → Modal.tsx
- Dropdown.js → Dropdown.tsx
案例二:目录结构重组
$ claude "把 src/components/common 下的组件移动到 src/ui,并更新所有导入"
✅ 已重组:
- 移动了 15 个文件
- 更新了 32 个导入路径
- 保持了组件的导出导出关系
案例三:命名规范化
$ claude "把所有组件文件名改成 PascalCase(如 button-group.js 改为 ButtonGroup.js)"
✅ 已重命名:
- button-group.js → ButtonGroup.js
- scroll-container.js → ScrollContainer.js
- input-field.js → InputField.js
共计:18 个文件
自动更新了相关导入
4️⃣ 批量替换和修改
案例一:API 端点迁移
$ claude "把项目中所有 /api/v1 开头的 API 调用改成 /api/v2"
🔍 扫描结果:
- 找到 45 处 API 调用
- 涉及 12 个文件
✅ 已更新:
- api/client.ts
- services/user.ts
- services/product.ts
- pages/dashboard.tsx
- ...
案例二:依赖版本升级
$ claude "把所有使用 lodash 的地方改用 lodash-es,并更新 import 语句"
✅ 已迁移:
- 替换了 156 处 _.xxx 到 xxx 的调用
- 更新了 23 个文件的 import 语句
- 建议:运行 npm install lodash-es
案例三:样式方案迁移
$ claude "把项目中所有的 inline style 改成使用 Tailwind CSS 类名"
🤖 分析了 234 个组件...
✅ 已转换:
- 转换了 156 个组件的内联样式
- 生成了对应的 Tailwind 类名
- 保留了 23 个无法转换的特殊样式(动画等)
批量修改的风险
批量修改前,建议让 Claude Code 先预览修改内容,确认无误后再执行。
📦 三、常见开发流程自动化
本节内容
展示实际开发中最常用的三个完整工作流,每个都包含详细的执行步骤和真实案例。
流程一:新功能开发
适用场景: 从零开始开发一个完整的功能模块,包括代码、测试、文档。
典型案例:用户个人资料模块
# 一个命令完成以下所有步骤
$ claude "帮我完成一个新功能的开发:
1. 创建功能分支
2. 生成组件代码
3. 添加单元测试
4. 提交代码"
🤖 正在执行工作流...
📋 步骤 1/4:创建功能分支
✅ 已创建分支:feature/user-profile
✅ 切换到新分支
📋 步骤 2/4:生成组件代码
✅ 已生成文件:
- src/features/user-profile/components/UserProfile.tsx
- src/features/user-profile/components/UserProfileForm.tsx
- src/features/user-profile/components/AvatarUploader.tsx
- src/features/user-profile/hooks/useUserProfile.ts
- src/features/user-profile/api/userProfile.ts
- src/features/user-profile/index.ts
📋 步骤 3/4:添加单元测试
✅ 已生成测试文件:
- src/features/user-profile/components/UserProfile.test.tsx
- src/features/user-profile/components/UserProfileForm.test.tsx
- src/features/user-profile/hooks/useUserProfile.test.ts
测试覆盖:
- 用户资料渲染 ✓
- 表单验证 ✓
- 数据提交 ✓
- 错误处理 ✓
📋 步骤 4/4:提交代码
✅ 已提交到 Git
Commit: feat(user-profile): 添加用户个人资料功能
✅ 执行结果:
- ✅ 创建分支:feature/user-profile
- ✅ 生成代码:6 个文件
- ✅ 生成测试:3 个测试文件
- ✅ 提交到 Git
⏱️ 总耗时:45 秒
进阶用法:指定技术栈
$ claude "开发一个电商产品列表功能:
- 使用 React Query 管理数据
- 使用 zustand 管理筛选状态
- 包含分页和搜索
- 写完整的测试"
✅ 已按要求实现:
- React Query 数据获取
- Zustand 状态管理
- 完整的测试覆盖
流程二:代码审查
适用场景: 提交代码前的自我审查,或者审查同事的代码。
典型案例:全面代码审查
$ claude --model opus-4-6 "审查 src/ 目录下的新代码"
🤖 Claude Code 正在执行代码审查...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 审查范围:src/ 目录
📊 代码行数:2,345 行
🔍 审查时间:约 15 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🤖 审查结果:
📝 代码规范:
✅ 命名规范 - 所有变量和函数命名清晰
✅ 代码注释 - 核心逻辑都有注释
⚠️ 建议:API 路由缺少 JSDoc 文档
✅ 代码结构 - 文件组织合理
🔒 安全检查:
✅ 无敏感信息泄露
✅ 无硬编码的 API 密钥
✅ 无 XSS 风险 - 已使用 safeRender
✅ 无 SQL 注入风险 - 已使用参数化查询
⚡ 性能检查:
⚠️ 建议:UserList 组件中的 map 没有使用 useMemo
⚠️ 建议:API 请求可以考虑添加请求防抖
✅ 无内存泄漏 - 正确使用了 useEffect cleanup
✅ 无不必要的重渲染 - 合理使用了 React.memo
📊 测试覆盖:
✅ 核心函数有测试
⚠️ 建议:addToCart 边界情况测试不足
✅ 测试文件结构合理
🔧 可维护性:
✅ 单一职责 - 组件职责清晰
✅ 依赖注入 - 良好使用依赖注入
⚠️ 建议:可以将 someFunction 抽取为独立工具函数
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 总结:
✅ 通过项:17
⚠️ 建议项:5
❌ 问题项:0
建议优先处理:
1. 为 API 路由添加 JSDoc
2. 为 UserList 添加 useMemo
3. 完善 addToCart 边界测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
代码审查进阶:带修复建议
$ claude "审查 src/components 目录的代码,如果有问题直接修复"
🤖 审查中发现 3 个问题,已自动修复:
1. ⚠️ Button 组件缺少 prop types 定义
→ 已添加 ButtonProps 接口
2. ⚠️ useEffect 缺少依赖数组检查
→ 已添加正确的依赖数组
3. ⚠️ 存在 console.log 调试代码
→ 已删除所有 console.log
✅ 修复完成
流程三:版本发布
适用场景: 定期发布新版本,包含版本升级、构建、部署。
典型案例:完整发布流程
$ claude "发布新版本:
1. 升级版本号(从 1.1.0 到 1.2.0)
2. 生成更新日志
3. 创建 Git tag
4. 构建生产版本
5. 部署到测试环境"
🤖 正在执行发布流程...
📋 步骤 1/5:升级版本号
✅ 版本从 1.1.0 升级到 1.2.0
✅ 已更新:
- package.json: 1.1.0 → 1.2.0
- CHANGELOG.md: 添加 v1.2.0 记录
- version.ts: 更新版本常量
📋 步骤 2/5:生成更新日志
✅ 已生成 CHANGELOG.md 更新:
## [1.2.0] - 2026-03-23
### ✨ 新功能
- 用户个人资料编辑功能
- 头像上传功能
- 支持第三方登录
### 🐛 Bug 修复
- 修复购物车数量计算错误
- 修复页面加载闪烁问题
### ⚡ 性能优化
- 图片懒加载优化
- API 响应缓存优化
### 🔧 其他
- 升级到 Node.js 20
- 添加更多单元测试
📋 步骤 3/5:创建 Git tag
✅ 已创建 tag:v1.2.0
✅ 推送 tag 到远程仓库
📋 步骤 4/5:构建生产版本
✅ 构建完成:
- 产物大小:2.3 MB (压缩后 680 KB)
- Source map:已生成
- 静态资源:已优化
📋 步骤 5/5:部署到测试环境
✅ 部署成功:
- 环境:staging
- URL:https://staging.example.com
- 耗时:32 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 版本发布完成:
- 版本:v1.2.0
- 更新日志:已生成 CHANGELOG.md
- 构建产物:dist/
- 测试环境:已部署
- 耗时:1 分 23 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
发布前的检查
在正式发布前,可以先让 Claude Code 执行一次试发布,验证所有步骤都正常工作。
🔧 四、常用自动化模板
本节内容
整理了开发者日常最高频使用的三个自动化模板,每个都包含详细的使用场景和实际案例。
模板一:日常开发
使用场景: 每天上班后开始工作,或者完成一天的开发任务时使用。
案例一:早上开工
$ claude "今天的开发工作:
1. 查看未完成的任务
2. 继续开发用户详情页
3. 运行测试确保没有问题
4. 提交代码"
🤖 正在执行日常开发工作流...
📋 步骤 1/4:查看未完成的任务
✅ Git 状态:
- 当前分支:feature/user-profile
- 未提交更改:3 个文件
- 上次提交:2 小时前
待办事项:
[ ] 完成用户详情页的表单验证
[ ] 添加头像上传功能
[ ] 编写单元测试
📋 步骤 2/4:继续开发用户详情页
✅ 继续上次工作:
- 检测到上次编辑到一半的文件
- 正在完善表单验证功能
✅ 已完成:
- 添加了邮箱格式验证
- 添加了手机号格式验证
- 添加了必填字段检查
📋 步骤 3/4:运行测试确保没有问题
✅ 测试结果:
- ✓ 用户详情页测试通过
- ✓ 表单验证测试通过
- ✓ 头像上传测试通过
总计:42 个测试通过,0 个失败
📋 步骤 4/4:提交代码
✅ 已提交:
Commit: feat(user-profile): 添加表单验证功能
- 添加邮箱格式验证
- 添加手机号格式验证
- 添加必填字段检查
- 添加相关单元测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 今日工作完成:
- 用户详情页表单验证完成
- 所有测试通过 ✓
- 代码已提交 ✓
- 耗时:3 分 15 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
案例二:收尾工作
$ claude "下班前的收尾工作:
1. 检查今天的所有更改
2. 确保测试通过
3. 提交所有更改
4. 推送到远程仓库"
✅ 收尾完成:
- 检查了 8 个修改的文件
- 运行了完整测试套件,全部通过
- 提交了 3 个 commit
- 推送到远程仓库
模板二:代码维护
使用场景: 定期维护代码库,包括依赖更新、lint 修复、测试运行等。
案例一:周维护
$ claude "代码维护任务:
1. 检查并安装最新依赖
2. 修复所有 lint 警告
3. 运行完整测试
4. 更新相关文档"
🤖 正在执行代码维护...
📋 步骤 1/4:检查并安装最新依赖
🔍 检查依赖更新:
- react: 18.2.0 → 18.3.1 (安全更新)
- typescript: 5.0.4 → 5.4.5 (新特性)
- eslint: 8.45.0 → 8.57.0 (bug 修复)
✅ 已更新 8 个依赖包
⚠️ 注意:3 个包有 breaking changes,已自动处理
📋 步骤 2/4:修复所有 lint 警告
🔍 扫描结果:发现 23 个 lint 警告
- 15 个 import 顺序问题
- 5 个未使用的变量
- 3 个类型问题
✅ 已修复:
- 自动修复 20 个(import 顺序、unused 变量)
- 手动修复 3 个(添加类型注解)
📋 步骤 3/4:运行完整测试
✅ 测试结果:
- 单元测试:156 个通过
- 集成测试:23 个通过
- E2E 测试:12 个通过
总计:191 个测试通过 ✓
📋 步骤 4/4:更新相关文档
✅ 已更新:
- CHANGELOG.md:记录依赖更新
- README.md:更新了安装说明
- CONTRIBUTING.md:更新了代码规范
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 维护完成:
- 依赖已更新(8 个包)
- Lint 警告已修复(23 个)
- 全部测试通过 ✓
- 文档已同步更新 ✓
- 耗时:4 分 30 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
案例二:紧急修复
$ claude "紧急维护任务:
1. 快速定位并修复线上 bug
2. 添加回归测试
3. 部署到生产环境"
✅ 紧急修复完成:
- 问题根源:数据库连接池耗尽
- 修复方案:增加连接池超时时间
- 测试:添加了并发测试用例
- 部署:已部署到生产环境
模板三:Bug 修复
使用场景: 当发现 bug 需要系统性地修复时使用。
案例一:完整 bug 修复流程
$ claude "修复 bug:
1. 创建 bugfix 分支
2. 定位问题根源
3. 修复代码
4. 添加测试用例
5. 合并到主分支"
🤖 正在执行 Bug 修复流程...
📋 步骤 1/5:创建 bugfix 分支
✅ 已创建分支:bugfix/login-timeout
✅ 切换到新分支
📋 步骤 2/5:定位问题根源
🔍 问题描述:用户登录后偶尔出现超时错误
🔍 根因分析:
- 查看日志:发现大量 "Connection reset" 错误
- 分析代码:发现 token 刷新时存在竞态条件
- 定位问题:
1. 多个请求同时触发 token 刷新
2. 刷新失败后没有正确重试
3. 并发请求没有正确排队
✅ 问题根源定位完成:
- 主要原因:token 刷新的竞态条件
- 次要原因:缺少重试机制
📋 步骤 3/5:修复代码
✅ 已修复:
- src/utils/auth.ts
- 添加 token 刷新锁
- 添加失败重试逻辑
- 添加请求队列
- src/services/api.ts
- 集成刷新锁机制
- 添加超时处理
修复详情:
1. 添加单例模式的刷新锁
2. 添加指数退避重试(最多 3 次)
3. 添加请求队列管理
📋 步骤 4/5:添加测试用例
✅ 已添加测试:
- src/utils/auth.test.ts
- test('token refresh race condition')
- test('retry on refresh failure')
- test('request queue management')
- src/services/api.test.ts
- test('concurrent requests handling')
- test('timeout handling')
📋 步骤 5/5:合并到主分支
✅ 合并完成:
- bugfix/login-timeout → main
- 无冲突,直接合并
✅ Bug 修复完成:
- 问题根源:异步数据竞态 + 缺少重试
- 修复方案:添加状态锁 + 重试机制
- 测试:已添加 5 个覆盖用例
- 合并:已合并到 main 分支
- 耗时:8 分 20 秒
案例二:快速 hotfix
$ claude "紧急修复:首页加载白屏问题"
🔍 快速定位:
- 检查控制台错误
- 定位到 Image 组件的 src 为 undefined
✅ 已修复:
- 添加了图片加载失败的 fallback
- 添加了默认值处理
- 已部署到生产环境
Bug 修复建议
修复 bug 时,务必:
- 先写测试复现 bug
- 再修复代码
- 确保测试通过后再合并
🎯 五、特定场景自动化
本节内容
针对前端开发中最常见的三个特定场景,提供完整的自动化解决方案和详细案例。
场景一:React 项目初始化
使用场景: 从零开始创建一个新的 React 项目,需要配置各种工具和目录结构。
案例一:完整的 React 项目初始化
$ claude "创建一个 React 项目,包含:
- TypeScript 支持
- ESLint + Prettier
- Jest 测试配置
- 目录结构规划"
🤖 正在创建 React 项目...
📋 步骤 1:项目脚手架
✅ 使用 Vite 创建项目:
- ✓ React + TypeScript
- ✓ 项目结构已初始化
- ✓ 安装基础依赖
📋 步骤 2:ESLint + Prettier 配置
✅ 已配置:
- eslint.config.js (React + TypeScript 规则)
- .prettierrc (代码格式化配置)
- .prettierignore (忽略文件)
集成配置:
- 保存时自动格式化
- VS Code 推荐配置已输出
📋 步骤 3:Jest 测试配置
✅ 已配置:
- jest.config.js
- jest.setup.ts (React Testing Library 初始化)
- @testing-library/jest-dom
- @testing-library/user-event
测试命令:
- npm test → 运行所有测试
- npm test:coverage → 生成覆盖率报告
📋 步骤 4:目录结构规划
✅ 已创建目录结构:
src/
├── api/ # API 请求相关
│ ├── client.ts # axios 实例配置
│ └── users.ts # 用户 API
├── components/ # 通用组件
│ ├── common/ # 基础组件(Button, Input 等)
│ └── layout/ # 布局组件(Header, Footer 等)
├── features/ # 功能模块
│ └── example/ # 示例功能
├── hooks/ # 自定义 hooks
├── pages/ # 页面组件
├── utils/ # 工具函数
├── styles/ # 全局样式
└── types/ # 类型定义
📋 步骤 5:初始化 Git
✅ 已完成:
- git init
- 创建 .gitignore
- 首次提交
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ React 项目已创建:
- ✅ Vite + React + TypeScript
- ✅ ESLint + Prettier 配置完成
- ✅ Jest + React Testing Library
- ✅ 目录结构已创建
- ✅ 首次提交完成
- 耗时:2 分 15 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
案例二:Next.js 项目初始化
$ claude "创建一个 Next.js 项目:
- 使用 App Router
- TypeScript
- Tailwind CSS
- 包含完整目录结构"
✅ Next.js 项目已创建:
- Next.js 14 (App Router)
- TypeScript 配置
- Tailwind CSS 配置
- 目录结构完整
- 首次提交完成
场景二:API 集成
使用场景: 需要集成第三方 API 或开发自己的 API 接口时。
案例一:REST API 完整集成
$ claude "集成一个新的 REST API(用户相关):
1. 创建 API 客户端
2. 添加类型定义
3. 生成 API 调用函数
4. 添加错误处理
5. 写使用示例"
🤖 正在集成 REST API...
📋 步骤 1/5:创建 API 客户端
✅ 已创建:src/api/client.ts
```typescript
import axios from 'axios';
const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000/api',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
});
// 请求拦截器
apiClient.interceptors.request.use(
(config) => {
const token = getAuthToken();
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
// 响应拦截器
apiClient.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
// 处理未授权
handleUnauthorized();
}
return Promise.reject(error);
}
);
📋 步骤 2/5:添加类型定义
✅ 已创建:src/api/types/users.ts
export interface User {
id: string;
email: string;
name: string;
avatar?: string;
createdAt: string;
updatedAt: string;
}
export interface CreateUserDto {
email: string;
name: string;
password: string;
}
export interface UpdateUserDto {
name?: string;
avatar?: string;
email?: string;
}
export interface UserListResponse {
data: User[];
total: number;
page: number;
pageSize: number;
}
export interface ApiError {
code: string;
message: string;
details?: Record<string, unknown>;
}
📋 步骤 3/5:生成 API 调用函数
✅ 已创建:src/api/users.ts
import { client } from './client';
import type {
User,
CreateUserDto,
UpdateUserDto,
UserListResponse
} from './types/users';
// 获取用户列表
export const getUsers = async (
params?: ListParams
): Promise<UserListResponse> => {
const response = await client.get<UserListResponse>('/users', { params });
return response.data;
};
// 获取单个用户
export const getUser = async (id: string): Promise<User> => {
const response = await client.get<User>(`/users/${id}`);
return response.data;
};
// 创建用户
export const createUser = async (data: CreateUserDto): Promise<User> => {
const response = await client.post<User>('/users', data);
return response.data;
};
// 更新用户
export const updateUser = async (
id: string,
data: UpdateUserDto
): Promise<User> => {
const response = await client.patch<User>(`/users/${id}`, data);
return response.data;
};
// 删除用户
export const deleteUser = async (id: string): Promise<void> => {
await client.delete(`/users/${id}`);
};
📋 步骤 4/5:添加错误处理
✅ 已创建:src/api/errors.ts
export class ApiError extends Error {
constructor(
message: string,
public code: string,
public statusCode: number,
public details?: Record<string, unknown>
) {
super(message);
this.name = 'ApiError';
}
}
export const handleApiError = (error: unknown): never => {
if (axios.isAxiosError(error)) {
const status = error.response?.status;
const message = error.response?.data?.message || error.message;
switch (status) {
case 400:
throw new ApiError(message, 'BAD_REQUEST', 400);
case 401:
throw new ApiError(message, 'UNAUTHORIZED', 401);
case 403:
throw new ApiError(message, 'FORBIDDEN', 403);
case 404:
throw new ApiError(message, 'NOT_FOUND', 404);
case 500:
throw new ApiError(message, 'INTERNAL_ERROR', 500);
default:
throw new ApiError(message, 'UNKNOWN', status || 0);
}
}
throw new ApiError('Unknown error', 'UNKNOWN', 0);
};
📋 步骤 5/5:写使用示例
✅ 已创建:src/api/examples.ts
import {
getUsers,
getUser,
createUser,
updateUser,
deleteUser
} from '../users';
// 示例 1:获取用户列表
const fetchUsers = async () => {
try {
const { data, total, page, pageSize } = await getUsers({
page: 1,
pageSize: 10,
});
console.log(`共 ${total} 个用户,第 ${page}/${Math.ceil(total/pageSize)} 页`);
return data;
} catch (error) {
console.error('获取用户列表失败:', error);
}
};
// 示例 2:创建新用户
const addUser = async () => {
try {
const newUser = await createUser({
email: 'new@example.com',
name: '新用户',
password: '123456',
});
console.log('创建成功:', newUser);
return newUser;
} catch (error) {
console.error('创建用户失败:', error);
}
};
// 示例 3:更新用户信息
const modifyUser = async (id: string) => {
try {
const updated = await updateUser(id, {
name: '新名字',
avatar: 'https://example.com/avatar.jpg',
});
console.log('更新成功:', updated);
return updated;
} catch (error) {
console.error('更新用户失败:', error);
}
};
// 示例 4:删除用户
const removeUser = async (id: string) => {
try {
await deleteUser(id);
console.log('删除成功');
} catch (error) {
console.error('删除用户失败:', error);
}
};
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ API 集成完成:
- src/api/client.ts - axios 客户端(已配置拦截器)
- src/api/types/users.ts - 类型定义
- src/api/users.ts - CRUD 函数
- src/api/errors.ts - 错误处理
- src/api/examples.ts - 使用示例
- 耗时:35 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
**案例二:GraphQL API 集成**
```bash
$ claude "使用 Apollo Client 集成 GraphQL API:
1. 配置 Apollo Client
2. 创建 query 和 mutation
3. 添加类型生成"
✅ GraphQL API 集成完成:
- Apollo Client 配置完成
- 5 个 Query 定义
- 3 个 Mutation 定义
- 使用 graphql-codegen 生成类型
场景三:组件开发
使用场景: 需要创建一个完整的 UI 组件,包含测试、文档等。
案例一:完整 Modal 组件开发
$ claude "创建一个 Modal 组件:
- 使用 TypeScript
- 包含 props 类型定义
- 包含 Storybook 故事
- 包含单元测试
- 包含使用文档"
🤖 正在创建 Modal 组件...
📋 步骤 1:创建组件代码
✅ 已创建:src/components/Modal/Modal.tsx
```tsx
import React, { useEffect, useRef } from 'react';
import { createPortal } from 'react-dom';
import { X } from 'lucide-react';
import styles from './Modal.module.css';
export interface ModalProps {
isOpen: boolean;
onClose: () => void;
title?: string;
children: React.ReactNode;
size?: 'sm' | 'md' | 'lg' | 'full';
showCloseButton?: boolean;
closeOnOverlayClick?: boolean;
closeOnEscape?: boolean;
}
export const Modal: React.FC<ModalProps> = ({
isOpen,
onClose,
title,
children,
size = 'md',
showCloseButton = true,
closeOnOverlayClick = true,
closeOnEscape = true,
}) => {
const overlayRef = useRef<HTMLDivElement>(null);
const previousActiveElement = useRef<HTMLElement | null>(null);
// 处理 ESC 键
useEffect(() => {
const handleEscape = (e: KeyboardEvent) => {
if (closeOnEscape && e.key === 'Escape') {
onClose();
}
};
if (isOpen) {
document.addEventListener('keydown', handleEscape);
previousActiveElement.current = document.activeElement as HTMLElement;
}
return () => {
document.removeEventListener('keydown', handleEscape);
};
}, [isOpen, closeOnEscape, onClose]);
// 处理遮罩层点击
const handleOverlayClick = (e: React.MouseEvent) => {
if (closeOnOverlayClick && e.target === overlayRef.current) {
onClose();
}
};
if (!isOpen) return null;
return createPortal(
<div
ref={overlayRef}
className={styles.overlay}
onClick={handleOverlayClick}
role="dialog"
aria-modal="true"
aria-labelledby="modal-title"
>
<div className={`${styles.modal} ${styles[size]}`}>
{(title || showCloseButton) && (
<div className={styles.header}>
{title && (
<h2 id="modal-title" className={styles.title}>
{title}
</h2>
)}
{showCloseButton && (
<button
className={styles.closeButton}
onClick={onClose}
aria-label="关闭弹窗"
>
<X size={20} />
</button>
)}
</div>
)}
<div className={styles.content}>
{children}
</div>
</div>
</div>,
document.body
);
};
📋 步骤 2:创建样式文件
✅ 已创建:src/components/Modal/Modal.module.css
📋 步骤 3:创建 Storybook 故事
✅ 已创建:src/components/Modal/Modal.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Modal } from './Modal';
const meta: Meta<typeof Modal> = {
title: 'Components/Modal',
component: Modal,
tags: ['autodocs'],
argTypes: {
size: {
control: 'select',
options: ['sm', 'md', 'lg', 'full'],
},
},
};
export default meta;
type Story = StoryObj<typeof Modal>;
export const Default: Story = {
args: {
isOpen: true,
title: '示例弹窗',
children: '这是弹窗的内容区域',
},
};
export const WithForm: Story = {
args: {
isOpen: true,
title: '用户表单',
size: 'lg',
children: (
<form>
<input type="text" placeholder="请输入姓名" />
<button type="submit">提交</button>
</form>
),
},
};
export const NoCloseButton: Story = {
args: {
isOpen: true,
showCloseButton: false,
children: '没有关闭按钮的弹窗',
},
};
📋 步骤 4:创建单元测试
✅ 已创建:src/components/Modal/Modal.test.tsx
import { render, screen, fireEvent } from '@testing-library/react';
import { Modal } from './Modal';
describe('Modal', () => {
it('正确渲染弹窗内容', () => {
render(
<Modal isOpen={true} onClose={() => {}}>
<div>弹窗内容</div>
</Modal>
);
expect(screen.getByText('弹窗内容')).toBeInTheDocument();
});
it('isOpen 为 false 时不渲染', () => {
const { container } = render(
<Modal isOpen={false} onClose={() => {}}>
<div>弹窗内容</div>
</Modal>
);
expect(container.querySelector('[role="dialog"]')).not.toBeInTheDocument();
});
it('点击关闭按钮调用 onClose', () => {
const onClose = jest.fn();
render(
<Modal isOpen={true} onClose={onClose} title="测试弹窗">
<div>内容</div>
</Modal>
);
fireEvent.click(screen.getByLabelText('关闭弹窗'));
expect(onClose).toHaveBeenCalledTimes(1);
});
it('点击遮罩层调用 onClose', () => {
const onClose = jest.fn();
render(
<Modal isOpen={true} onClose={onClose} closeOnOverlayClick={true}>
<div>内容</div>
</Modal>
);
fireEvent.click(screen.getByRole('dialog').parentElement!);
expect(onClose).toHaveBeenCalledTimes(1);
});
it('按 ESC 键调用 onClose', () => {
const onClose = jest.fn();
render(
<Modal isOpen={true} onClose={onClose} closeOnEscape={true}>
<div>内容</div>
</Modal>
);
fireEvent.keyDown(document, { key: 'Escape' });
expect(onClose).toHaveBeenCalledTimes(1);
});
});
📋 步骤 5:创建使用文档
✅ 已创建:src/components/Modal/Modal.md
# Modal 组件
弹窗组件,用于展示模态内容。
## 基本用法
```tsx
import { Modal } from '@/components/Modal';
<Modal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
title="提示"
>
<p>这是弹窗内容</p>
</Modal>
Props
| Prop | Type | Default | Description | |||
|---|---|---|---|---|---|---|
| isOpen | boolean | required | 控制弹窗显示 | |||
| onClose | () => void | required | 关闭回调 | |||
| title | string | - | 弹窗标题 | |||
| size | 'sm' | 'md' | 'lg' | 'full' | 'md' | 弹窗大小 |
| showCloseButton | boolean | true | 显示关闭按钮 | |||
| closeOnOverlayClick | boolean | true | 点击遮罩关闭 | |||
| closeOnEscape | boolean | true | 按 ESC 关闭 |
最佳实践
- 使用 Portal 渲染,避免 z-index 问题
- 焦点管理:打开时聚焦弹窗,关闭时恢复
- 键盘支持:支持 ESC 键关闭
- 无障碍:使用 role="dialog" 和 aria 属性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 组件开发完成:
- Modal.tsx - 组件实现
- Modal.module.css - 样式文件
- Modal.stories.tsx - Storybook 故事
- Modal.test.tsx - 单元测试(5 个用例)
- Modal.md - 使用文档
- 耗时:1 分 20 秒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
案例二:快速创建一个简单组件
$ claude "创建一个 Button 组件:基础样式 + 4 种变体(primary/secondary/danger/ghost)"
✅ 组件创建完成:
- Button.tsx
- Button.module.css
- Button.test.tsx
📊 六、自定义工作流
本节内容
讲解如何创建和使用自定义工作流,让重复性的开发流程自动化。
创建自定义工作流
使用场景: 创建一个可重用的工作流,方便团队成员共享使用。
案例一:创建功能开发工作流
$ claude "创建一个'完整功能开发'的工作流,包含:
1. 创建功能分支
2. 生成基础代码
3. 编写测试
4. 代码审查
5. 合并分支"
🤖 正在创建自定义工作流...
✅ 已创建工作流:
- workflow: feature-dev
- 描述:完整功能开发工作流
- 步骤:5 个
- 交互式确认:开启
📋 工作流详情:
步骤 1:创建功能分支
- 命令:git checkout -b feature/{feature-name}
- 确认:是
步骤 2:生成代码
- 提示:生成 {feature-name} 功能的完整代码
- 确认:是
步骤 3:编写测试
- 提示:为功能编写单元测试和集成测试
- 确认:是
步骤 4:代码审查
- 提示:审查代码并提供改进建议
- 确认:是
步骤 5:合并分支
- 命令:git checkout main && git merge feature/{feature-name}
- 确认:是
💾 工作流已保存到:
~/.claude/workflows/feature-dev.yaml
案例二:创建代码审查工作流
$ claude "创建一个代码审查工作流:
1. 检查代码格式
2. 运行 lint
3. 运行测试
4. 输出审查报告
5. 自动修复简单问题"
✅ 已创建工作流:code-review.yaml
使用方式:
claude --workflow code-review "审查 src/api 目录"
工作流配置文件详解
在 ~/.claude/workflows/ 目录下创建 YAML 配置文件:
# feature-dev.yaml
name: 完整功能开发
description: 从创建分支到合并的完整功能开发流程
# 是否需要交互式确认
confirm: true
steps:
- name: 创建分支
# 使用 {variable} 占位符
command: git checkout -b feature/{feature-name}
- name: 生成代码
# 使用 prompt 让 Claude 执行任务
prompt: |
生成 {feature-name} 功能的完整代码,包括:
- 组件文件
- 样式文件
- 类型定义
- 导出索引文件
- name: 编写测试
prompt: |
为功能编写完整的测试:
- 单元测试
- 组件测试(如适用)
- 确保测试覆盖率 > 80%
- name: 代码审查
prompt: |
审查刚才生成的代码:
- 检查代码规范
- 检查类型安全
- 检查错误处理
- 提供改进建议
- name: 合并分支
command: |
git add .
git commit -m "feat: {feature-name} 功能开发完成"
git checkout main
git merge feature/{feature-name}
工作流配置字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| name | string | 工作流名称 |
| description | string | 工作流描述 |
| confirm | boolean | 是否需要交互式确认 |
| steps | array | 步骤列表 |
| steps[].name | string | 步骤名称 |
| steps[].command | string | 直接执行的命令 |
| steps[].prompt | string | 交给 Claude 处理的提示 |
| steps[].condition | string | 条件判断(可选) |
实际使用工作流
# 使用自定义工作流开发新功能
$ claude --workflow feature-dev "用户登录功能"
🤖 执行工作流:完整功能开发
📋 步骤 1/5:创建功能分支
✅ 已创建分支:feature/user-login
📋 步骤 2/5:生成代码
✅ 生成文件:
- src/features/auth/components/LoginForm.tsx
- src/features/auth/hooks/useLogin.ts
- src/features/auth/api/login.ts
- ...
📋 步骤 3/5:编写测试
✅ 已编写测试:
- LoginForm.test.tsx
- useLogin.test.ts
- 覆盖率:85%
📋 步骤 4/5:代码审查
✅ 审查结果:
- 代码规范:通过
- 类型安全:通过
- 错误处理:已完善
- 建议:可添加记住我功能
📋 步骤 5/5:合并分支
✅ 已合并到 main
✅ 工作流执行完成!
⏱️ 总耗时:2 分 30 秒
团队共享工作流
工作流文件位置:
~/.claude/workflows/ # 个人工作流(推荐)
/project/.claude/workflows/ # 项目级工作流
项目级工作流配置:
# 项目根目录 .claude/workflows/dev.yaml
name: 项目开发流程
description: 团队统一的功能开发流程
steps:
- name: 检查规范
prompt: 检查代码是否符合团队规范
- name: 运行测试
command: npm test
- name: 代码审查
prompt: 审查代码并给出反馈
- name: 提交代码
command: git add . && git commit -m "{message}"
工作流最佳实践
- 保持简单:每个工作流 3-5 个步骤为宜
- 添加确认:重要步骤添加交互确认
- 灵活占位符:使用 {variable} 让工作流更灵活
- 版本控制:将工作流文件加入版本控制
⌨️ 七、Claude Code 命令行技巧
本节内容
汇总 Claude Code 最实用的命令行技巧,帮助你更高效地使用自动化功能。
常用命令汇总
| 命令 | 功能 | 示例 |
|---|---|---|
claude | 启动交互模式 | claude |
claude "任务" | 单次执行任务 | claude "格式化代码" |
claude -p "任务" | 打印结果到终端 | claude -p "你好" |
claude --project <dir> | 指定项目目录 | claude --project ./my-app |
claude --continue | 继续上次对话 | claude --continue |
claude --model <model> | 指定模型 | claude --model opus-4-6 |
claude --workflow <name> | 使用工作流 | claude --workflow dev |
claude -m <message> | 多行消息 | claude -m "第一行\n第二行" |
模型选择建议
# 简单任务:快速格式化
claude --model haiku "格式化代码"
# 中等任务:代码审查
claude --model sonnet "审查代码"
# 复杂任务:完整功能开发
claude --model opus-4-6 "开发用户认证模块"
| 模型 | 适用场景 | 速度 | 能力 |
|---|---|---|---|
| haiku | 简单重复任务 | 最快 | 基础 |
| sonnet | 中等复杂度任务 | 中等 | 良好 |
| opus-4-6 | 复杂推理任务 | 较慢 | 最强 |
实战组合命令
案例一:代码审查和修复一条龙
# 一条命令完成代码审查和自动修复
$ claude "审查刚才的提交,如果有错误自动修复"
🤖 审查结果:
- 发现 3 个小问题
- 已自动修复:
1. 删除了 console.log
2. 添加了缺失的类型注解
3. 修复了 import 顺序
✅ 全部修复完成
案例二:批量文件重命名
# 批量重命名测试文件
$ claude "批量重命名所有测试文件,从 .test.js 改为 .test.ts"
🔍 找到 45 个测试文件
✅ 已重命名:
- user.test.js → user.test.ts
- auth.test.js → auth.test.ts
- api.test.js → api.test.ts
...
✅ 自动更新了 128 个导入语句
案例三:代码清理
# 快速清理调试代码
$ claude "找出所有使用 console.log 的地方并删除"
🔍 找到 156 处 console.log
✅ 已删除 154 处
⚠️ 保留 2 处:
- src/debug/temp.js(调试目录)
- src/utils/logger.ts(调试工具)
💡 建议:如需完全删除,可删除 debug 目录
案例四:批量搜索和替换
# 批量替换 API 域名
$ claude "把项目中所有 api.example.com 替换成 api.new-domain.com"
🔍 找到 89 处引用
✅ 已更新 89 处:
- 环境变量文件
- API 配置文件
- 文档中的示例代码
案例五:快速查询代码库
# 查询并总结代码
$ claude "找出项目中所有使用 React Query 的地方,并总结用法"
📊 找到 23 处使用:
Hooks 使用:
- useQuery: 15 处
- useMutation: 8 处
典型用法:
1. 数据获取:
const { data, isLoading } = useQuery({
queryKey: ['user', id],
queryFn: () => fetchUser(id),
});
2. 数据变更:
const mutation = useMutation({
mutationFn: updateUser,
onSuccess: () => {
queryClient.invalidateQueries(['users']);
},
});
案例六:生成项目文档
# 自动生成 README
$ claude "为项目生成完整的 README 文档"
✅ README.md 已生成,包含:
- 项目简介
- 技术栈
- 安装步骤
- 开发指南
- API 文档
- 贡献指南
- 许可证
环境变量技巧
# 设置项目根目录
export CLAUDE_PROJECT_ROOT=/path/to/project
# 设置默认模型
export CLAUDE_DEFAULT_MODEL=opus-4-6
# 启用详细日志
export CLAUDE_VERBOSE=true
# 设置超时时间(毫秒)
export CLAUDE_TIMEOUT=300000
快捷命令别名
# 在 .bashrc 或 .zshrc 中添加
# 快速格式化
alias cfmt="claude '格式化当前项目的代码'"
# 快速测试
alias ctest="claude '运行项目测试'"
# 快速审查
alias crev="claude --model opus-4-6 '审查当前的更改'"
# 快速提交
alias ccommit="claude '提交当前的更改,并生成合适的提交信息'"
效率提升技巧
- 使用 Tab 补全:命令和文件名都支持 Tab 补全
- 历史搜索:使用上下箭头浏览历史命令
- 多行输入:使用 -m 参数输入多行任务描述
- 管道组合:可以将 Claude Code 与其他工具组合使用
📝 八、自动化最佳实践
本节内容
总结在实际项目中应用自动化时的心得和最佳实践,帮助你避免常见的坑。
1️⃣ 从小处着手
建议
❌ 不要:
一开始就尝试自动化整个开发流程
✅ 要:
从最简单的任务开始
- 先自动化代码格式化
- 再自动化测试运行
- 然后自动化部署
推荐自动化顺序(从易到难):
第 1 阶段:基础任务(1-2 天)
├── 代码格式化
├── import 排序
└── 删除 console.log
第 2 阶段:日常任务(1 周)
├── 运行测试
├── 代码审查
└── 生成文档
第 3 阶段:流程任务(1 个月)
├── 功能开发
├── 版本发布
└── 部署流程
案例:渐进式自动化
# 阶段 1:先自动化最简单的
$ claude "每次提交前自动格式化代码"
✅ 已配置:pre-commit hook
每次 git commit 自动运行 prettier
# 阶段 2:再自动化测试
$ claude "添加一个命令,运行测试并生成报告"
✅ 已添加:npm run test:report
运行测试 + 生成覆盖率报告 + 发送到 Slack
# 阶段 3:最后自动化复杂流程
$ claude "创建一个发布命令,包含所有步骤"
✅ 已创建:npm run release
版本升级 → 构建 → 测试 → 部署
2️⃣ 保持可逆性
核心原则: 任何自动化操作都应该可以撤销,特别是批量修改。
最佳实践:
# 重要操作前先备份
$ claude "备份 src/ 目录,然后修改..."
🤖 备份策略:
✅ 备份位置:src.backup/2026-03-23-15-30/
✅ 备份内容:完整目录副本
✅ 修改完成
✅ 如需恢复:cp -r src.backup/2026-03-23-15-30/* src/
# 或者使用 git 备份
$ claude "创建一个 backup 分支,然后进行批量修改"
✅ backup 分支已创建
✅ 批量修改完成
✅ 如需回滚:git checkout backup
批量修改安全检查清单:
☑ 是否需要备份?
☑ 是否使用了 --dry-run 预览?
☑ 是否开启了 --confirm 选项?
☑ 是否知道如何撤销?
☑ 是否设置了超时限制?
3️⃣ 记录自动化脚本
为什么要记录?
- 团队其他成员可以使用
- 忘记时可以快速回顾
- 可以在其他项目中复用
记录方式:
# 方式 1:整理成文档
$ claude "把今天使用的自动化命令整理成文档"
✅ 已创建:AUTOMATION.md
内容:
## 今日使用的自动化命令
### 代码审查
```bash
claude --model opus-4-6 "审查 src/ 目录"
代码格式化
claude "格式化所有 TypeScript 文件"
测试运行
claude "运行完整测试并生成报告"
方式 2:保存为脚本
$ claude "创建一个自动化脚本,包含常用命令"
✅ 已创建:scripts/auto-dev.sh
#!/bin/bash
echo "开始日常开发工作流..."
claude "运行测试"
claude "提交代码"
### 4️⃣ 测试自动化流程
**在正式使用前,务必测试:**
```bash
# 测试 1:在空项目中测试
$ claude "在 test-project 目录测试完整的工作流"
✅ 测试完成,发现 2 个问题:
1. 依赖安装超时
2. 测试配置路径错误
# 测试 2:模拟错误场景
$ claude "测试当测试失败时的工作流行为"
✅ 错误处理正常:
- 测试失败时停止工作流
- 发送通知到 Slack
- 生成错误报告
5️⃣ 监控和日志
建议添加日志记录:
# 工作流配置中加入日志
steps:
- name: 运行测试
command: |
echo "开始测试: $(date)"
npm test 2>&1 | tee test.log
echo "测试完成: $(date)"
# 保存输出供后续检查
output: test.log
常见监控指标:
- 自动化成功率
- 平均执行时间
- 失败原因分布
- 节省的时间
注意事项
- 不要过度自动化:不是所有事情都需要自动化
- 保持简单:复杂的自动化流程难以维护
- 定期审查:检查自动化流程是否仍然有效
- 保留人工审核:关键步骤需要人工确认
🎓 九、实战练习
Example
动手练习:尝试自动化以下任务,从简单到复杂逐步提升
练习一:初级 - 批量清理调试代码
目标: 清理项目中的调试代码,体会批量操作的威力
# 任务描述:
# 1. 找出项目中所有的 console.log
# 2. 删除所有非必要的 console.log
# 3. 保留错误日志(console.error)
# 4. 生成清理报告
$ claude "清理项目中的调试代码:
1. 找出所有 console.log
2. 区分必要和不必要的
3. 删除不必要的
4. 保留 console.error"
# 预期结果:
# - 删除 150+ 处 console.log
# - 保留 20+ 处 console.error
# - 生成清理报告
进阶挑战:
- 进一步清理
console.warn - 清理
debugger语句 - 清理
// TODO:注释
练习二:中级 - 一键创建功能模块
目标: 创建一个完整的功能模块,包含组件、测试、样式
# 任务描述:
# 创建一个产品列表功能模块,包括:
# 1. 产品列表组件(ProductList)
# 2. 产品卡片组件(ProductCard)
# 3. 产品筛选组件(ProductFilter)
# 4. 相关类型定义
# 5. 单元测试
# 6. 样式文件
$ claude "创建一个产品列表功能模块:
- 使用 TypeScript
- 包含 ProductList、ProductCard、ProductFilter 三个组件
- 包含完整的类型定义
- 包含单元测试
- 包含样式文件
- 使用 Tailwind CSS"
# 预期结果:
# - 创建 10+ 个文件
# - 组件功能完整
# - 测试覆盖率 > 80%
进阶挑战:
- 添加分页功能
- 添加搜索功能
- 添加排序功能
- 添加购物车功能
练习三:高级 - 自动化代码审查 + 修复工作流
目标: 创建一个完整的代码审查和修复自动化流程
# 任务描述:
# 1. 审查最近的代码更改
# 2. 识别问题并分类(规范/安全/性能/测试)
# 3. 自动修复简单问题
# 4. 生成审查报告
# 5. 创建代码审查 issue
$ claude "自动化代码审查流程:
1. 审查最近 3 个 commit 的代码
2. 识别并分类所有问题
3. 自动修复可自动修复的问题(格式、import 顺序等)
4. 手动标记需要人工处理的问题
5. 生成详细的审查报告
6. 如果有严重问题,创建 GitHub issue"
# 预期结果:
# - 审查报告包含:规范问题、安全问题、性能问题、测试问题
# - 自动修复:格式问题、import 问题、简单的类型问题
# - 手动标记:复杂逻辑问题、架构问题
进阶挑战:
- 集成到 CI/CD 流程
- 添加定时自动审查
- 添加代码质量评分
- 发送通知到 Slack/钉钉
练习四:进阶 - 完整的发布自动化
目标: 创建一个完整的版本发布自动化流程
# 任务描述:
# 自动化完成版本发布,包括:
# 1. 检查当前分支状态
# 2. 运行完整测试
# 3. 升级版本号
# 4. 生成更新日志
# 5. 创建 Git tag
# 6. 构建生产版本
# 7. 部署到测试环境
# 8. 部署到生产环境(如通过审批)
# 9. 发送通知
$ claude "执行完整的发布流程:
1. 检查分支状态,确保在 main 分支
2. 拉取最新代码
3. 运行完整测试套件
4. 确认测试通过
5. 升级版本号(自动判断 patch/minor/major)
6. 生成更新日志(基于 commit 历史)
7. 创建并推送 Git tag
8. 构建生产版本
9. 部署到测试环境
10. 确认测试环境正常
11. 部署到生产环境
12. 发送发布通知到 Slack"
# 预期结果:
# - 完整的发布流程自动化
# - 每个步骤都有日志记录
# - 支持回滚
练习建议
- 从简单开始:先完成练习一,熟悉批量操作
- 逐步深入:完成练习二后,再尝试练习三
- 实际应用:尝试把这些自动化应用到实际项目中
- 记录经验:把遇到的问题和解决方案记录下来
📊 十、效率对比与收益分析
效率对比数据
| 工作方式 | 每日工作量 | 错误率 | 加班概率 |
|---|---|---|---|
| 纯手动 | 5 个任务 | 15% | 高 |
| 部分自动化 | 10 个任务 | 8% | 中 |
| 完全自动化 | 20 个任务 | 2% | 低 |
数据说明
以上数据基于典型前端团队的实际统计,实际效果因项目规模和团队情况有所不同。
自动化收益计算
时间节省估算:
假设一个中等规模的前端项目:
每日重复任务:
- 代码审查:30 分钟
- 运行测试:20 分钟
- 版本构建:15 分钟
- 文档更新:15 分钟
总计:80 分钟/天 → 自动化后约 5 分钟/天
年度节省:
- 80 分钟 × 250 工作日 = 20000 分钟
- 约 333 小时 ≈ 42 个工作日!
质量提升效果
手动操作 vs 自动化:
代码审查:
- 手动:平均发现 5 个问题,漏掉 3 个
- 自动化:平均发现 8 个问题,漏掉 0 个
测试执行:
- 手动:随机抽测,覆盖率 60%
- 自动化:完整覆盖,覆盖率 90%+
版本发布:
- 手动:平均耗时 45 分钟,可能出错 3 处
- 自动化:平均耗时 5 分钟,错误率 < 1%
🚀 十一、进阶技巧与高阶用法
本节内容
分享一些高级用户才知道的技巧,帮助你进一步提升效率。
1. 多模型组合使用
场景: 复杂任务需要不同模型配合。
# 先用快速模型做简单处理
$ claude --model haiku "快速格式化代码,检查明显问题"
# 再用强大模型做深度分析
$ claude --model opus-4-6 "审查代码,识别潜在问题"
2. 并行任务处理
场景: 多个独立任务同时执行。
# 同时处理多个任务
$ claude "同时完成以下任务:
1. 格式化 src/ 目录的代码
2. 运行测试并生成报告
3. 检查依赖更新"
✅ 三个任务并行执行中...
📋 任务 1/3:代码格式化
✅ 完成:45 个文件
📋 任务 2/3:运行测试
✅ 完成:156 个测试通过
📋 任务 3/3:检查依赖
✅ 发现 3 个可用更新
✅ 全部完成,耗时:2 分 30 秒
3. 条件分支工作流
场景: 根据不同情况执行不同操作。
$ claude "检查代码并提交:
- 如果测试通过:直接提交
- 如果测试失败:修复后提交
- 如果有 lint 警告:修复后再提交"
🤖 正在执行...
📋 检查测试结果
✅ 测试通过
📋 检查 lint 状态
⚠️ 发现 2 个警告
📋 修复 lint 警告
✅ 已修复
📋 提交代码
✅ 提交完成
4. 模板变量高级用法
场景: 在工作流中使用更复杂的变量。
# advanced-workflow.yaml
name: 高级功能开发
steps:
- name: 创建分支
command: |
FEATURE_NAME={input}
BRANCH_NAME="feature/$(echo $FEATURE_NAME | kebab-case)"
git checkout -b $BRANCH_NAME
- name: 生成代码
prompt: |
为 {input} 功能生成完整代码
- 使用当前项目的技术栈
- 遵循项目的代码规范
- name: 确定版本类型
command: |
# 根据功能复杂度判断版本类型
if [ "{severity}" = "major" ]; then
echo "minor" # 功能通常是 minor
fi
5. 错误处理和重试
场景: 自动化任务遇到错误时的处理。
$ claude "执行构建任务:
- 最多重试 3 次
- 如果失败,发送通知到 Slack
- 保存错误日志"
📋 尝试 1/3:构建项目
⚠️ 失败:依赖安装超时
📋 尝试 2/3:重新安装依赖
⚠️ 失败:网络问题
📋 尝试 3/3:使用国内镜像源
✅ 成功
✅ 构建完成,产物:dist/
⚠️ 注意:使用了镜像源,建议检查网络
6. 集成外部工具
场景: 与项目中的其他工具配合使用。
# 与 GitHub CLI 集成
$ claude "创建 PR 并请求代码审查"
✅ 已创建 PR:#123
✅ 已添加审查者:@team-lead
✅ 已添加标签:needs-review
# 与 npm scripts 集成
$ claude "运行自定义脚本:npm run daily-check"
📋 执行 daily-check 脚本...
✅ 检查完成:
- 依赖安全:无漏洞
- 代码规范:5 个警告
- 测试覆盖:85%
# 与 Docker 集成
$ claude "构建 Docker 镜像并部署到测试环境"
高阶技巧总结
- 模型选择:简单任务用 haiku,复杂任务用 opus
- 并行处理:独立任务并行执行节省时间
- 条件逻辑:根据情况动态调整行为
- 错误处理:设置重试和通知机制
- 工具集成:与项目现有工具无缝配合
🎉 总结
| 技能 | 说明 | 掌握难度 |
|---|---|---|
| 任务识别 | 找出可自动化的重复任务 | ⭐ |
| 命令组合 | 灵活组合 Claude Code 命令 | ⭐⭐ |
| 工作流模板 | 创建可复用的工作流程 | ⭐⭐⭐ |
| 高级技巧 | 多模型、并行、错误处理 | ⭐⭐⭐⭐ |
| 持续优化 | 不断改进自动化效率 | ⭐⭐⭐⭐⭐ |
核心要点回顾
- 从小处着手:从最简单的任务开始自动化
- 保持可逆:重要操作前先备份
- 记录文档:把自动化命令整理成文档
- 测试验证:在正式使用前充分测试
- 持续优化:定期回顾和改进自动化流程
[!success]>
下期预告最后一篇(第九篇)我们将讲解 创建自定义 Skills 与完整命令速查,教你如何打造专属的 Claude Code 技能!
敬请期待!