用AI给老项目做代码迁移:一套可复用的四步工作流
面对几万行的遗留代码,AI能帮到哪一步?本文给出一套从勘察、分层、批量改写到验证回归的迁移工作流,附真实踩坑记录。
“帮我用 AI 把这个老项目从 Vue2 迁到 Vue3”——这句话说出来只要三秒,真干起来能把人折磨一周。AI 在代码迁移上确实能帮大忙,但用错了方式,它会给你造出一堆看起来对、跑起来崩的代码。
下面这套四步工作流,是我把一个 4 万行的遗留项目从 jQuery 迁到现代框架时反复打磨出来的。
第一步:先勘察,别急着改
AI 最擅长的是局部改写,最不擅长的是理解全局结构。所以第一步不是让它写代码,而是让它读懂项目。
做法:把项目目录树、package.json、核心入口文件丢给 AI,让它输出一份报告:
- 用了哪些过时的 API / 依赖;
- 哪些模块耦合最重、迁移风险最高;
- 建议的迁移顺序。
这一步的产出是一份路线图,不是代码。花二十分钟做,能省后面两天。
第二步:分层,按”爆炸半径”排序
把所有要改的地方按风险分三层:
- 低风险:纯工具函数、常量、类型定义——改错了单测能立刻抓到;
- 中风险:业务逻辑、组件内部实现——有测试覆盖的优先;
- 高风险:路由、状态管理、构建配置、跨模块接口——牵一发动全身。
从低风险往高风险推,每层改完立刻验证。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 会帮你更快地造出更难调试的烂摊子。