本教程面向从未使用过 Claude Code 的开发者,系统讲解对话式AI编程的核心思维、安装配置、基础操作和首个项目交付。学完你将掌握:独立安装和配置 Claude Code、理解对话式开发的心智模型、用自然语言驱动代码编写和调试、完成一个可运行的 CLI 工具项目。预计学习时间 4-6 小时。
Claude Code 是 Anthropic 官方的 AI 编程助手,直接运行在你的终端中。它与 Cursor、GitHub Copilot 的核心区别在于:
| 特性 | Claude Code | Cursor | Copilot |
|---|---|---|---|
| 运行环境 | 原生终端 | VS Code 分支 | IDE 插件 |
| 交互方式 | 自然语言对话 | Tab 补全 + 聊天 | 行内补全 |
| 文件感知 | 全项目读写 | 当前窗口 | 当前文件 |
| 工具调用 | Bash/Read/Write/Grep/Glob | 内置 | 有限 |
| 自主性 | 可自主规划执行 | 半自动 | 被动补全 |
Claude Code 不是"代码补全工具",而是一个对话式开发伙伴。你用自然语言描述需求,它理解项目上下文,自主读取文件、编写代码、运行命令、修复错误。
传统开发的思维路径:
需求 → 分析 → 设计算法 → 编写代码 → 调试 → 测试
对话式开发的思维路径:
需求 → 用自然语言描述给 Claude → 审查结果 → 迭代优化
关键转变:你从代码编写者变为意图表达者和质量审查者。你的核心技能从"写代码"转向"准确描述需求"和"评估代码质量"。
flowchart LR
A[你的意图] -->|自然语言| B[Claude Code]
B -->|读取| C[项目文件]
B -->|执行| D[终端命令]
B -->|生成| E[代码输出]
E -->|审查| F{满意?}
F -->|否| A
F -->|是| G[提交代码]
style A fill:#4A90D9,color:#fff
style B fill:#D97706,color:#fff
style G fill:#059669,color:#fff
Claude Code 在 2026 年提供三种安装方式,按推荐顺序排列:
方式一:原生安装(Native Install)—— 推荐
# macOS / Linux
curl -fsSL https://claude.ai/install.sh | sh
# Windows(PowerShell 管理员模式)
irm https://claude.ai/install.ps1 | iex
原生安装不依赖 Node.js,二进制文件直接编译,启动更快,兼容性最好。
方式二:Homebrew(macOS 专用)
brew install claude-code
适合已使用 Homebrew 管理包的 macOS 用户,更新方便(brew upgrade claude-code)。
方式三:npm 安装(全平台通用)
npm install -g @anthropic-ai/claude-code
需要 Node.js v18+。适合没有原生包管理器或需要特定版本的场景。
claude --version
# 预期输出:Claude Code v2.1.x 或更高版本
启动 Claude Code 后会引导你完成认证。有两种方式:
方式 A:账户登录(推荐新手)
claude
# 首次启动会打开浏览器,登录 Anthropic 账户
# 免费 Plan:$5 免费额度
# Pro Plan:$20/月,更高额度
# Max Plan:$100-200/月,最高额度和模型访问
方式 B:API Key
export ANTHROPIC_API_KEY="sk-ant-xxxxx"
claude
# 直接使用 API Key 认证,按 token 计费
| 问题 | 解决方案 |
|---|---|
command not found: claude |
检查 PATH 是否包含安装目录,或重新打开终端 |
EACCES: permission denied |
npm 安装时加 --prefix ~/.local,或使用原生安装 |
| Node.js 版本过低 | nvm install 20 && nvm use 20 升级到 v20 LTS |
| Windows 上 WSL2 报错 | 确保 WSL2 已更新:wsl --update |
| macOS Gatekeeper 阻止 | 系统设置 → 隐私与安全性 → 允许运行 |
cd ~/projects # 进入你的项目目录(或任何空目录)
claude # 启动交互式会话
你会看到 Claude Code 的交互式界面,左侧是对话区,底部是输入框。
在输入框中输入:
> 你好,请帮我看看当前目录下有什么文件
Claude Code 会调用工具来查看目录内容:
我来查看当前目录的内容。
[Bash] ls -la /home/user/projects
输出:
total 8
drwxr-xr-x 2 user user 4096 May 26 10:00 .
drwxr-xr-x 18 user user 4096 May 25 09:30 ..
当前目录是空的。你想要创建什么项目?
在交互式会话中,以下斜杠命令是你的"瑞士军刀":
| 命令 | 功能 | 使用场景 |
|---|---|---|
/help |
显示所有可用命令 | 随时查看 |
/clear |
清除当前对话上下文 | 话题切换时 |
/compact |
压缩对话历史,释放上下文空间 | 长对话中途 |
/model |
切换模型(Opus/Sonnet/Haiku) | 按需选择速度/质量 |
/permissions |
管理工具权限 | 控制安全边界 |
/cost |
显示当前会话费用 | 成本监控 |
/quit 或 Ctrl+C |
退出会话 | 结束工作 |
Claude Code 每次执行操作前会请求你的许可。首次运行时你会看到:
Claude wants to read file: package.json
[Allow / Deny / Always allow for this project]
三个选项的含义: - Allow:本次允许,下次同样操作仍会询问 - Deny:拒绝本次操作 - Always allow:对当前项目永久允许此类操作
建议新手策略:前三天全部手动 Allow,熟悉 Claude Code 的行为模式后再批量授权。
Claude Code 支持三种模型,各有适用场景:
flowchart TD
A[选择模型] --> B{任务复杂度?}
B -->|简单查询/快速修改| C[Haiku<br/>最快最便宜]
B -->|日常开发/中等任务| D[Sonnet<br/>速度与质量平衡]
B -->|架构设计/复杂重构| E[Opus<br/>最强推理能力]
style C fill:#059669,color:#fff
style D fill:#D97706,color:#fff
style E fill:#7C3AED,color:#fff
| 模型 | 速度 | 成本 | 最佳场景 |
|---|---|---|---|
| Haiku | 最快 | 最低 | 格式化、简单查询、快速修复 |
| Sonnet | 中等 | 中等 | 日常编码、功能开发、调试 |
| Opus | 较慢 | 最高 | 架构设计、复杂重构、代码审查 |
新手建议:默认使用 Sonnet,遇到困难问题时切换到 Opus。
Claude Code 通过五大工具与你的项目交互。理解这些工具,你就理解了 Claude Code 的能力边界。
> 请看看 src/index.js 的内容
Claude Code 调用 Read 工具读取文件,然后分析内容。它一次能读取约 2000 行,超出部分会分段读取。
> 请创建一个 README.md,内容是项目说明
Claude Code 会生成文件内容并调用 Write 工具创建文件。对于已存在的文件,使用 Edit 工具进行精确修改。
> 运行 npm test 看看测试是否通过
Claude Code 通过 Bash 工具执行命令。这是最需要关注安全性的工具——它会请求你的许可后才执行。
> 项目里有哪些 TypeScript 文件?
Claude Code 使用 Glob 按模式匹配查找文件,如 **/*.ts。
> 哪些文件引用了 express 模块?
Claude Code 使用 Grep 搜索文件内容,支持正则表达式。
flowchart TB
subgraph "Claude Code 五大工具"
A[Read<br/>读取文件内容]
B[Write/Edit<br/>创建/修改文件]
C[Bash<br/>执行终端命令]
D[Glob<br/>按模式搜索文件名]
E[Grep<br/>按内容搜索文件]
end
subgraph "你的项目"
F[源代码文件]
G[配置文件]
H[测试文件]
I[终端/Shell]
end
A --> F
A --> G
B --> F
B --> G
B --> H
C --> I
D --> F
E --> F
style A fill:#4A90D9,color:#fff
style B fill:#059669,color:#fff
style C fill:#D97706,color:#fff
style D fill:#7C3AED,color:#fff
style E fill:#DC2626,color:#fff
每次启动新会话,Claude Code 默认不记得你的项目偏好。CLAUDE.md 是一个 Markdown 文件,告诉 Claude Code 你的项目规则、技术栈、编码风格等。
flowchart BT
A["~/.claude/CLAUDE.md<br/>全局规则<br/>所有项目生效"] --> B["项目根/CLAUDE.md<br/>项目级规则<br/>团队共享"]
B --> C["项目根/.claude/CLAUDE.md<br/>同上,放 .claude 目录"]
C --> D["子目录/CLAUDE.md<br/>模块级规则"]
D --> E["~/.claude/CLAUDE.local.md<br/>个人本地规则<br/>不提交到 Git"]
style A fill:#DC2626,color:#fff
style B fill:#D97706,color:#fff
style C fill:#D97706,color:#fff
style D fill:#4A90D9,color:#fff
style E fill:#059669,color:#fff
在项目根目录创建 CLAUDE.md:
# 项目说明
这是一个 [项目名称],使用 [技术栈]。
# 开发规则
- 使用 TypeScript strict 模式
- 代码注释使用英文
- 提交信息格式:feat/fix/docs: 简短描述
# 常用命令
- 启动开发:npm run dev
- 运行测试:npm test
- 构建项目:npm run build
# 注意事项
- 不要修改 .env 文件
- 测试覆盖率不低于 80%
在会话中输入:
> 请描述一下当前项目的规则和约束
Claude Code 会读取 CLAUDE.md 并复述其中的规则。如果回复正确,说明配置生效。
现在我们来构建一个完整的 CLI 工具,体验从零到交付的全过程。
构建一个名为 quicknote 的命令行笔记工具,功能:
- 添加笔记:quicknote add "今天学到了对话式开发"
- 列出笔记:quicknote list
- 搜索笔记:quicknote search "对话式"
- 删除笔记:quicknote delete 3
- 笔记存储在 ~/.quicknote/notes.json
mkdir quicknote && cd quicknote
git init
claude
在 Claude Code 会话中输入:
> 我想创建一个命令行笔记工具 quicknote。使用 Node.js 和 TypeScript。
> 功能包括:add、list、search、delete 四个子命令。
> 笔记存储在 ~/.quicknote/notes.json,每条笔记有 id、内容、创建时间。
> 请帮我初始化项目结构,创建 package.json 和 tsconfig.json。
Claude Code 会执行以下操作:
1. 运行 npm init -y 创建 package.json
2. 安装 TypeScript 和相关依赖
3. 创建 tsconfig.json
4. 搭建基础目录结构
继续在会话中输入:
> 请实现 quicknote 的核心功能。入口文件是 src/index.ts。
> 使用 commander 库处理命令行参数,用 chalk 给输出加颜色。
Claude Code 生成的代码结构如下:
quicknote/
├── src/
│ ├── index.ts # 入口,命令行解析
│ ├── store.ts # 数据存储层
│ └── types.ts # 类型定义
├── package.json
├── tsconfig.json
└── CLAUDE.md
src/types.ts:
export interface Note {
id: number;
content: string;
createdAt: string;
}
src/store.ts:
import * as fs from 'fs';
import * as path from 'path';
import { Note } from './types';
const NOTES_DIR = path.join(process.env.HOME || '~', '.quicknote');
const NOTES_FILE = path.join(NOTES_DIR, 'notes.json');
function ensureFile(): void {
if (!fs.existsSync(NOTES_DIR)) {
fs.mkdirSync(NOTES_DIR, { recursive: true });
}
if (!fs.existsSync(NOTES_FILE)) {
fs.writeFileSync(NOTES_FILE, JSON.stringify([], null, 2));
}
}
export function loadNotes(): Note[] {
ensureFile();
const data = fs.readFileSync(NOTES_FILE, 'utf-8');
return JSON.parse(data);
}
export function saveNotes(notes: Note[]): void {
ensureFile();
fs.writeFileSync(NOTES_FILE, JSON.stringify(notes, null, 2));
}
export function addNote(content: string): Note {
const notes = loadNotes();
const note: Note = {
id: notes.length > 0 ? Math.max(...notes.map(n => n.id)) + 1 : 1,
content,
createdAt: new Date().toISOString(),
};
notes.push(note);
saveNotes(notes);
return note;
}
export function searchNotes(keyword: string): Note[] {
return loadNotes().filter(n =>
n.content.toLowerCase().includes(keyword.toLowerCase())
);
}
export function deleteNote(id: number): boolean {
const notes = loadNotes();
const index = notes.findIndex(n => n.id === id);
if (index === -1) return false;
notes.splice(index, 1);
saveNotes(notes);
return true;
}
src/index.ts:
#!/usr/bin/env node
import { Command } from 'commander';
import chalk from 'chalk';
import { addNote, loadNotes, searchNotes, deleteNote } from './store';
const program = new Command();
program
.name('quicknote')
.description('一个简单的命令行笔记工具')
.version('1.0.0');
program
.command('add <content>')
.description('添加一条笔记')
.action((content: string) => {
const note = addNote(content);
console.log(chalk.green(`✓ 笔记已添加 [${note.id}] ${note.content}`));
});
program
.command('list')
.description('列出所有笔记')
.action(() => {
const notes = loadNotes();
if (notes.length === 0) {
console.log(chalk.yellow('暂无笔记'));
return;
}
notes.forEach(note => {
const time = new Date(note.createdAt).toLocaleString('zh-CN');
console.log(
chalk.blue(`[${note.id}]`) + ` ${note.content} ` +
chalk.gray(time)
);
});
});
program
.command('search <keyword>')
.description('搜索笔记')
.action((keyword: string) => {
const results = searchNotes(keyword);
if (results.length === 0) {
console.log(chalk.yellow(`未找到包含 "${keyword}" 的笔记`));
return;
}
results.forEach(note => {
console.log(chalk.blue(`[${note.id}]`) + ` ${note.content}`);
});
});
program
.command('delete <id>')
.description('删除指定ID的笔记')
.action((id: string) => {
const success = deleteNote(parseInt(id, 10));
if (success) {
console.log(chalk.green(`✓ 笔记 [${id}] 已删除`));
} else {
console.log(chalk.red(`✗ 未找到笔记 [${id}]`));
}
});
program.parse();
> 请更新 package.json,添加 bin 字段和 build 脚本,
> 然后运行 npm run build 验证编译通过。
Claude Code 会更新 package.json:
{
"name": "quicknote",
"version": "1.0.0",
"bin": {
"quicknote": "./dist/index.js"
},
"scripts": {
"build": "tsc",
"dev": "ts-node src/index.ts"
},
"dependencies": {
"commander": "^12.0.0",
"chalk": "^5.3.0"
},
"devDependencies": {
"typescript": "^5.4.0",
"@types/node": "^20.0.0",
"ts-node": "^10.9.0"
}
}
> 请用 npm link 安装到全局,然后运行 quicknote add "我的第一条笔记" 测试功能。
> 接着运行 quicknote list 确认笔记已保存。
预期输出:
✓ 笔记已添加 [1] 我的第一条笔记
[1] 我的第一条笔记 2026/5/26 14:30:00
> 请为 store.ts 添加单元测试。使用 vitest 框架。
> 测试覆盖:添加笔记、列出笔记、搜索笔记、删除笔记四个场景。
Claude Code 会创建 src/__tests__/store.test.ts:
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import * as fs from 'fs';
import * as path from 'path';
import { addNote, loadNotes, searchNotes, deleteNote } from '../store';
const NOTES_FILE = path.join(
process.env.HOME || '~', '.quicknote', 'notes.json'
);
describe('Store', () => {
beforeEach(() => {
if (fs.existsSync(NOTES_FILE)) {
fs.unlinkSync(NOTES_FILE);
}
});
it('should add a note', () => {
const note = addNote('测试笔记');
expect(note.id).toBe(1);
expect(note.content).toBe('测试笔记');
expect(note.createdAt).toBeDefined();
});
it('should list all notes', () => {
addNote('笔记A');
addNote('笔记B');
const notes = loadNotes();
expect(notes).toHaveLength(2);
});
it('should search notes by keyword', () => {
addNote('学习 TypeScript');
addNote('学习 React');
addNote('做饭');
const results = searchNotes('学习');
expect(results).toHaveLength(2);
});
it('should delete a note by id', () => {
addNote('待删除');
addNote('保留');
const deleted = deleteNote(1);
expect(deleted).toBe(true);
expect(loadNotes()).toHaveLength(1);
});
it('should return false for non-existent id', () => {
const deleted = deleteNote(999);
expect(deleted).toBe(false);
});
});
> 请运行测试,确保全部通过。如果失败请修复。
> npm test
✓ src/__tests__/store.test.ts (5)
✓ Store > should add a note
✓ Store > should list all notes
✓ Store > should search notes by keyword
✓ Store > should delete a note by id
✓ Store > should return false for non-existent id
Test Files 1 passed (1)
Tests 5 passed (5)
flowchart TD
A["1. mkdir quicknote && cd quicknote"] --> B["2. git init"]
B --> C["3. claude 启动会话"]
C --> D["4. 描述需求:初始化项目"]
D --> E["5. Claude 创建 package.json"]
E --> F["6. 描述需求:实现核心功能"]
F --> G["7. Claude 编写 store.ts + index.ts"]
G --> H["8. 描述需求:添加测试"]
H --> I["9. Claude 创建 store.test.ts"]
I --> J["10. npm test 验证"]
J --> K{测试通过?}
K -->|是| L["11. npm link 全局安装"]
K -->|否| M["12. 让 Claude 修复"]
M --> J
L --> N["13. 实际测试 quicknote 命令"]
N --> O["✓ 项目交付完成"]
style C fill:#D97706,color:#fff
style O fill:#059669,color:#fff
关闭终端后,你可以恢复之前的对话:
# 继续最近的会话
claude --continue
# 恢复指定会话
claude --resume abc123
# 查看历史会话
claude --sessions
Claude Code 的上下文窗口有限(约 200K tokens)。长对话中你会看到:
Context window usage: 85%. Consider using /compact.
此时使用 /compact 命令压缩对话历史。Claude Code 会保留关键信息,丢弃冗余细节。
对于简单的单次查询,使用 -p 标志:
# 查询式使用
claude -p "这个项目的依赖有哪些"
# 管道输入
cat error.log | claude -p "分析这个错误日志的原因"
# 不好
> 优化一下代码
# 好的
> 请把 src/utils.ts 中的 formatDate 函数重构为纯函数,
> 去除对全局变量 timezone 的依赖,改为参数传入。
原则:具体说明文件、函数、期望行为。
# 不好
> 帮我实现用户注册、登录、权限管理、个人资料编辑全部功能
# 好的
> 先实现用户注册功能,包含表单验证和密码加密
原则:拆分为小步骤,逐步推进。
Claude Code 生成的代码可能有逻辑错误或安全问题。始终审查关键代码。
没有 CLAUDE.md,每次新会话 Claude Code 都要从零了解你的项目。花 10 分钟写好 CLAUDE.md,后面省 10 小时。
前三天建议逐条 Allow。了解 Claude Code 会执行哪些操作后,再对安全的操作类型使用 Always Allow。
Claude Code 会修改文件。频繁提交让你随时可以回退:
git add -A && git commit -m "feat: 添加笔记存储功能"
不要在包含 .env、密钥文件的目录中启动 Claude Code。使用 .gitignore 和 .claudeignore 排除敏感文件。
使用 /cost 定期检查费用。Opus 模型的成本是 Sonnet 的 5 倍、Haiku 的 25 倍。
对复杂任务,先进入 Plan 模式让 Claude Code 规划方案:
> 请进入 Plan 模式,分析重构数据库层的方案,不要直接修改代码
Plan 模式下 Claude Code 只读取和分析,不修改文件,适合规划和审查阶段。
用 @文件名 直接引用文件,让 Claude Code 精确知道你要讨论什么:
> 请看看 @src/store.ts 的 addNote 函数,有一个边界条件没有处理
以下是一个标准的功能开发工作流,适用于大多数项目:
sequenceDiagram
participant Dev as 开发者
participant CC as Claude Code
participant Git as Git 仓库
participant FS as 文件系统
Dev->>CC: 描述功能需求
CC->>FS: 读取相关文件
CC->>CC: 规划实现方案
CC->>Dev: 展示计划(Plan 模式)
Dev->>CC: 确认方案
CC->>FS: 创建/修改文件
CC->>Dev: 展示改动
Dev->>CC: 运行测试
CC->>FS: npm test
CC->>Dev: 测试结果
Dev->>Git: git commit
Dev->>CC: 下一个需求...
对话式开发的黄金法则:
| 维度 | 评估 |
|---|---|
| 适合训练营类型 | AI编程入门营、全栈开发训练营第一课、企业数字化转型培训 |
| 教学时长 | 4-6 小时(含实操) |
| 学员基础要求 | 会使用终端和 Git,了解任一编程语言基础 |
| 实操设备要求 | 每人一台笔记本(macOS/Linux/WSL2),可联网 |
| 课程密度 | 高——从安装到交付一个完整项目 |
| 建议分组 | 2-3 人一组,互相审查 Claude Code 生成的代码 |
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
