Claude Code 深度实战指南

举报
yd_47669746 发表于 2026/11/05 11:09:28 2026/11/05
【摘要】 一、理解 Claude Code 的工作原理 它不是一个聊天机器人Claude Code 不是在"回答问题",它在执行任务。区别在于:聊天机器人:你问 → 它答 → 结束Claude Code:你给任务 → 它规划 → 读文件 → 改代码 → 跑命令 → 验证 → 循环理解这一点,你才能给它任务而不是问题。 工具调用链用户:"给项目添加用户认证" ↓Claude 规划: ...

一、理解 Claude Code 的工作原理

它不是一个聊天机器人

Claude Code 不是在"回答问题",它在执行任务。区别在于:

聊天机器人:你问 → 它答 → 结束
Claude Code:你给任务 → 它规划 → 读文件 → 改代码 → 跑命令 → 验证 → 循环

理解这一点,你才能给它任务而不是问题。

工具调用链

用户:"给项目添加用户认证"
         ↓
Claude 规划:
  1. 读 package.json 了解依赖
  2. 读 src/ 目录了解项目结构
  3. 读现有的路由文件了解代码风格
  4. 创建认证模块
  5. 写测试
  6. 运行测试验证
         ↓
每一步都会调用具体工具(Read/Edit/Write/Bash)
每一步都需要你确认(取决于权限模式)

为什么 CLAUDE.md 是最关键的

没有 CLAUDE.md 的对话,Claude 每次都要从零了解你的项目。有 CLAUDE.md,它上来就知道:

  • 你的技术栈
  • 你的代码规范
  • 你的项目结构
  • 常用命令
  • 注意事项

这不只是方便,这是质量的分水岭。


二、CLAUDE.md 工程:从能用到好用

初级:基本信息

# My Project

这是一个 Next.js 项目。

有用,但不够。

中级:技术上下文

# My Project

## 技术栈
- Next.js 14 (App Router)
- TypeScript 5.3
- Tailwind CSS 3.4
- Prisma + PostgreSQL
- NextAuth.js v5

## 项目结构
src/
  app/          — 页面和路由
  components/   — React 组件
  lib/          — 工具函数和配置
  services/     — 业务逻辑
  types/        — TypeScript 类型定义
  prisma/       — 数据库 schema

## 常用命令
- dev: npm run dev
- build: npm run build
- test: npm run test
- db:push: npx prisma db push
- db:studio: npx prisma studio

高级:行为指令

# My Project

[... 技术栈和结构 ...]

## 代码规范
- 组件用函数式 + hooks,禁止 class 组件
- 命名:组件 PascalCase,变量/函数 camelCase,常量 UPPER_SNAKE_CASE
- 文件命名:组件用 PascalCase.tsx,其他用 camelCase.ts
- 导入顺序:react → 第三方 → 项目内部 → 相对路径
- 样式只用 Tailwind,不写 CSS 文件
- 错误处理:服务端用 AppError 类,客户端用 toast 通知

## 数据库
- 所有查询通过 Prisma,禁止裸 SQL
- 新增字段必须有默认值(线上 migration 安全)
- 敏感字段(password、token)永远不返回给前端

## 测试
- 核心逻辑必须有单元测试
- API 路由必须有集成测试
- 测试文件放在同目录下,命名为 xxx.test.ts
- Mock 只 mock 外部依赖,不 mock 内部逻辑

## 部署
- Vercel 自动部署
- 环境变量在 Vercel Dashboard 管理
- 数据库迁移通过 Prisma Migrate

## 已知问题
- [BUG] 上传大文件偶尔超时,正在排查
- [TODO] 支付模块还在开发中,不要动 src/services/payment.ts

专家级:动态 CLAUDE.md

# My Project

[... 基础信息 ...]

## 当前迭代 (Sprint 23)
- 目标:完成支付模块重构
- 截止:2026-07-10
- 技术债:需要把 src/utils/legacy.ts 的函数迁移到新架构

## 本周重点
1. 支付回调处理(优先级最高)
2. 订单状态机实现
3. 退款流程

## 代码地图
- src/app/api/webhooks/stripe/ — 支付回调(当前重点)
- src/services/order.ts — 订单业务逻辑
- src/services/payment.ts — 支付逻辑(正在重构)
- src/lib/stripe.ts — Stripe SDK 封装
- prisma/schema.prisma — 数据库定义

