在实际项目中,真正的重构很少只改动一个文件。改一个工具函数的入参,可能牵动十几个调用处;换一套 API 接口,前后端都要同步调整。手动逐个文件修改不仅慢,还容易遗漏。借助 AI 的跨文件上下文能力,你可以把这类“体力活”批量完成。
核心思路
把需要联动的文件同时交给 AI 处理,用明确的规则描述“旧逻辑→新逻辑”的映射关系,由 AI 生成多个文件的统一 diff,你再逐文件审阅应用。
典型适用场景
- 接口变更:后端改了字段名或返回结构,前端所有
.ts类型定义和请求层都要同步。 - 函数重构:提取公共方法后,把原先分散在 5 个组件里的重复代码替换成新函数。
- 统一规范:把所有
console.log换成封装好的logger.debug,并带上try/catch。 - 库迁移:从 Day.js 迁移到 date-fns,批量替换导入和调用方式。
操作步骤(以 Cursor / VS Code + Copilot 为例)
- 把相关文件加入上下文
在 AI 侧边栏或 Composer 中,用 @file(或把文件拖到对话区)把“定义文件”和“所有消费文件”一起引入。如果文件太多,至少包含一个典型调用示例,并告诉 AI“请按同样规则处理项目内其他文件”。
- 用结构化语言下指令
不要只说“帮我改一下接口”。建议给出生成规则:
> “把 userApi.getProfile() 的调用全部替换为 userApi.getV2Profile(),入参从 (userId) 改为 ({ userId }),并把返回结果里的 avatarUrl 字段映射为 avatar。涉及文件:请求层、类型定义、以及上面引用的三个组件。”
- 让 AI 先给方案,再给 diff
对复杂重构,先问:“请列出需要修改的文件清单和每处改动点。”确认无误后,再要求:“请生成具体的代码 diff。”这能避免 AI 一上来就大面积改错。
- 逐文件审阅,批量应用
现代 AI IDE 通常支持“Accept All”或单文件 Accept。建议不要一键全接受。先挑 1~2 个文件检查逻辑、类型和边界处理,确认模式正确后,再批量接受剩余同类修改。
- 用静态检查和搜索兜底
改完后立刻跑:
tsc --noEmit或 ESLint(类型和语法检查)- 全局搜索旧关键字(确认没有漏网之鱼)
- 相关单元测试或接口测试
实用技巧
- 先改定义,再改引用:如果涉及函数签名变更,先让 AI 改函数定义文件,等类型报错出来后再把报错信息丢给 AI,让它按报错位置批量修复调用方。这比一次性全改更稳。
- 给 AI 看例子:提供一段“改前 vs 改后”的示例,告诉 AI“请按这个模式处理其他文件”,准确率会大幅提升。
- 控制单次批量:单次对话里塞太多文件(比如超过 20 个)容易让 AI 遗漏。可分批处理,比如先处理核心模块,再处理业务组件。
- 保留 Git 干净状态:批量修改前务必 commit 一次。AI 跨文件改错时,你可以用
git diff快速回滚或对比。
真实避坑
- 间接引用容易漏:
obj['oldKey']或模板字符串里的动态字段,AI 可能识别不到。改完后务必全局搜索旧字符串。 - 同名函数误伤:如果两个模块都有
format(),但你要改的只是 A 模块的,务必在指令里限定文件范围或导入路径。 - 别完全相信 AI 的“已全部完成”:AI 会幻觉。实际项目中,它可能说“已修改 8 处”,实际只改了 6 处。搜索验证是必须的。
一句话总结:跨文件批量修改 = 明确的规则 + 充分的上下文 + 人工 diff 审阅 + 静态检查兜底。把 AI 当成一个“不会疲倦但偶尔会走神”的协作者,你就能安全地大幅提升重构效率。