如何用 Claude Code 高效编程
# 我用Claude Code写了一周代码——这些才是真正管用的招数
上周二,我碰壁了。我盯着一个TypeScript错误——`类型“undefined”不能赋值给类型“string”`——这个错误遍布我接手的一个React Native项目的47个文件。前任开发者没留下任何测试、注释,还把`undefined`像烫手山芋一样穿过六层props传递。我通常的做法——grep搜索、逐个文件修复、重复操作——得花两天时间。
我打开终端,输入`claude code`,看着它在不到四分钟内重写了整个props类型定义。七个文件被修改。零回归(我检查过了)。就在那一刻,我不再把Claude Code当成玩具,而是开始像使用一个永不休息的高级开发者那样用它。
以下是我具体的使用方法、它会在哪里出问题,以及如果你不小心会在哪里浪费时间。
## Claude Code到底是什么
Claude Code是Anthropic开发的基于终端的编码助手。它在你现有的项目目录中运行,读取你的文件,并能直接编辑它们。与Cursor或GitHub Copilot的聊天功能不同,这个东西直接操作你的文件系统——它可以执行`git commit`、运行测试,甚至在对话中途安装`npm`依赖。
我在macOS(Apple Silicon)上测试过,但它也能在Linux和通过WSL2的Windows上运行。安装只需一行命令:
```bash
npm install -g @anthropic-ai/claude-code
```
然后用你的API密钥进行身份验证。你需要一个付费的Anthropic账户——免费版处理不了玩具项目以外的任何任务。
## 帮我省下数小时的设置
在让Claude做任何事情之前,先在项目根目录运行这个:
```bash
claude code
```
这会打开一个交互式会话。我做的第一件事是给它提供上下文:
```
我正在开发一个使用TypeScript的React Native应用。项目使用了:
- React Navigation v6
- Redux Toolkit管理状态
- Jest + React Native Testing Library进行测试
- 目前没有配置linter
请读取package.json和tsconfig.json,然后告诉我你对这个项目的理解。
```
这一步至关重要。Claude Code会扫描你的项目结构并在整个会话中记住它。我发现它在持续20-30分钟的活跃对话后开始忘记文件路径。如果你在处理复杂任务,每小时重启一次会话。
## 真实案例:重构一个混乱的组件
这是Claude Code大显身手的地方。我有一个800行的`UserProfile`组件,混合了API调用、表单状态和渲染逻辑。我给了它这个提示:
```
找出src/components中所有超过300行的组件。
对每个组件,建议一个重构方案,将其拆分为:
- 一个用于逻辑的自定义hook
- 一个用于渲染的展示组件
- 保持相同的公共API(props接口)
将方案写入REFACTOR.md,然后在进行修改前征求我的意见。
```
Claude Code读取了目录中每个`.tsx`文件,识别出三个臃肿的组件,并写了一个详细的方案。然后它请求允许继续。我同意了,然后它:
1. 创建了包含所有状态逻辑的`useUserProfile.ts`
2. 创建了只包含JSX的`UserProfileView.tsx`
3. 更新了原始的`UserProfile.tsx`来组合这两者
4. 运行了`npx tsc --noEmit`检查类型错误
5. 向我展示了差异
整个过程大约花了90秒。差异看起来是这样的:
```diff
- const UserProfile: React.FC<UserProfileProps> = ({ userId, onError }) => {
- const [user, setUser] = useState<User | null>(null);
- const [loading, setLoading] = useState(true);
- const [error, setError] = useState<string | null>(null);
-
- useEffect(() => {
- fetchUser(userId).then(setUser).catch(setError).finally(() => setLoading(false));
- }, [userId]);
-
- // 200多行渲染代码...
- }
+ const UserProfile: React.FC<UserProfileProps> = (props) => {
+ const { user, loading, error } = useUserProfile(props.userId);
+ return <UserProfileView user={user} loading={loading} error={error} onError={props.onError} />;
+ }
```
## 它会在哪里出问题(以及如何修复)
到目前为止,我遇到了三个硬性限制。
**1. 它会幻觉出文件路径。** 我让它"更新auth中间件",它创建了`src/middleware/auth.ts`,而实际文件在`server/middleware/auth.js`。解决方法:始终在提示中指定完整的相对路径。
**2. 它无法处理循环依赖。** 当我让它重构一个有循环导入的模块时,它创建了无法编译的文件。错误信息也很晦涩。解决方法:在要求重构之前运行`npx madge --circular src/`,并提前告诉Claude任何循环依赖。
**3. 它会忘记测试文件。** 我让它"给API客户端添加错误处理",它更新了源文件但没有修改对应的测试文件。当我运行测试时,它们失败了,因为模拟数据与新的类型不匹配。解决方法:明确说"同时更新`src/__tests__/api.test.ts`测试文件以匹配修改"。
## 从不失败的提示模式
经过几十次会话,我总结出一个90%情况下有效的结构:
```
上下文:[一句话描述项目]
任务:[一句话描述要做什么]
约束条件:[列出绝对不能做的事情]
验证方法:[如何检查是否成功]
```
示例:
```
上下文:这是一个使用Prisma ORM的Express.js API。
任务:为GET /users端点添加分页功能。使用基于游标的分页,使用`cursor`和`take`查询参数。
约束条件:
- 不要修改现有的响应结构——添加`cursor`和`hasMore`字段
- 保持现有的错误处理模式
- 不要安装任何新包
验证方法:运行`npm test`确认所有现有测试通过,然后检查端点返回分页数据。
```
这个模式有效是因为Claude Code会被歧义搞糊涂。如果你说"提升性能",它会重写你的整个代码库。如果你说"为GET /users路由添加60秒TTL的Redis缓存",它就能精确命中。
## 真正有效的调试工作流
当出现问题的时候,我不会问"为什么这个坏了?"——那只会得到泛泛的建议。相反,我会这样做:
```
我在运行`npm run build`时遇到这个错误:
[ERROR] src/api/users.ts:42:3 - error TS2322: 类型'string | undefined'不能赋值给类型'string'
这是第40-50行的相关代码:
export function createUser(name: string | undefined): User {
return { name }; // 这里报错
}
请读取完整文件,找出为什么name在调用处可能是undefined,并提出一个不改变函数签名的修复方案。
```
Claude Code会追踪调用栈,找到undefined的来源,并提出修复方案。它发现了一个情况:路由处理器在调用`createUser`之前没有验证请求体。这为我节省了20分钟的手动追踪时间。
## 我希望早点知道的一件事
Claude Code有一个`--resume`标志,可以让你从上次中断的地方继续。但诀窍在于:它只在保存会话的情况下有效。这样做:
```bash
claude code --resume
```
如果你看到"未找到之前的会话",说明你从未保存过会话,或者你在没有保存的情况下关闭了终端。会话会在退出时自动保存,但如果你强制退出终端,就会丢失。
另外,Claude Code默认会在不询问的情况下写入文件。我曾经因此丢失了一个配置文件。在你的项目根目录创建`.claude`项目文件,添加以下内容:
```yaml
ask_before_edit: true
safe_files:
- "*.env"
- "node_modules/**"
- ".git/**"
```
这帮我避免了意外将API密钥提交到公共仓库。
## 你的下一步(别跳过这个)
关闭这篇文章。打开你的终端。导航到一个你熟悉的小项目——少于20个文件的那种。运行`claude code`并输入:
```
读取这个项目中的每个文件。然后告诉我三件事:
1. 最可能有人遇到的bug是什么?
2. 哪段代码重复最多?
3. 哪个重构能在不改变行为的前提下提高可维护性?
在进行任何修改前先征求我的意见。
```
看看它会说什么。你很可能会惊讶于它发现的东西——我就是这样。我那个"简单"的待办事项应用在状态管理中有一个竞态条件,我几个月都没发现。
这就是Claude Code真正的力量:不是为你写代码,而是向你展示你一直忽略的东西。把它当作一个阅读每个文件的代码审查员,而不是一个代码生成器,你就再也不会回头了。