让 Codex 真正读懂前端项目:我会要求它先交这张“项目地图”
上一篇我解释了为什么让 Codex 改前端代码之前,我会先安排一个阅读阶段。
但“先读代码”也可能变成一句没有结果的口令。
如果任务只写:
请先熟悉一下项目,理解现有代码后再修改。
Codex 很可能会给出一段听起来正确的总结:项目使用 Vue3、TypeScript 和 Element Plus,目录分为 views、components、api、stores,页面采用 Composition API。
这些信息不能说错,却不足以支撑一次真实修改。
我真正想知道的不是它认不认识目录,而是:
-
当前功能从哪里进入。
-
用户操作经过哪些模块。
-
状态和业务规则分别由谁负责。
-
项目中哪个现有实现值得复用。
-
本次修改会影响哪些调用方。
-
改完以后去哪里验证。
所以我现在不会只要求“先读”,而会要求 Codex 先交一张与当前任务有关的“项目地图”。
这不是架构图,也不是仓库说明书。它是一份修改前的决策材料:让我能够检查 Codex 是否找对了入口、读清了关系、识别了风险。
项目地图不是目录树
目录树回答的是“文件放在哪里”,项目地图回答的是“一个行为怎样发生”。
例如下面这份输出,只能算目录介绍:
src/views:页面 src/components:公共组件 src/api:接口 src/stores:状态管理 src/utils:工具函数
它没有告诉我用户列表查询时,页面、分页组件、接口模块和全局状态之间到底怎样配合。
一张有用的地图应该更接近:
入口: 用户管理路由 → UserList 页面 查询流: 搜索表单 → handleQuery → 重置 pageNum → getList → getUserList → 响应转换 → tableData 分页流: Pagination 组件 → current-change / size-change → 更新 queryParams → getList 公共依赖: 权限指令控制操作入口 统一请求层处理通用网络错误 页面负责保留筛选条件和结束 Loading 参考实现: RoleList 的查询与重置流程可参考 其权限字段和表格列不可照搬
这份内容开始具备工程价值,因为它把文件、职责和行为连了起来。
OpenAI 当前的 Codex 代码库理解用例也明确指出:有效的理解结果应该形成一张具体地图,说明请求或行为流、模块职责、校验和状态变化,并指出风险位置和接下来应该阅读的文件,而不是只给一份文件名列表。
我要求项目地图至少包含六层
不同项目的结构差异很大,但面向前端修改时,我通常会固定检查下面六层。
第一层:规则地图
先回答“这个目录里的代码应该遵守什么”。
内容包括:
-
生效的 AGENTS.md 或目录规则。
-
当前任务触发的本地 Skill。
-
项目要求执行的检查。
-
明确禁止的修改。
-
遇到冲突时怎样暂停和报告。
示例:
| 项目 | 已确认内容 | 依据 |
|---|---|---|
| 项目规范 | 局部需求不得顺手修改公共请求封装 | 根目录 AGENTS.md |
| 列表规范 | 查询、重置、分页需使用项目统一流程 | 当前适用 Skill |
| 验证要求 | 修改后运行类型检查,并做页面路径验证 | 项目规则 |
| 暂停条件 | 必须改变公共组件 API 时先报告 | 项目规则 |
规则地图不应该复制整份规则文件。它只提取与当前任务直接相关的部分,并保留来源。
没有来源的“项目通常这样写”,不能自动算规则。
第二层:入口地图
回答“当前功能究竟从哪里开始”。
前端项目可能同时存在:
-
多个应用。
-
多套路由。
-
PC 和移动端页面。
-
新旧版本目录。
-
同名但用途不同的组件。
-
演示页、测试页和真实业务页。
所以入口地图至少要说明:
-
应用入口。
-
路由或菜单入口。
-
页面入口组件。
-
主要子组件。
-
首次加载时执行的初始化行为。
例如:
应用入口:管理后台 路由入口:/system/user 页面入口:src/views/system/user/index.vue 主要子组件:SearchForm、UserTable、Pagination、UserDialog 初始化:页面挂载后调用 getList
这一步的验收重点不是路径写得多,而是能否证明这是当前真实使用的入口。
如果只根据文件名猜测,就应该标记为待确认;如果通过路由注册、菜单配置或父组件引用确认,才进入“已确认”。
第三层:职责地图
回答“每一层负责什么,以及不负责什么”。
以一个列表页为例:
| 模块 | 主要职责 | 不应承担 |
|---|---|---|
| 页面 | 组织查询条件、列表状态和用户操作 | 重写通用请求机制 |
| 搜索组件 | 收集筛选条件并触发查询或重置 | 私自请求列表数据 |
| 分页组件 | 提供页码和每页数量变化 | 决定业务筛选规则 |
| 接口模块 | 定义请求入口和参数类型 | 管理页面 Loading |
| 请求层 | 处理通用网络行为 | 猜测页面失败后的业务状态 |
职责地图的价值,是防止 AI 把一个功能放到“能写的位置”,而不是“应该负责的位置”。
例如,搜索组件内部直接发请求也许能跑,但会让分页、导出和缓存很难共享同一份条件。页面里直接处理所有网络错误也许更直观,却可能重复请求层已经完成的逻辑。
当职责没有读清,AI 很容易通过增加代码解决局部问题,同时扩大模块耦合。
第四层:行为与状态地图
这一层是整张地图的核心。
我会要求 Codex 按用户操作追踪,而不是按文件顺序总结。
后台列表常见的行为至少包括:
-
首次进入。
-
点击查询。
-
点击重置。
-
切换页码。
-
修改每页数量。
-
打开新增或编辑弹窗。
-
提交成功和失败。
-
删除后重新查询。
每条行为都可以用同一种格式记录:
触发动作 → 事件处理方法 → 状态变化 → 参数转换 → 接口调用 → 响应处理 → 页面结果
例如:
点击查询 → handleQuery → queryParams.pageNum = 1 → getList → getUserList(queryParams) → 更新 tableData 和 total → finally 结束 loading
还要补异常路径:
请求失败 → 通用请求层提示网络或权限错误 → 页面结束 loading → 当前筛选条件保留 → 表格旧数据是否保留:尚未确认
这里最后一行比强行补一个答案更有价值。它暴露了当前需要确认的业务问题。
状态地图必须回答三个问题:
-
状态的唯一来源在哪里?
-
哪些操作会改变它?
-
哪些后续行为会读取它?
只看状态在哪里定义,不看谁读写,仍然不算理解状态流。
第五层:复用与差异地图
成熟项目里经常有相近页面,但不能把“相似”直接理解为“可以复制”。
我会要求 Codex 把参考实现拆成两栏:
| 可以复用的模式 | 当前任务的差异 |
|---|---|
| 查询前页码回到第一页 | 当前页面多一个时间范围转换 |
| 重置使用统一方法恢复默认值 | 当前页面有一个固定不可清空的组织条件 |
| 请求期间使用页面 Loading | 当前页面还存在独立导出 Loading |
| 分页组件事件统一接入查询 | 当前页面删除后可能需要处理空页 |
这张表迫使它回答:
-
为什么这个页面值得参考。
-
具体参考哪种行为。
-
哪些业务差异不能照搬。
-
是否存在更接近的第二个参考。
我不接受“项目中其他页面都是这样写的”这种结论,除非它列出检索范围和代表文件。
多个页面采用相同模式,才可能说明这是项目惯例;一个页面这样写,只能说明它是一个实例。
第六层:影响与验证地图
最后回答“改动会传播到哪里,以及怎样验收”。
影响地图包括:
-
目标组件的调用方。
-
目标方法的引用位置。
-
共享类型和接口。
-
可能被改变的默认行为。
-
相关测试或页面。
验证地图包括:
-
类型检查。
-
Lint、单测或构建。
-
当前功能的页面路径。
-
正常、异常和连续操作。
-
未能验证的内容。
例如:
| 风险 | 需要检查 |
|---|---|
| 查询条件与分页不同步 | 查询后翻页,再重置并重新查询 |
| 公共组件默认值变化 | 检查主要调用页面和插槽覆盖 |
| 参数转换错误 | 对比页面状态、请求参数和接口类型 |
| 异常后 Loading 不恢复 | 验证失败和取消路径 |
| 无关文件被修改 | 审查完整代码差异 |
一张项目地图如果没有验证入口,只完成了一半。
它说明了代码怎样工作,却没有说明修改后怎样证明仍然工作。
建图过程应该逐层收敛,而不是一次扫完整个仓库
我会让 Codex 按下面的顺序建立地图。
第一步:先圈定功能区域
给出路由、菜单、页面名或目录线索,要求它确认真实入口。
不要从“解释整个仓库”开始。任务范围越具体,得到的关系越具体。
第二步:读取规则和运行配置
确认当前目录生效的项目规则、关键依赖和项目脚本。
这一步解决“怎样工作”和“怎样验证”,不需要展开所有工具配置。
第三步:沿一个真实行为追踪
选择最核心的一条用户路径,例如列表查询或表单提交,从入口追到结果。
当这条主链建立后,再补重置、翻页、失败等分支。
如果一开始同时追十条行为,地图很容易再次退化成文件摘要。
第四步:查相近实现和公共依赖
用项目内检索找到:
-
相近页面。
-
公共组件。
-
工具方法。
-
类型。
-
状态管理。
-
调用方。
每找到一个依赖,都要说明它为什么与当前任务有关。
第五步:列出冲突、假设和未知
把阅读中发现的问题集中记录:
-
两个页面行为不一致。
-
规则与现有代码冲突。
-
找不到可信参考。
-
业务状态没有唯一答案。
-
关键检查无法运行。
这一步不是给地图挑毛病,而是避免下一步在未知上继续堆代码。
第六步:形成最小修改建议
项目地图完成后,才允许提出:
-
建议修改哪些文件。
-
每个文件为什么要改。
-
哪些文件只需读取、不应修改。
-
修改顺序。
-
每一步的验证证据。
注意,这仍然只是建议。只要影响范围发生变化,就应该先更新地图和计划,而不是偷偷扩大修改。
我怎样检查这张地图是不是 AI “猜”出来的
项目地图最怕看起来很完整,却没有代码依据。
我会做下面几项检查。
关键结论是否有来源
“查询由页面维护”后面应该能指出页面和方法;“错误统一处理”应该能指出请求层或项目规则;“这个组件有多个调用方”应该列出主要引用。
没有来源的结论,最多算推断。
是否区分现状与规范
代码现在这样写,不等于项目要求一直这样写。
一个旧页面的实现是现状;AGENTS.md 或稳定重复模式更接近规范;本次需求则可能要求改变现状。
地图里必须分别标出:
-
当前代码事实。
-
项目明确规则。
-
从多个实例归纳出的模式。
-
本次任务要求。
四者发生冲突时,不能悄悄选择。
是否覆盖异常和连续操作
只画“点击查询 → 请求成功 → 渲染列表”的地图太乐观。
至少还要问:
-
请求失败时状态如何恢复。
-
快速连续操作会不会重复请求。
-
重置、翻页、返回页面时状态是否一致。
-
组件关闭或卸载后是否还有异步结果返回。
前端问题常常出现在操作顺序中,而不是单个按钮上。
是否说明不知道什么
一张全是确定结论的项目地图,反而值得警惕。
历史项目里常有命名不一致、旧代码残留、业务规则缺失和验证环境不完整。合理的阅读结果应该包含未知和待确认项。
“不知道”不是失败。没有证据却给出确定答案,才是风险。
是否能直接生成验收路径
如果地图真的解释清楚了状态流和影响范围,应该能够自然推导出验收步骤。
例如:
查询会重置页码,翻页会复用当前筛选条件,重置会恢复默认条件。
对应的验收就应该包含:
设置筛选并查询 → 翻到第二页 → 点击重置 → 检查条件、页码和请求参数。
如果地图和验收之间没有关系,说明阅读结果仍然停留在目录层。
一份可以直接交给 Codex 的“项目地图”模板
下面这份模板针对已有前端项目中的局部修改。内容不要求一次填满,但每个“已确认”结论都要有依据。
# 当前任务项目地图 ## 1. 任务边界 - 本次要改变的用户行为: - 本次不改变的行为: - 允许修改: - 禁止修改: ## 2. 规则地图 - 生效的 AGENTS.md: - 适用的 Skill: - 与当前任务直接相关的规则: - 必须执行的检查: - 必须暂停的冲突: ## 3. 入口地图 - 应用与路由入口: - 页面入口: - 主要子组件: - 初始化行为: - 入口确认依据: ## 4. 职责地图 | 模块或文件 | 负责什么 | 与本任务的关系 | 依据 | | --- | --- | --- | --- | | | | | | ## 5. 行为与状态地图 ### 主路径 用户操作 → 事件 → 状态 → 参数 → 请求 → 响应 → 页面结果 ### 异常路径 失败或取消 → 提示 → 状态恢复 → 页面保留内容 ### 状态清单 | 状态 | 唯一来源 | 写入位置 | 读取位置 | | --- | --- | --- | --- | | | | | | ## 6. 复用与差异 - 可信参考: - 可以复用的模式: - 不能照搬的业务差异: - 找不到参考的部分: ## 7. 影响范围 - 直接修改文件: - 只需读取文件: - 主要调用方: - 公共类型或接口: - 潜在副作用: ## 8. 验证入口 - 项目实际检查命令: - 相关测试: - 页面访问路径: - 手动验证步骤: - 当前无法验证: ## 9. 结论分级 ### 已确认 - 结论 + 文件或代码依据 ### 推断 - 推断 + 推断依据 + 验证方式 ### 未知 - 待确认问题 + 不确认会产生的风险 ## 10. 最小修改建议 - 建议修改文件及原因: - 建议顺序: - 每步完成证据: - 需要人确认后才能继续的事项:
项目地图什么时候算完成
它不需要覆盖整个仓库,也不追求每个文件都解释。
只要能够支撑当前任务的关键决策,就可以进入修改阶段。
我会用下面七个问题收尾:
-
入口是否经过引用或路由关系确认?
-
主行为是否从用户操作追到了页面结果?
-
核心状态是否找到了唯一来源和所有关键读写点?
-
复用对象是否有证据,而不是只凭文件名相似?
-
公共组件或方法是否检查了主要调用方?
-
未知和冲突是否已经单独列出?
-
是否能据此写出最小修改范围和验收路径?
七个问题不一定全部有完美答案,但没有答案的部分必须明确标成风险。
项目地图的完成标准不是“没有未知”,而是“未知没有被伪装成事实”。
地图也可能过度:不要把阅读变成无限分析
读代码不是目的,安全完成任务才是目的。
如果任务只是修改一个已经定位明确的局部文案,就没必要建立十层调用关系;如果目标是调整公共组件 API,就不能只画当前页面。
我会根据风险控制地图深度:
| 任务类型 | 地图重点 |
|---|---|
| 局部样式或文案 | 入口、作用范围、页面验证 |
| 页面功能 | 状态流、接口、异常、相近实现 |
| 表单和弹窗 | 初始化、回填、校验、提交、清理 |
| 公共组件 | 契约、调用方、默认行为、回归范围 |
| 多文件重构 | 模块职责、依赖方向、行为基线、分步验证 |
一旦地图已经足够回答当前修改的决策问题,就应该停止扩展,进入小步实现和验证。
否则,“先读代码”也可能变成没有终点的准备工作。
真正有价值的项目地图,是后续修改和验收共用的依据
我要求 Codex 先交地图,不是为了多一份文档。
这张地图会直接进入后续流程:
-
用职责地图决定代码放在哪里。
-
用状态地图决定修改顺序。
-
用复用地图避免新增重复实现。
-
用影响地图控制改动范围。
-
用验证地图生成验收步骤。
-
用未知清单决定哪些地方必须由人判断。
如果修改过程中发现新调用方、新规则或新冲突,地图也应该同步更新。
这样,AI 的理解不是一句“我已经熟悉项目”,而是一份可以被检查、纠正和继续使用的工程产物。
Day 4 的两篇到这里形成闭环:第一篇解释为什么必须先读相关代码,这一篇定义读完以后应该交付什么。
下一篇进入 Day 5:AI 最容易忽略的需求边界。我会继续讨论那些不会主动报错、却最容易在交付后返工的前端边界,并说明哪些必须由人提前决定。
本系列持续更新。后面会把任务边界继续落成可执行的验收标准和检查清单。
参考资料
更多推荐

所有评论(0)