⚙️ Claude Code 高级完全指南(八):工作流与自动化

0 阅读21分钟

写在前面

作为高级开发者,我们不仅要会写代码,更要学会自动化!这一期我们将讲解如何使用 Claude Code 2.1.79 实现开发工作流自动化,从重复性任务中解放双手,大幅提升开发效率。


🎯 一、什么是工作流自动化?

工作流的定义

工作流 = 一系列重复性的开发任务,按特定顺序执行

例如:
- 代码编写 → 测试 → 部署
- 代码审查 → 合并 → 发布
- 数据处理 → 分析 → 报告

为什么需要工作流自动化?

作为开发者,我们每天都在重复做很多事情:

日常重复任务示例:

  • 每天早上拉取最新代码
  • 每次提交前运行格式化
  • 代码审查时检查相同的问题
  • 发布时执行固定的步骤

手动处理的典型问题:

  1. 时间浪费 - 每次重复操作都要花时间
  2. 人为错误 - 容易遗漏步骤或操作失误
  3. 不一致性 - 不同人处理方式不同
  4. 上下文切换 - 打断心流,影响效率

自动化的价值

任务类型手动耗时自动化耗时节省时间年节省(按每天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 时,务必:

  1. 先写测试复现 bug
  2. 再修复代码
  3. 确保测试通过后再合并

🎯 五、特定场景自动化

本节内容

针对前端开发中最常见的三个特定场景,提供完整的自动化解决方案和详细案例。

场景一: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

PropTypeDefaultDescription
isOpenbooleanrequired控制弹窗显示
onClose() => voidrequired关闭回调
titlestring-弹窗标题
size'sm''md''lg''full''md'弹窗大小
showCloseButtonbooleantrue显示关闭按钮
closeOnOverlayClickbooleantrue点击遮罩关闭
closeOnEscapebooleantrue按 ESC 关闭

最佳实践

  1. 使用 Portal 渲染,避免 z-index 问题
  2. 焦点管理:打开时聚焦弹窗,关闭时恢复
  3. 键盘支持:支持 ESC 键关闭
  4. 无障碍:使用 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}

工作流配置字段说明:

字段类型说明
namestring工作流名称
descriptionstring工作流描述
confirmboolean是否需要交互式确认
stepsarray步骤列表
steps[].namestring步骤名称
steps[].commandstring直接执行的命令
steps[].promptstring交给 Claude 处理的提示
steps[].conditionstring条件判断(可选)

实际使用工作流

# 使用自定义工作流开发新功能
$ 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}"

工作流最佳实践

  1. 保持简单:每个工作流 3-5 个步骤为宜
  2. 添加确认:重要步骤添加交互确认
  3. 灵活占位符:使用 {variable} 让工作流更灵活
  4. 版本控制:将工作流文件加入版本控制

⌨️ 七、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 '提交当前的更改,并生成合适的提交信息'"

效率提升技巧

  1. 使用 Tab 补全:命令和文件名都支持 Tab 补全
  2. 历史搜索:使用上下箭头浏览历史命令
  3. 多行输入:使用 -m 参数输入多行任务描述
  4. 管道组合:可以将 Claude Code 与其他工具组合使用

📝 八、自动化最佳实践

本节内容

总结在实际项目中应用自动化时的心得和最佳实践,帮助你避免常见的坑。

1️⃣ 从小处着手

建议

❌ 不要:
一开始就尝试自动化整个开发流程

✅ 要:
从最简单的任务开始
- 先自动化代码格式化
- 再自动化测试运行
- 然后自动化部署

推荐自动化顺序(从易到难):

1 阶段:基础任务(1-2 天)
├── 代码格式化
├── import 排序
└── 删除 console.log2 阶段:日常任务(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. 团队其他成员可以使用
  2. 忘记时可以快速回顾
  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

常见监控指标:

- 自动化成功率
- 平均执行时间
- 失败原因分布
- 节省的时间

注意事项

  1. 不要过度自动化:不是所有事情都需要自动化
  2. 保持简单:复杂的自动化流程难以维护
  3. 定期审查:检查自动化流程是否仍然有效
  4. 保留人工审核:关键步骤需要人工确认

🎓 九、实战练习

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"

# 预期结果:
# - 完整的发布流程自动化
# - 每个步骤都有日志记录
# - 支持回滚

练习建议

  1. 从简单开始:先完成练习一,熟悉批量操作
  2. 逐步深入:完成练习二后,再尝试练习三
  3. 实际应用:尝试把这些自动化应用到实际项目中
  4. 记录经验:把遇到的问题和解决方案记录下来

📊 十、效率对比与收益分析

效率对比数据

工作方式每日工作量错误率加班概率
纯手动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 镜像并部署到测试环境"

高阶技巧总结

  1. 模型选择:简单任务用 haiku,复杂任务用 opus
  2. 并行处理:独立任务并行执行节省时间
  3. 条件逻辑:根据情况动态调整行为
  4. 错误处理:设置重试和通知机制
  5. 工具集成:与项目现有工具无缝配合

🎉 总结

技能说明掌握难度
任务识别找出可自动化的重复任务
命令组合灵活组合 Claude Code 命令⭐⭐
工作流模板创建可复用的工作流程⭐⭐⭐
高级技巧多模型、并行、错误处理⭐⭐⭐⭐
持续优化不断改进自动化效率⭐⭐⭐⭐⭐

核心要点回顾

  1. 从小处着手:从最简单的任务开始自动化
  2. 保持可逆:重要操作前先备份
  3. 记录文档:把自动化命令整理成文档
  4. 测试验证:在正式使用前充分测试
  5. 持续优化:定期回顾和改进自动化流程

[!success]>
下期预告

最后一篇(第九篇)我们将讲解 创建自定义 Skills 与完整命令速查,教你如何打造专属的 Claude Code 技能!

敬请期待!