## 团队约定
- PR 标题用 Conventional Commits
- AI 生成的代码需要在 PR 描述中标注
- 重要功能需要双人 Review

子目录 CLAUDE.md

project/
├── CLAUDE.md                 # 全局
├── src/
│   ├── CLAUDE.md             # src 目录专用
│   ├── api/
│   │   └── CLAUDE.md         # API 目录专用
│   └── components/
│       └── CLAUDE.md         # 组件目录专用

子目录的 CLAUDE.md 会被合并到全局的,适合放目录特定的规范。

# src/api/CLAUDE.md

## API 路由规范
- 每个路由文件只处理一个资源
- 必须有请求验证(用 zod)
- 返回格式:{ data, error, meta }
- 分页用 cursor 而不是 offset
- 错误码参考 src/lib/errors.ts

三、Prompt 工程:官方文档不会告诉你的

原则一:任务导向而非问题导向

# 差(问题导向)
"Express.js 怎么处理 CORS?"

# 好(任务导向)
"给我的 Express 项目添加 CORS 配置,允许来自 localhost:3000 和
api.example.com 的请求,支持 credentials"

原则二:约束越具体,结果越好

# 差
"优化这个函数"

# 好
"优化 src/utils/parser.ts 的 parseCSV 函数。
当前性能:100MB 文件需要 30 秒。
目标:5 秒以内。
约束:内存使用不超过 200MB,不能引入新依赖。
可以用 worker_threads。"

原则三:给参考而非给规则

# 差
"按照项目的代码风格来写"

# 好
"参考 src/services/userService.ts 的代码风格来写,特别是:
- class 结构
- 错误处理方式
- 日志记录方式
- 返回值类型"

原则四:用否定约束控制行为

"重构 src/utils/helpers.ts
- 不要改变任何函数签名
- 不要引入新依赖
- 不要修改文件结构
- 不要添加注释(代码要自解释)
- 只优化性能"

高级 Prompt 模板

需求实现模板

实现 [功能名称]

背景:[为什么要做这个,解决什么问题]

输入:
- [输入数据格式]
- [边界条件]

输出:
- [输出格式]
- [成功/失败的返回值]

技术约束:
- [框架/库版本]
- [性能要求]
- [兼容性要求]

参考:
- [类似功能的代码位置]
- [相关文档链接]

验收标准:
- [怎么算做完了]
- [怎么验证正确性]

调试模板

症状:[什么现象]
环境:[什么条件下出现]
频率:[总是/偶现/特定条件下]

已排查:
- [已经试过什么]
- [排除了什么可能]

相关代码:
- [文件路径和行号]

日志:
[粘贴相关日志]

请:
1. 分析可能的原因
2. 给出排查步骤
3. 不要直接改代码,先分析

重构模板

重构目标:[文件/模块]

当前问题:
- [为什么要重构,是性能、可读性还是架构问题]

重构要求:
- [保持什么不变]
- [改变什么]
- [验证标准]

分步执行:
1. 先分析现有代码
2. 给出重构方案
3. 等我确认后再改
4. 每改一步都跑测试

四、工具系统深度使用

Read 工具的高效使用

# 差:让 Claude 自己找
"找到处理登录的代码"

# 好:直接给路径
"读 src/services/auth.ts 和 src/app/api/login/route.ts"

Edit 工具的精确控制

# 差
"改一下这个函数"

# 好
"把 src/services/auth.ts 第 45 行的
  const token = jwt.sign(payload, secret)
改成
  const token = jwt.sign(payload, secret, { expiresIn: '24h' })"

Bash 工具的安全使用

// .claude/settings.json
{
  "permissions": {
    "allow": [
      "Bash(npm run test)",
      "Bash(npm run lint)",
      "Bash(npx tsc --noEmit)",
      "Bash(git status)",
      "Bash(git diff)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(git push --force)",
      "Bash(curl *)"
    ]
  }
}

Agent 工具的正确使用场景

# 适合用 Agent 的场景
"找到项目中所有用了 deprecated API 的地方"
→ Agent 独立搜索,结果汇总,主对话上下文干净

