--- title: CLAUDE CODE 最佳实践:从"能用"到"真的好用" source: author: shenwei published: created: description: tags: [] --- # CLAUDE CODE 最佳实践:从"能用"到"真的好用" > 作者:Mr Panda (@PandaTalk8) > 来源:X (Twitter) > 发布时间:2026年3月23日 15:03 > 链接:https://x.com/pandatalk8/status/2035975664730575325 > 收藏:456.4K Views, 1577 Likes, 3583 Bookmarks --- 我用 Claude Code 大半年了,踩过的坑比写过的代码还多。 一开始我以为 Claude Code 就是一个"更高级的 Copilot"——在终端里打字,它帮我写代码,完事。后来才发现,这东西的上限远比我想象得高,但前提是你得知道怎么用。 这篇文章结合官方文档和实战经验,整理了我认为最重要的使用技巧。有些是血泪教训,有些是读文档才知道的隐藏功能。 --- ## 一、CLAUDE.MD:最被低估的功能 如果你只记住这篇文章的一件事,就记这个:**写好你的 CLAUDE.md**。 CLAUDE.md 是 Claude Code 在每次对话开始时自动读取的指令文件。它就像你给一个新同事写的 onboarding doc——你希望他知道什么,你就写什么。 很多人不写 CLAUDE.md,或者随便写两行。结果就是每次对话都要从头解释项目结构、编码规范、技术栈选择。这就像每天早上都要重新给同事介绍一遍公司。 ### 一个好的 CLAUDE.md 应该包含什么 ```markdown # 项目名称 ## 构建和测试命令 - 安装依赖:npm install - 运行测试:npm test - 单个测试:npm test -- --grep "test name" - 格式化:npm run format ## 编码规范 - Python 使用 ruff 格式化,行宽 88 - 测试用 pytest,每个 service 对应一个测试文件 - API 路由文件名用复数:users.py, orders.py - 提交信息用英文,格式:type(scope): description ## 架构决策 - 选 Tailwind 而不是 CSS Modules,因为团队统一了这个规范 - 用户权限校验在 middleware 里做,不要在每个路由重复写 - Redis 缓存的 key 前缀统一用 `app:v1:` ## 常见陷阱 - 数据库连接池上限是 20,别在循环里开新连接 - 不要 mock 数据库,上次 mock 测试通过但生产迁移失败了 ``` ### 有几个关键原则: 1. **第一,写 Claude 从代码里读不出来的东西。** 项目的"为什么"比"是什么"更重要。你不需要解释 React 怎么用,但你需要告诉它"我们选 Tailwind 是因为团队统一了这个规范"。 2. **第二,控制在 200 行以内。** 官方文档明确提到,CLAUDE.md 太长会导致 Claude 忽略规则。用 markdown 标题和列表,保持可扫描性。 3. **第三,不要放频繁变化的内容。** 详细的 API 文档、逐文件描述这些东西不适合放在 CLAUDE.md 里。放链接就好。 ### CLAUDE.md 的四级层级 Claude Code 支持四级 CLAUDE.md,按优先级从高到低: 我的全局 CLAUDE.md 里通常会写: ``` - 我是一名全栈工程师,不需要过度解释基础概念 - 回复尽量简洁,不要加无关的客套话 - 代码改动后不要总结你做了什么,我会看 diff - 优先用简单方案,不要过度工程 ``` 这四行,能省掉你几百次重复纠正的时间。 ### 进阶:用 .claude/rules/ 组织规则 当项目大了之后,一个 CLAUDE.md 文件塞不下所有规则。官方提供了一个更优雅的方案:把规则拆到 .claude/rules/ 目录下。 ``` .claude/rules/ ├── testing.md # 测试规范 ├── api-style.md # API 编写风格 └── frontend.md # 前端约定 ``` 更强大的是,你可以用 YAML frontmatter 把规则限定到特定文件: ```yaml --- paths: ["src/api/**/*.ts", "src/routes/**/*.ts"] --- API 路由必须包含输入验证和错误处理。 所有新端点需要在 tests/api/ 下添加集成测试。 ``` 这样这条规则只在 Claude 访问匹配的文件时才会加载,节省上下文空间。 --- ## 二、提示词的质量决定产出的质量 这听起来像废话,但我见过太多人这样用 Claude Code: > "帮我写一个登录功能" 然后对着生成的一大坨代码发愁——这不是我想要的啊。 好的指令应该包含三个要素:**目标、约束、上下文**。 差的指令 vs 好的指令: - 差:"给用户列表加个搜索功能" - 好:"在 src/pages/UserList.tsx 的表格上方加一个搜索框。搜索走后端 API /api/users?search=xxx,不要前端过滤。用 debounce 300ms,样式和现有的 Filter 组件保持一致。" 区别在哪?好的指令减少了歧义。Claude Code 不需要猜你要前端搜索还是后端搜索,不需要猜 debounce 时间,不需要猜样式规范。 ### 官方推荐的提示技巧 1. **用 @ 引用具体文件** Claude Code 支持用 @文件路径 直接把文件内容拉进上下文。比起说"那个认证相关的代码",直接写 @src/auth/login.ts 精确得多。你甚至可以指定行号范围:@src/auth/login.ts#5-30。 2. **贴截图和图片** 用 Ctrl+V 可以直接粘贴图片。调试 UI 问题时,贴一张"现在长这样"和"我想要这样"的截图,比文字描述有效十倍。 3. **给验证标准** 不要只说"帮我修这个 bug",而是: > "修复登录超时后无法重新认证的问题。修复后,用户在 token 过期后点击任意按钮应该自动跳转到登录页。测试用例在 @tests/auth.test.ts 里,修完后跑一下确认通过。" 给 Claude 一个可以自我验证的标准——测试用例、截图、预期输出——它就能自己检查工作质量,减少来回修改。 4. **明确"不要做"的事** Claude Code 有时候会过度热心——你让它修一个 bug,它顺手把周围的代码也重构了。明确说"只改这个函数,不要动其他代码",能省很多事。 ### 模糊指令也有用武之地 并不是所有时候都需要精确的指令。探索性任务用模糊指令反而更好: - "这个文件有什么可以改进的地方?" - "帮我理解一下这个模块的架构" - "这段代码有什么潜在问题?" 但到了实现阶段,切回精确模式。 --- ## 三、PLAN MODE:先想清楚,再动手 Claude Code 有一个 Plan Mode,这是我认为最被低估的工作流。 ### 怎么进入 Plan Mode 三种方式: ``` # 启动时直接进入 claude --permission-mode plan # 对话中切换(按两次 Shift+Tab) Shift+Tab Shift+Tab # 在提示词里说 "先不要改代码,帮我做个计划" ``` 在 Plan Mode 下,Claude Code 只能读取文件、搜索代码,**不能做任何修改**。它会探索代码库,分析你的需求,然后给出一个详细的实现计划。 ### Plan Mode 的正确打开方式 关键操作:**按 Ctrl+G 可以在你的编辑器里打开并编辑计划。** 这意味着你可以: 1. 让 Claude 生成初始计划 2. Ctrl+G 打开计划,删掉你不同意的部分,补充你自己的想法 3. 切回正常模式(Shift+Tab),让 Claude 按修改后的计划执行 改一个计划只需要一句话,改已经写好的代码要十倍的时间。 ### 推荐的复杂任务工作流 官方推荐的标准流程是四步:**探索 → 规划 → 实现 → 验证**。 ``` 1. 进入 Plan Mode 2. 让 Claude 阅读相关代码:"读一下 src/auth/ 下的代码,理解 session 处理逻辑" 3. 请求计划:"制定一个 OAuth2 迁移方案" 4. Ctrl+G 审查和编辑计划 5. 切回正常模式 6. "按照计划实现,写完跑测试" 7. 让 Claude 对照需求自查 ``` ### 什么时候不需要 Plan Mode - 改一个变量名 - 修一个明显的 typo - 加一行日志 判断标准很简单:如果这个任务的实现方式只有一种,直接做。如果有多种选择,先规划。 --- ## 四、子 AGENT:CLAUDE CODE 的分身术 子 Agent 是 Claude Code 的一个强大机制——它可以启动独立的 AI 进程来并行处理任务,每个子 Agent 有自己的上下文窗口,不会污染你的主对话。 ### 内置的子 Agent 类型 | 类型 | 能力 | 用途 | |------|------|------| | Explore | 只读 | 快速搜索代码库探索、找文件、找定义 | | Plan | 只读 | 研究分析Plan Mode 下的代码分析 | | General | 完整能力 | 复杂的多步骤任务 | ### 子 Agent 最大的价值:隔离上下文 当你让 Claude 跑测试、分析日志、搜索大量文件时,这些操作会产生海量输出,塞满你的上下文窗口。用子 Agent 来做这些事,输出留在子 Agent 的上下文里,只有摘要返回给你。 比如: > "用子 Agent 跑一下全量测试,把失败的用例列出来" > "用子 Agent 搜索所有使用了 deprecated API 的文件" ### 后台运行:Ctrl+B 按 Ctrl+B 可以把子 Agent 放到后台运行。你可以继续和 Claude 聊其他事,等后台任务完成后会自动通知你。 适合: - 跑测试套件(通常需要几分钟) - 大范围代码搜索 - 不紧急的代码审查 ### 自定义子 Agent 你可以在 .claude/agents/ 目录下创建自定义 Agent: ```yaml --- name: code-reviewer description: 代码审查专家。代码改动后自动触发。 tools: Read, Grep, Glob, Bash model: sonnet --- 你是一位资深代码审查者。检查以下维度: - 代码清晰度和可读性 - 错误处理是否完整 - 有没有暴露敏感信息 - 输入验证 - 然后在对话中用 @code-reviewer (agent)" 调用它。 ``` --- ## 五、上下文管理:最容易被忽视的关键 Claude Code 的上下文窗口虽然大(最多 1M token),但它不是无限的,而且上下文管理直接决定了输出质量。 ### 上下文里都装了什么 - 你的对话历史 - Claude 读取的所有文件内容 - 命令执行的输出 - CLAUDE.md 文件(每次都加载) - Memory 文件(前 200 行) - 加载的 Skill 和 MCP 工具定义 ### 五个实用策略 1. **/clear :一件事做完就清** 不要在同一个对话里又修 bug 又加功能又重构。/clear 会清空上下文但保留 CLAUDE.md,相当于一次免费的重启。 2. **/compact :手动压缩上下文** 当对话变长时,输入 /compact 让 Claude 自动总结和压缩之前的对话。更好的用法是**给压缩加一个焦点**: /compact 专注于 API 改动和测试结果 这样 Claude 在压缩时会优先保留你关心的内容。 3. **/context :看看上下文被谁吃了** 输入 /context 可以看到当前上下文的使用情况——哪些文件占了多少 token,MCP 工具定义占了多少。我经常发现一些没用的 MCP server 占了大量空间。 4. **用子 Agent 隔离噪声** 跑测试、分析日志这些操作会产生大量输出。让子 Agent 去做,主对话的上下文保持干净。 5. **在 CLAUDE.md 里写压缩保留指令** 你可以告诉 Claude 压缩时必须保留什么: ``` # 压缩指令 压缩上下文时,始终保留: - 已修改文件的完整列表 - 测试命令和结果 - 关键的架构决策 ``` ### Memory vs CLAUDE.md **Memory 适合存什么:** 你的偏好("这个人喜欢简洁回复")、项目约定("部署有个特殊步骤")、历史决策("上次选了方案 A 是因为 X")。 **Memory 不适合存什么:** 代码细节、Git 历史、临时状态——这些从代码和 Git 里获取更准确。 用 /memory 命令可以查看和管理所有已加载的 Memory。 --- ## 六、权限管理:安全和效率的平衡 Claude Code 提供了五种权限模式,用 Shift+Tab 在对话中循环切换。 ### 权限规则配置 在 .claude/settings.json 里,你可以精细控制每种工具的权限: ```json { "permissions": { "allow": [ "Bash(npm run *)", "Bash(git commit *", "Edit(src/**/*.ts)", "Read(*.md)" ], "deny": [ "Bash(rm -rf *)", "Edit(.env)" ] } } ``` 规则优先级:deny → ask → allow(deny 最优先)。 这意味着你可以大胆地 allow 常用命令,同时用 deny 保护敏感文件。比如 .env 文件,无论如何都不应该被编辑。 ### 设置文件的层级 和 CLAUDE.md 类似,settings 也有多级: ``` 组织策略(最高优先级) ↓ CLI 参数 ↓ .claude/settings.local.json(本地,不提交到 Git) ↓ .claude/settings.json(项目级,团队共享) ↓ ~/.claude/settings.json(全局,个人) ↓ 默认值(最低优先级) ``` 我的建议:把团队共享的规则放 .claude/settings.json,个人偏好放 ~/.claude/settings.json,敏感配置放 .claude/settings.local.json(记得加到 .gitignore)。 --- ## 七、HOOKS:让规则变成铁律 CLAUDE.md 里的指令是"建议"——Claude 大部分时候会遵守,但偶尔会忘。Hooks 是"铁律"——无论如何都会执行。 Hooks 是在特定生命周期事件上自动触发的 shell 命令。配置在 settings.json 里。 ### 关键事件类型 | 事件 | 触发时机 | |------|----------| | PreToolUse | 工具执行前 | | PostToolUse | 工具执行后 | | Notification | 通知事件 | | Stop | 对话结束时 | ### 实用示例 **自动格式化——每次编辑后运行 Prettier:** ```json { "hooks": { "PostToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }] }] } } ``` **保护关键文件——阻止修改生产配置:** ```json { "hooks": { "PreToolUse": [{ "matcher": "Edit|Write", "hooks": [{ "type": "command", "command": ".claude/hooks/protect-files.sh" }] }] } } ``` Hook 命令返回 exit code 0 表示允许,exit code 2 表示阻止。这意味着你可以写任意复杂的判断逻辑。 **上下文压缩后重新注入关键信息:** ```json { "hooks": { "SessionStart": [{ "matcher": "compact", "hooks": [{ "type": "command", "command": "echo '用 Bun 不用 npm。提交前跑 bun test。'" }] }] } } ``` 这解决了一个常见痛点:对话太长被压缩后,之前提过的重要指令可能丢失。用 Hook 可以在每次压缩后自动重新注入。 ### Hook 的四种类型 | 类型 | 说明 | |------|------| | command | 执行 shell 命令,从 stdin 读取 JSON | | http | 向 URL 发送 POST 请求 | | prompt | 单次 LLM 调用,做 yes/no 判断 | | agent | 启动一个子 Agent 进行验证 | --- ## 八、GIT 工作流:用好 WORKTREE Claude Code 能执行 Git 命令,这是一把双刃剑。但官方提供了一个很好的安全网:Worktree。 ### Git Worktree:隔离的工作空间 ``` # 在隔离的 worktree 中启动 Claude claude --worktree feature-auth claude --worktree bugfix-123 # 自动生成名字 claude --worktree ``` Worktree 会在 .claude/worktrees/ 下创建一个独立的 Git 分支副本。Claude 在里面怎么折腾都不影响你的主分支。退出时: - 如果没有改动 → 自动清理 - 如果有改动 → 提示你保留或删除 这对于探索性任务特别有用。不确定某个重构方案能不能行?开个 worktree 试试,不行就扔掉,零风险。 ### 几个 Git 铁律 1. **永远不要让 Claude Code 自动 push** 它可以 commit,但 push 这个动作应该由你来确认。一旦 push 到远端,回退成本就大了。 2. **频繁 commit** 做完一个小功能就 commit。用 /rewind 可以回退到任意一个 checkpoint,但前提是你有 commit 记录。 3. **警惕破坏性操作** 如果 Claude Code 要执行 git reset --hard、git push --force、rm -rf,一定要再脑子里过一遍后果再批准。这些操作没有 undo。你也可以在权限规则里直接 deny 掉这些命令。 4. **从 PR 恢复上下文** 这会自动加载 PR 的改动和讨论作为上下文,非常适合 code review 或者继续别人的工作。 ``` claude --from-pr 123 ``` --- ## 九、快捷键和命令速查 这些快捷键我每天都在用,强烈建议记住: ### 最常用的快捷键 | 快捷键 | 功能 | |--------|------| | Ctrl+C | 中断 Claude | | Ctrl+V | 粘贴图片 | | Ctrl+G | 编辑计划 | | Ctrl+Shift+Enter | 提交文件(不确认) | | Shift+Tab | 切换权限模式 | ### 最常用的斜杠命令 ``` /compact [焦点] # 压缩上下文,可指定保留重点 /clear # 清空对话,重新开始 /context # 查看上下文使用情况 /memory # 查看和管理 Memory /rewind # 回退到某个 checkpoint /resume [名称] # 恢复之前的对话 /model # 切换模型 /effort [级别] # 设置推理深度:low/medium/high/max /init # 自动生成 CLAUDE.md /mcp # 管理 MCP 服务器 /permissions # 查看权限规则 /cost # 查看 token 消耗 ``` /init 对新项目特别有用——它会自动分析你的代码库,帮你生成一个 CLAUDE.md 的初稿。虽然通常需要手动调整,但比从零开始快得多。 --- ## 十、EXTENDED THINKING:让 CLAUDE 想深一点 对于复杂问题,你可以开启 Extended Thinking 模式,让 Claude 在回答前花更多时间推理。 ### 怎么用 ``` # 快捷键切换 Option+T (Mac) / Alt+T (Windows/Linux) # 或者用命令 /effort high # 更深入的推理 /effort max # 最大推理深度 /effort low # 简单任务,省 token ``` ### 什么时候该用 - 复杂的架构决策 - 棘手的 debug(多个可能原因需要排除) - 多步骤的重构方案设计 - 权衡多个方案的利弊 ### 什么时候不需要 - 简单的代码修改 - 格式化、重命名 - 已经很明确的 bug 修复 小技巧:在提示词里写 ultrathink 可以强制触发最高推理深度,不需要手动调整 effort 设置。 --- ## 十一、MCP SERVER:让 CLAUDE 连接外部世界 MCP(Model Context Protocol)让 Claude Code 能和外部工具通信——GitHub、数据库、Slack、Notion 等等。 ### 快速添加 ```bash claude mcp add github -- npx @anthropic-ai/mcp-server-github claude mcp add postgres -- npx @anthropic-ai/mcp-server-postgres postgresql://localhost:5432/mydb ``` ### 配置文件 MCP 配置在 .mcp.json 里: ```json { "mcpServers": { "github": { "type": "stdio", "command": "npx", "args": ["@modelcontextprotocol/server-github"], "env": { "GITHUB_TOKEN": "$GITHUB_TOKEN" } } } } ``` ### 注意上下文开销 每个 MCP server 会额外消耗 100-500+ token 的工具定义。用 /mcp 命令可以查看每个 server 的开销,禁用不用的 server。 我的经验:不要贪多。常用的 2-3 个 MCP server 就够了。装太多,上下文空间被工具定义吃掉,反而影响代码分析的质量。 --- ## 十二、IDE 集成:不只是终端 ### VS Code 安装 Claude Code 扩展后,你可以在 VS Code 里直接使用 Claude,而不需要切到终端。 几个好用的功能: - **并排 diff 视图**:Claude 的改动以 diff 形式显示,一目了然 - **Option+K / Alt+K**:快速插入当前文件的 @引用 - **多标签对话**:在不同的标签页里开多个独立对话 - **Cmd+Shift+Esc**:快速打开新的对话标签 ### JetBrains IntelliJ、PyCharm、WebStorm 等 JetBrains 全家桶也有 Claude Code 插件,在 Plugins 市场搜索 "Claude Code" 安装即可。 --- ## 十三、审查代码:信任但要验证 Claude Code 写的代码质量总体不错,但你不能盲目信任。 ### 几个常见问题 1. **过度工程** 你让它写一个简单的工具函数,它给你搞出一个完整的抽象层,带泛型、带接口、带工厂模式。杀鸡用了牛刀。 解决方法:在 CLAUDE.md 里写上"优先用简单方案",或在指令里明确说"不需要抽象"。 2. **幻觉 API** 它有时候会用不存在的 API 或者过时的语法。尤其是小众库的新版本。 解决方法:跑测试。这也是为什么指令里应该包含验证标准。 3. **改动范围膨胀** 你让它改一个函数,它把整个文件都重构了。 解决方法:明确说"只改 X,不要动其他代码"。或者用 /freeze 命令限制编辑范围到指定目录。 ### Writer/Reviewer 模式 官方推荐的一个高级模式:用两个独立的会话分别扮演"写代码"和"审查代码"的角色。 两个会话有独立的上下文,Reviewer 不受 Writer 的思路影响,能发现 Writer 的盲点。 ``` 会话 A(Writer):"实现 API 限流中间件" 会话 B(Reviewer):"审查 @src/middleware/rateLimiter.ts 里的限流实现,重点看边界情况、竞态条件、一致性" 会话 A:"修复审查反馈:[粘贴 B 的输出]" ``` --- ## 十四、不要用 CLAUDE CODE 做的事 说了这么多"应该怎么做",最后聊聊"不应该做什么"。 1. **不要让它做你完全不了解的事** 如果你对 Kubernetes 一无所知,不要让 Claude Code 帮你写部署配置然后直接用。你无法审查你不懂的东西。 2. **不要在没有版本控制的环境下用** 没有 Git 就没有回退的能力。Claude Code 的改动可能覆盖你的文件,没有版本控制就是裸奔。 3. **不要一口气扔一个巨大的任务** > "把整个项目从 JavaScript 迁移到 TypeScript" 这种指令等于让 Claude Code 自由发挥。结果不可控。拆成小步骤,每一步确认后再做下一步。 4. **不要指望一次就完美** 迭代是正常的。用 /rewind 回退,用精确的反馈描述"哪里不对"。 --- ## 总结 Claude Code 的核心使用哲学其实很简单:**它是一个极其能干的协作者,但不是自动驾驶。方向盘始终在你手里。** 按重要性排序,我的建议是: 1. **写好 CLAUDE.md** — 一次投入,每次对话都受益 2. **给精确的指令** — 目标 + 约束 + 验证标准 3. **用 Plan Mode** — 复杂任务先规划再动手 4. **管理上下文** — /clear、/compact、子 Agent 5. **控制权限** — deny 危险操作,allow 常用命令 6. **频繁 commit** — 保留回退能力 做不到这些,Claude Code 只会更快地帮你制造混乱。 **工具的价值,永远取决于使用它的人。** --- > 以上结合了 Claude Code 官方文档和实战经验。如果你有更好的实践,欢迎交流。