用AI给老项目做代码迁移:一套可复用的四步工作流

📅 2026/10/5 ✍️ 小文 📖 约 1 分钟

面对几万行的遗留代码,AI能帮到哪一步?本文给出一套从勘察、分层、批量改写到验证回归的迁移工作流,附真实踩坑记录。

“帮我用 AI 把这个老项目从 Vue2 迁到 Vue3”——这句话说出来只要三秒,真干起来能把人折磨一周。AI 在代码迁移上确实能帮大忙,但用错了方式,它会给你造出一堆看起来对、跑起来崩的代码。

下面这套四步工作流,是我把一个 4 万行的遗留项目从 jQuery 迁到现代框架时反复打磨出来的。

第一步:先勘察,别急着改

AI 最擅长的是局部改写,最不擅长的是理解全局结构。所以第一步不是让它写代码,而是让它读懂项目。

做法:把项目目录树、package.json、核心入口文件丢给 AI,让它输出一份报告:

  • 用了哪些过时的 API / 依赖;
  • 哪些模块耦合最重、迁移风险最高;
  • 建议的迁移顺序。

这一步的产出是一份路线图,不是代码。花二十分钟做,能省后面两天。

第二步:分层,按”爆炸半径”排序

把所有要改的地方按风险分三层:

  1. 低风险:纯工具函数、常量、类型定义——改错了单测能立刻抓到;
  2. 中风险:业务逻辑、组件内部实现——有测试覆盖的优先;
  3. 高风险:路由、状态管理、构建配置、跨模块接口——牵一发动全身。

从低风险往高风险推,每层改完立刻验证。AI 一次只处理一层,别让它跨层乱改。

第三步:批量改写 + 人工把关

给 AI 的改写指令要满足三个条件:范围明确、模式统一、可验证。

好的指令:
"把 src/utils/ 下所有文件里的 moment(...) 调用
替换为 dayjs(...),注意 .format() 语法保持兼容,
UTC 相关调用保持时区语义不变。逐个文件输出 diff。"

坏的指令:
"把项目里的时间库都升级一下。"

关键技巧:让 AI 输出 diff 而不是整文件。 整文件重写会悄悄改动你不需要动的地方,diff 则让人一眼看出改了啥。

对重复性改写(比如几百处 API 调用),先让 AI 在一个文件上跑通,确认模式无误,再批量应用。先验证模式,再规模化。

第四步:验证回归,把 AI 的活当陌生代码审

迁移完成的标志不是”能编译”,而是”行为一致”。验证清单:

  • 单元测试全绿(迁移前就得有覆盖,没有就先补);
  • 关键路径手工冒烟;
  • 对比迁移前后关键接口的输入输出;
  • 检查有没有 AI “顺手”引入的新依赖或新写法。

三个真实踩坑

坑一:AI 会”美化”代码。 你让它改一行,它可能顺手把周边变量重命名、把循环改成 map。要求它只改必要部分,否则 diff 会污染到无法 review。

坑二:AI 记不住全局约定。 长任务里它会逐渐忘记项目规范。解决办法是把规范写进一个 CONVENTIONS.md,每次任务都带上。

坑三:过时知识。 老模型可能给出已被废弃的写法。涉及具体库版本时,让它引用官方迁移文档,或手动喂给它文档片段。

结语

用 AI 做代码迁移的本质,是把”大而模糊的迁移”拆成”一堆小而明确的重写”,每个重写都可验证、可回滚。AI 负责速度,人负责判断风险和验收。分工对了,原本两周的活三天能干完;分工错了,AI 会帮你更快地造出更难调试的烂摊子。

📤 分享到