"分析 src/ 下所有文件的代码质量"
→ Agent 并行读取多个文件

# 不适合用 Agent 的场景
"改一下这个函数" → 直接 Edit 就行
"跑一下测试" → 直接 Bash 就行

五、实战工作流

工作流一:Feature Branch 开发

# 1. 创建分支
"创建一个 feature/user-profile 分支"

# 2. 实现功能
"实现用户个人资料页面:
- 显示用户信息
- 支持编辑头像、昵称、简介
- 保存到数据库
- API 接口在 src/app/api/profile/route.ts"

# 3. 写测试
"为这个功能写单元测试和集成测试"

# 4. 提交
"帮我写 commit message 并提交"

# 5. 创建 PR
"创建 PR 到 main 分支,描述写清楚做了什么"

工作流二:Bug 修复

# 1. 描述问题
"用户反馈:登录后刷新页面会变成未登录状态。
复现:登录 → F5 → 显示登录按钮"

# 2. 让 Claude 排查
"帮我排查这个问题,先不要改代码,分析原因"

# 3. 确认方案
"好,按方案 A 来修,Session 用 httpOnly Cookie 存储"

# 4. 修复
"修复这个问题"

# 5. 验证
"运行测试,确保没有引入新问题"

# 6. 提交
"提交修复,commit message 描述清楚 bug 是什么、怎么修的"

工作流三:代码审查

# 审查自己的代码
"审查我当前分支和 main 的差异,指出:
1. 潜在 bug
2. 安全问题
3. 性能问题
4. 代码风格不一致"

# 审查别人的 PR
"审查 PR #42 的代码,重点关注:
- 是否符合项目架构
- 错误处理是否完整
- 是否有安全隐患"

工作流四:性能优化

# 1. 定位瓶颈
"src/services/search.ts 的 searchProducts 函数响应很慢,
帮我分析性能瓶颈"

# 2. 方案讨论
"我觉得瓶颈在数据库查询,你觉得用 Elasticsearch 还是加索引好?"

# 3. 实现优化
"按方案 B 实现,先加数据库索引,如果不够再考虑 ES"

# 4. 验证
"写一个 benchmark 脚本,对比优化前后的性能"

工作流五:技术债清理

# 1. 盘点
"分析 src/utils/legacy.ts,列出所有函数,
标注哪些还在用、哪些可以删除"

# 2. 制定计划
"先迁移最常用的 5 个函数到新架构"

# 3. 分步执行
"迁移 formatCurrency 函数,保持签名不变,
内部实现用新的 Intl.NumberFormat"

# 4. 验证
"运行所有测试,确保迁移没有破坏什么"

# 5. 清理
"把迁移后的旧函数标记为 @deprecated"

六、上下文管理专家级技巧

理解上下文窗口

Claude 的上下文窗口约 200k tokens

一个典型对话的 token 消耗:
- 系统 Prompt + CLAUDE.md:~2k tokens
- 每轮对话(你的输入 + Claude 的输出):~1k-5k tokens
- 每次读取文件:取决于文件大小
- 工具调用结果:~500-2k tokens 每次

20 轮对话 + 读取 10 个文件 ≈ 50k-100k tokens

什么时候用 /compact

# 时机一:完成一个子任务后
"好,用户注册功能完成了,现在来做登录"
→ /compact
→ "实现登录功能"

# 时机二:对话超过 15 轮后
→ /compact

# 时机三:感觉 Claude 开始"忘记"之前说的话
→ /compact

什么时候用 /clear

# 完全切换话题
"刚才的功能做完了,现在帮我看看这个 bug"
→ /clear(如果上下文已经很乱)

# 或者直接开始新对话(关闭终端重开 claude)

用 CLAUDE.md 代替重复说明

# 差:每次对话都要说
"我的项目用 Next.js 14,TypeScript,Tailwind CSS,
数据库是 PostgreSQL,用 Prisma ORM..."

# 好:写入 CLAUDE.md,自动加载

七、Hooks 实战

自动格式化

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write $CLAUDE_FILE_PATH 2>/dev/null; npx eslint --fix $CLAUDE_FILE_PATH 2>/dev/null; true"
          }
        ]
      }
    ]
  }
}

