Skip to content

2.5 文件引用与上下文

预计耗时:12 分钟

本关任务简报

很多新手问 Claude 问题时是这样的:"帮我优化这个函数"——然后发现回答很泛,感觉 Claude 在猜你在说什么。

问题不是 Claude 不够聪明,而是它没看见你的代码

Claude Code 不会自动读取你的整个项目。当你问问题时,它只能看到当前对话里已经有的信息。如果你没有明确把文件内容带进来,它就只能根据文字描述来猜。

这一关解决的就是这个问题:如何精准地把文件、命令输出、网页内容注入到对话里,让 Claude 基于真实内容回答,而不是凭空推测。


通关奖励:解锁以下技能

  • 📂 用 @文件名 把文件内容带入对话
  • 📁 引用整个目录或用 glob 模式批量引用文件
  • 🌐 直接粘贴 URL 让 Claude 读取网页内容
  • ⚡ 用 !命令 执行 shell 命令并把结果注入对话
  • 💡 知道什么时候需要主动引用上下文,什么时候 Claude 会自己去读

开始前先检查装备

前置知识说明
2.3 斜杠命令指南 →理解输入框里 @!/ 三种前缀的区别——本关主要讲前两个

机制解析

Claude 怎么获取文件内容

有两种方式:

方式一:Claude 自己主动去读

当你说"帮我看看 src/utils.ts 有没有问题"时,Claude 会自己调用 Read 工具读取这个文件,不需要你手动引用。

方式二:你主动用 @ 把内容带进来

当你说 @src/utils.ts 帮我看看有没有问题,文件内容会作为你消息的一部分直接放进对话上下文,Claude 在开始思考前就已经看到了。

大多数时候两种方式效果相似。但有一个明显的差别:你想让 Claude 对比多个文件、或者在提问的同时就让它看到内容时,主动引用更直接。


@文件 — 引用单个文件

在输入框输入 @ 后会自动触发文件路径补全,继续输入文件名可以筛选:

text
@src/utils/auth.ts 这个函数的逻辑有什么问题?
text
@package.json @tsconfig.json 帮我检查这两个配置是否一致

支持相对路径和绝对路径,可以同时引用多个文件。


@目录/ — 引用整个目录

text
@src/components/ 帮我梳理一下这些组件的职责分工

引用目录时,Claude 会读取该目录下的所有文件。注意 token 消耗——一个大目录可能消耗大量上下文空间,用 /cost 查看当前用量。


Glob 模式 — 批量引用符合条件的文件

text
@src/**/*.test.ts 检查测试文件的覆盖情况
text
@**/*.md 帮我整理一下所有文档的主题和结构

支持标准 glob 语法,可以跨目录批量引用同类型文件。


粘贴 URL — 引用网页内容

网页不走 @@ 只补全本地文件路径),直接把 URL 贴进消息即可,Claude 会自动抓取网页内容加入上下文:

text
https://docs.example.com/api 根据这份文档帮我写一个调用示例

适合引用 API 文档、README、技术规范等公开页面。

限制:需要登录才能访问的页面无法直接抓取。如果页面需要浏览器渲染(JavaScript 动态加载),需要配置 Playwright MCP 才能正常获取内容(见 2.12 MCP 服务器 →)。


!命令 — 执行命令并注入结果

! 前缀让 Claude 执行一条 shell 命令,并把命令输出自动带入对话:

text
!npm run test
帮我分析测试失败的原因
text
!git log --oneline -20
总结一下最近 20 次提交做了什么,有没有值得关注的风险
text
!cat error.log
这段错误日志说明什么问题?

! 和普通问话的区别:如果你直接说"帮我分析测试结果",Claude 需要自己调用工具跑一次测试。用 !npm run test 是你先跑好,把结果交给 Claude 分析,效率更高。


什么时候不需要手动引用

Claude Code 在以下情况会自己去读文件,不需要你 @

  • 你说"帮我看 xxx.py"——它会自己 Read
  • 它在执行任务时需要了解某个文件——它会主动读
  • 你让它修改代码——它会先读再改

需要你主动引用的场景

  • 你想在提问的同时就带上内容,让回答更精准
  • 你需要 Claude 同时对比多个文件
  • 你已经有了命令输出,想直接把结果传给 Claude(用 !
  • 你想引用外部 URL 的内容

控制 token 消耗

引用大量内容时,token 消耗会快速增加。几个实用技巧:

  • 引用前先用 /cost 看看当前用量
  • 能引用具体文件就不要引用整个目录
  • 对话太长时用 /compact 压缩,或 /clear 开新会话
  • 引用 URL 时优先选内容精简的文档页面,避免引用首页或长文

开始闯关

目标:用 @ 引用一个真实文件,让 Claude 基于文件内容回答你的问题。

第 1 步:用 @ 引用一个文件

在你的项目里找一个文件(比如 README.mdpackage.json),在输入框里输入:

text
@README.md 帮我用一句话总结这个项目是做什么的

观察 Claude 的回答——它应该基于文件的实际内容来回答,而不是说"我不知道这个项目是什么"。

第 2 步:用 ! 把命令结果带进来

如果你的项目有 git,输入:

text
!git status
根据这个状态,告诉我现在有哪些未提交的改动

观察 Claude 是基于实际的 git 状态来回答的,而不是通用解释。


通关检定

  • [ ] 用 @文件名 成功引用了一个文件,Claude 的回答明显基于文件内容
  • [ ] 知道输入 @ 会触发路径补全
  • [ ] 用 !命令 成功把命令输出带进了对话
  • [ ] 知道引用目录和大文件时要注意 token 消耗
  • [ ] 知道什么时候需要主动引用、什么时候 Claude 会自己读

全部点亮就算通关 ✓


卡关了?翻车指南在这

粘贴网页 URL,但 Claude 说读取失败或内容不对

常见原因:① 页面需要登录才能访问;② 页面依赖 JavaScript 渲染,静态抓取拿不到内容。前者换成不需要登录的公开 URL,后者需要配置 Playwright MCP。

引用了文件,但 Claude 说"我没有看到这个文件的内容"

踩坑清单:① 检查路径是否正确,相对路径从当前工作目录起算;② 确认文件存在且不为空;③ 文件编码如果不是 UTF-8 可能导致读取失败。

!命令 执行了,但 Claude 没有基于输出回答

!命令 和你的问题放在同一条消息里,而不是先发命令、再发问题。Claude 在处理你的消息时才会把 ! 的输出注入上下文。

引用了一个大目录,对话变得很慢

大目录会消耗大量 token,导致响应变慢甚至超出限制。改为只引用具体需要的文件,或者直接告诉 Claude 文件路径让它自己去读。


下一关

2.6 会话管理 →

每次对话的上下文都是有限的——这一关告诉你如何合理管理对话的生命周期,在该清空时清空,在需要继续时接续。

面向公开用户维护,内容基于 Claude Code 官方文档与真实使用经验整理