自动类型检查

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "cd $CLAUDE_PROJECT_DIR && npx tsc --noEmit 2>&1 | head -20"
          }
        ]
      }
    ]
  }
}

自动测试

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "cd $CLAUDE_PROJECT_DIR && npx vitest related $CLAUDE_FILE_PATH --run --reporter=verbose 2>&1 | tail -20"
          }
        ]
      }
    ]
  }
}

安全防护

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf|DROP TABLE|DELETE FROM|git push --force' && echo 'BLOCKED: dangerous command detected' && exit 1 || exit 0"
          }
        ]
      }
    ]
  }
}

环境变量可用

$CLAUDE_FILE_PATH    — 被操作的文件路径
$CLAUDE_PROJECT_DIR  — 项目根目录
$CLAUDE_TOOL_NAME    — 工具名称
$CLAUDE_TOOL_INPUT   — 工具输入(JSON)

八、高级技巧

技巧一:用 Claude 做架构决策

"我在设计一个消息队列系统,需求:
- 支持 10 万 QPS
- 消息不能丢失
- 延迟 < 100ms
- 需要支持消息回溯

我在考虑:
1. Kafka
2. RabbitMQ
3. Redis Streams
4. 自研

帮我分析每个方案的优劣,给出推荐。
不要只列特点,要结合我的具体需求分析。"

技巧二:用 Claude 做代码迁移

"我要把项目从 Express 迁移到 Fastify。

请:
1. 列出两个框架的 API 差异
2. 分析迁移工作量
3. 制定迁移计划(分步骤)
4. 先迁移一个最简单的路由作为示例"

技巧三:用 Claude 写技术文档

"根据 src/services/order.ts 的代码,写一份技术文档,包括:
1. 模块职责
2. 核心流程图(用 Mermaid)
3. 接口列表
4. 数据流转
5. 已知限制
6. 后续优化方向"

技巧四:用 Claude 做 Postmortem

"今天线上出了一个事故:
- 时间:14:30-15:00
- 现象:所有 API 返回 500
- 原因:数据库连接池耗尽
- 修复:重启服务

帮我写一份 Postmortem 文档,包括:
1. 事故时间线
2. 根因分析(5 Whys)
3. 影响范围
4. 修复措施
5. 预防措施
6. Action Items"

九、实战常见问题与处理

问题:GitHub Push 超时

这是 Claude Code 用户最高频的问题之一。

症状:git push 后长时间卡住,最终报错
error: RPC failed; curl 56 GnuTLS recv error (-110)
fatal: the remote end hung up unexpectedly

原因分析:

1. 仓库太大(有大文件或历史记录多)
2. 网络不稳定(国内访问 GitHub 经常如此)
3. 代理配置不对
4. Git buffer 太小

解决步骤:

# 方案一:增大 Git buffer(最常见的解法)
git config --global http.postBuffer 524288000
# 500MB,够用了

# 方案二:配置代理
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

# 方案三:用 SSH 代替 HTTPS
# 先生成 SSH Key
ssh-keygen -t ed25519 -C "your@email.com"
# 把公钥添加到 GitHub Settings → SSH Keys
# 然后改 remote URL
git remote set-url origin git@github.com:user/repo.git

# 方案四:浅克隆(如果是 clone 阶段超时)
git clone --depth 1 https://github.com/user/repo.git
# 之后再 git fetch --unshallow

# 方案五:分批 push(commit 太多时)
git push origin main --force-with-lease
# 或者分批 push
git log --oneline | wc -l  # 看有多少 commit
git rebase -i HEAD~5       # 压缩最近 5 个 commit
git push

在 Claude Code 中的处理:

"push 超时了,帮我:
1. 先压缩最近的 commit(squash)
2. 配置代理
3. 用 SSH 方式 push"

问题:大仓库导致 Claude Code 卡顿

症状:Claude Code 响应很慢,启动也要很久

原因:
1. 仓库文件太多(node_modules 被索引)
2. .gitignore 没配好
3. 有大量二进制文件
# 解决:
# 1. 确保 .gitignore 完善
echo "node_modules/" >> .gitignore
echo "dist/" >> .gitignore
echo ".next/" >> .gitignore
echo "*.log" >> .gitignore

# 2. 如果仓库有大文件,用 git-lfs
git lfs install
git lfs track "*.psd"
git lfs track "*.zip"
git add .gitattributes

# 3. 清理历史中的大文件(慎重!会改写历史)
git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch path/to/large/file' \
  --prune-empty --tag-name-filter cat -- --all

问题:npm install 在 Claude Code 中卡住

症状:Claude Code 执行 npm install 后一直等待

原因:
1. npm registry 连接慢
2. 依赖树太深
3. 有私有 registry 需要认证
# 解决:
# 1. 换淘宝源
npm config set registry https://registry.npmmirror.com

# 2. 或者用 pnpm(更快)
npm install -g pnpm
pnpm install

# 3. 如果有私有包,先登录
npm login --registry=https://npm.your-company.com

# 4. 在 CLAUDE.md 中告诉 Claude 用什么包管理器
# "使用 pnpm 而不是 npm"

问题:Claude Code 执行测试一直失败

症状:Claude 改了代码后跑测试,测试失败,然后改测试,又失败,循环...

原因:
1. 测试本身有问题(环境依赖)
2. Claude 不理解测试的意图
3. 数据库/外部服务没有 mock
# 解决:
# 1. 先让 Claude 只看错误,不要自动修
"测试失败了,先不要改代码,分析一下失败原因"

# 2. 在 CLAUDE.md 中写清楚测试规范
# "测试必须 mock 数据库和外部 API"
# "测试文件和源码文件放同一目录"

# 3. 让 Claude 先跑一次现有测试确认基线
"先跑一下现有测试,确认在你改代码之前是全过的"

问题:Claude Code 改了不该改的文件

症状:让 Claude 修一个 bug,它顺手重构了整个文件

原因:
1. 指令不够具体
2. Claude 倾向于"顺便优化"
# 解决:
# 1. 明确约束
"只修复第 45 行的 bug,不要改其他任何代码"

# 2. 用否定约束
"不要重构,不要优化,不要加注释,只修这个 bug"

# 3. 让 Claude 先说明要改什么
"先告诉我你打算改哪些文件的哪些行,我确认后再改"

问题:Windows 上 Claude Code 路径报错

症状:文件路径报错,找不到文件

原因:Windows 路径(D:\xxx)和 Unix 路径(/d/xxx)混用
# 解决:
# Claude Code 在 Git Bash 中运行,用 Unix 路径
# 如果报错,试试:
cd /d/codes/ai-api/vibecoding
# 而不是
cd D:\codes\ai-api\vibecoding

# 或者在 Windows Terminal 中直接用 Windows 路径
cd D:\codes\ai-api\vibecoding
claude

问题:对话中途提示上下文满

症状:正在工作,Claude 提示上下文接近限制

原因:对话太长 + 读取了太多文件
# 解决:
# 1. 立即 /compact
/compact

# 2. 如果还不够,把当前进度记下来,开新对话
"总结一下当前的工作进度和下一步,我要开新对话了"

# 3. 把关键信息写入 CLAUDE.md
"把刚才讨论的方案写入 CLAUDE.md 的'当前迭代'部分"

# 4. 之后在新对话中继续
"继续之前的支付模块重构,进度见 CLAUDE.md"

问题:Claude Code 生成的代码有类型错误但不自知

症状:代码看起来对,但 tsc --noEmit 报一堆类型错误

原因:Claude 不会主动跑类型检查
# 解决:
# 1. 用 Hook 自动检查(见第七章)
# 2. 在指令中明确要求
"实现完后运行 npx tsc --noEmit,确保没有类型错误"

# 3. 在 CLAUDE.md 中写
# "每次修改 TypeScript 文件后必须运行类型检查"

问题:git commit 被 Claude Code 生成了奇怪的 message

症状:commit message 是 "Update file.ts" 或 "fix stuff"

原因:Claude 没有 commit message 规范
# 解决:
# 1. 在 CLAUDE.md 中定义规范
# "Commit message 使用 Conventional Commits 格式:
#  feat: 新功能
#  fix: Bug 修复
#  refactor: 重构
#  docs: 文档
#  test: 测试
#  chore: 杂项
#  标题不超过 50 字符,空一行后写详细描述"

# 2. 或者让 Claude 先写 message,你确认后再 commit
"先写 commit message 给我看,我确认后再 commit"
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。