用多模型 AI 辅助代码 Review:以一次前端 React 组件重构为例
在团队开发中,代码 Review 经常会遇到一个尴尬问题:
大家都知道 Review 很重要,但真正做起来很容易流于形式。
常见情况包括:
- 只看代码能不能跑;
- 只检查命名和格式;
- 忽略边界条件;
- 没有关注性能影响;
- 没有检查组件职责是否过重;
- 没有补充必要的测试用例;
- PR 里改动很多,人工 Review 成本很高。
现在很多开发者会使用 ChatGPT、Claude、Gemini、DeepSeek 等 AI 大模型辅助写代码,但其实相比“让 AI 直接写代码”,我更建议先把它用在代码 Review 上。
原因很简单:
AI 不一定能直接给出最终正确代码,但它很适合帮我们发现潜在问题、补充检查清单、生成 Review 意见草稿。
本文以一个 React 组件为例,分享一套适合 CSDN 技术社区读者的多模型 AI 辅助代码 Review 工作流。
一、本文适合谁
这篇文章适合以下几类开发者:
- 前端开发:希望提升 React / Vue 组件 Review 质量;
- 后端开发:想借鉴 AI 辅助代码审查流程;
- 技术负责人:希望让团队 Review 更标准化;
- 初中级程序员:想知道如何让 AI 帮自己发现代码问题;
- 需要处理大量 PR 的开发者:希望先用 AI 做初步扫描,再人工确认。
本文不会讨论某个工具如何注册或使用,而是重点放在:
- 如何把代码发给 AI 分析;
- 如何设计 Prompt;
- 如何判断 AI 的 Review 意见是否可靠;
- 如何避免把 AI 的建议不加判断地合并进项目。
二、为什么代码 Review 很适合 AI 辅助
AI 辅助代码 Review 的价值,不在于替代资深工程师,而在于帮助开发者快速完成第一轮检查。
它比较适合做这些事情:
-
发现明显代码异味
例如组件过大、重复逻辑、状态管理混乱、函数职责不清晰。 -
补充边界条件
例如空数组、接口返回 null、字段缺失、loading 状态未处理。 -
检查可维护性问题
例如硬编码、命名不清楚、依赖关系复杂、组件复用性差。 -
生成 Review 清单
让人工 Review 时有更明确的检查方向。 -
辅助生成测试用例
包括正常场景、异常场景、边界场景。
但它也有明显边界:
- AI 不知道你们团队的真实业务背景;
- AI 可能给出过度设计建议;
- AI 不一定理解项目历史包袱;
- AI 可能建议引入不必要的依赖;
- AI 无法替代实际运行、测试和人工判断。
所以更合理的定位是:
AI 做初筛,开发者做判断,测试做验证。
三、ChatGPT、Claude、Gemini、DeepSeek 在代码 Review 中的适配差异
在实际使用中,不同模型的输出风格会有差异。可以根据任务选择,而不是固定只用一个模型。
| 模型 | 更适合的 Review 场景 | 使用建议 |
|---|---|---|
| ChatGPT | 代码逻辑解释、重构建议、测试用例生成 | 适合做综合代码审查 |
| Claude | 长文件阅读、复杂上下文总结、PR 描述整理 | 适合 Review 大段代码或多个文件 |
| Gemini | 结合技术资料理解框架用法、API 行为 | 适合查框架特性和文档差异 |
| DeepSeek | 中文代码分析、逻辑问题发现、算法类代码审查 | 适合日常开发中的代码 Review 和问题定位 |
如果只是想比较同一段代码在不同模型下的 Review 结果,也可以选择一些多模型聚合工具,例如 KULAAI 这类支持 ChatGPT、Claude、Gemini、DeepSeek 等模型切换的产品。这里的重点不是工具本身,而是建立一套可复用的代码审查流程。
四、本次示例:一个常见的 React 列表组件
假设项目里有一个用户列表组件,用于展示用户数据、筛选状态并支持刷新。
代码如下:
tsx
import React, { useEffect, useState } from "react";
type User = { id: number; name: string; status: string;};
export default function UserList() { const [users, setUsers] = useState<User[]>([]); const [status, setStatus] = useState("all");
useEffect(() => { fetch("/api/users?status=" + status) .then((res) => res.json()) .then((data) => { setUsers(data.list); }); }, [status]);
return ( <div> <h2>用户列表</h2>
<select value={status} onChange={(e) => setStatus(e.target.value)}> <option value="all">全部</option> <option value="active">启用</option> <option value="disabled">禁用</option> </select>
<ul> {users.map((user) => ( <li key={user.id}> {user.name} - {user.status} </li> ))} </ul> </div> );}
这段代码看起来没什么问题,也能正常运行。
但如果从生产项目角度 Review,会发现不少可改进点。
五、第一轮 Prompt:让 AI 做基础代码 Review
不要只写一句“帮我 Review 这段代码”。
更建议明确 Review 角色、检查范围和输出格式。
Prompt 示例
text
你是一名有经验的前端代码 Review 工程师。
请 Review 下面这段 React + TypeScript 代码,重点关注:
1. 运行时错误风险;2. 接口异常处理;3. loading 和 empty 状态;4. TypeScript 类型安全;5. 组件可维护性;6. 性能问题;7. 是否需要补充测试用例。
请按以下格式输出:
- 主要问题- 问题影响- 修改建议- 是否必须修改- 可选优化项- 建议补充的测试用例
要求:- 不要直接大规模重写代码;- 优先给出最小修改建议;- 如果信息不足,请明确说明;- 不要引入新的第三方库。
把代码粘贴进去后,AI 通常会指出以下问题:
- 没有处理接口请求失败;
- 没有 loading 状态;
- 没有空列表展示;
- 没有处理
data.list不存在的情况; - status 拼接 URL 时建议使用
URLSearchParams; - 组件内请求逻辑可以抽离;
- 缺少请求取消逻辑,快速切换筛选条件时可能出现竞态;
status类型可以收窄为联合类型;- 测试用例需要覆盖接口异常和空数据场景。
这些问题不一定都必须改,但它们能帮助 Review 人员快速建立检查清单。
六、第二轮 Prompt:让 AI 区分“必须修改”和“可选优化”
AI 初次 Review 很容易给出一堆建议,但团队开发中并不是所有建议都值得马上处理。
因此可以继续追问:
text
请把上面的 Review 意见分成三类:
1. 本次 PR 必须修改的问题;2. 建议修改但不阻塞合并的问题;3. 可以后续重构时再考虑的问题。
请说明分类理由,并尽量避免过度设计。
一般来说,可以这样分类。
必须修改
- 接口失败没有错误处理;
data.list不存在时可能导致异常;- 没有 loading 状态,用户体验不明确;
- 快速切换筛选条件可能出现旧请求覆盖新结果。
建议修改
status使用联合类型;- 使用
URLSearchParams构造查询参数; - 增加 empty 状态;
- 补充基础测试用例。
后续再考虑
- 抽离自定义 Hook;
- 引入请求库;
- 做分页、虚拟滚动;
- 组件拆分。
这种分类很重要。
否则 AI 很容易把一个简单组件改成过度工程化版本。
七、根据 Review 意见做最小改造
下面是一版相对克制的改造示例,主要解决异常处理、loading、empty、类型和请求竞态问题。
tsx
import React, { useEffect, useState } from "react";
type UserStatus = "all" | "active" | "disabled";
type User = { id: number; name: string; status: UserStatus;};
type UserListResponse = { list?: User[];};
export default function UserList() { const [users, setUsers] = useState<User[]>([]); const [status, setStatus] = useState<UserStatus>("all"); const [loading, setLoading] = useState(false); const [errorMessage, setErrorMessage] = useState("");
useEffect(() => { const controller = new AbortController();
async function fetchUsers() { setLoading(true); setErrorMessage("");
try { const params = new URLSearchParams({ status }); const response = await fetch(`/api/users?${params.toString()}`, { signal: controller.signal, });
if (!response.ok) { throw new Error(`Request failed: ${response.status}`); }
const data: UserListResponse = await response.json(); setUsers(Array.isArray(data.list) ? data.list : []); } catch (error) { if (error instanceof DOMException && error.name === "AbortError") { return; }
setUsers([]); setErrorMessage("用户列表加载失败,请稍后重试"); } finally { setLoading(false); } }
fetchUsers();
return () => { controller.abort(); }; }, [status]);
return ( <div> <h2>用户列表</h2>
<select value={status} onChange={(e) => setStatus(e.target.value as UserStatus)} disabled={loading} > <option value="all">全部</option> <option value="active">启用</option> <option value="disabled">禁用</option> </select>
{loading && <p>加载中...</p>}
{!loading && errorMessage && <p>{errorMessage}</p>}
{!loading && !errorMessage && users.length === 0 && <p>暂无用户</p>}
{!loading && !errorMessage && users.length > 0 && ( <ul> {users.map((user) => ( <li key={user.id}> {user.name} - {user.status} </li> ))} </ul> )} </div> );}
这版代码并不完美,但比原始版本更适合真实项目:
- 接口失败不会静默;
- 返回结构异常不会直接报错;
- 有 loading 状态;
- 有空数据状态;
- 快速切换筛选条件时会取消旧请求;
- status 类型更明确;
- 没有引入额外依赖;
- 改动范围可控。
八、第三轮 Prompt:让 AI 生成测试用例
代码 Review 不应该只停留在“看起来合理”。
更稳妥的方式是继续让 AI 生成测试用例草稿,然后由开发者筛选。
Prompt 示例
text
请根据改造后的 React 组件,生成测试用例清单。
测试框架可以假设为 Jest + React Testing Library。
请覆盖以下场景:
1. 初次进入页面正常加载用户列表;2. 接口返回空列表;3. 接口请求失败;4. 切换 status 后重新请求;5. 请求过程中展示 loading;6. 接口返回结构中 list 缺失;7. 快速切换筛选条件时旧请求不应覆盖新结果。
请输出:- 用例名称- 前置条件- 操作步骤- 预期结果- 优先级
暂时不需要完整测试代码,先输出测试设计。
AI 可能生成类似下面的测试用例表:
| 用例名称 | 前置条件 | 操作步骤 | 预期结果 | 优先级 |
|---|---|---|---|---|
| 正常加载用户列表 | 接口返回 2 条用户数据 | 渲染组件 | 展示用户名称和状态 | P0 |
| 接口返回空列表 | 接口返回 { list: [] } |
渲染组件 | 展示“暂无用户” | P0 |
| 接口请求失败 | 接口返回 500 | 渲染组件 | 展示错误提示 | P0 |
| 切换用户状态 | 初始为 all | 选择 active | 使用 active 参数重新请求 | P0 |
| loading 状态展示 | 请求未完成 | 渲染组件 | 展示“加载中...” | P1 |
| list 字段缺失 | 接口返回 {} |
渲染组件 | 不报错,展示空状态 | P1 |
| 快速切换筛选条件 | 多次切换 status | 模拟请求乱序返回 | 最终展示最后一次请求结果 | P1 |
这一步的价值在于:
AI 不只是帮你改代码,还能提醒你哪些行为应该被验证。
九、如何判断 AI 的 Review 意见是否可信
AI 给出的 Review 意见不能照单全收。可以按下面几个标准判断。
1. 是否符合项目当前阶段
如果只是内部管理后台的小组件,AI 建议引入复杂状态管理,就可能是过度设计。
如果是核心业务页面,AI 提醒异常处理、权限校验、数据为空等问题,就更值得重视。
2. 是否能通过测试验证
好的 Review 意见应该能转化为测试用例。
例如:
- “接口失败没有提示”可以通过 mock 500 验证;
- “data.list 不存在会报错”可以通过 mock
{}验证; - “请求竞态”可以通过模拟延迟请求验证。
如果某条建议无法验证,也要谨慎评估它是否只是风格偏好。
3. 是否符合团队代码规范
AI 可能会建议一种通用写法,但你的项目可能已经有统一封装:
- 请求方法统一用
requestClient; - 错误提示统一走 message 组件;
- loading 状态统一由业务组件处理;
- 错误码统一在拦截器里处理。
这时候不能直接采用 AI 的代码,而应该把建议转化成符合项目规范的实现。
4. 是否引入额外复杂度
代码 Review 的目标不是“把代码改得更高级”,而是提高可靠性和可维护性。
如果一个建议带来的复杂度明显高于收益,就应该暂缓。
十、适合团队沉淀的 AI Review 清单
如果团队想长期使用 AI 辅助 Review,可以把 Prompt 固化成检查清单。
前端组件 Review 清单
text
请 Review 前端组件代码,重点检查:
1. 是否存在运行时异常风险;2. 是否处理 loading、empty、error 状态;3. 是否存在重复渲染或性能问题;4. 是否正确处理异步请求竞态;5. 是否存在类型定义过宽的问题;6. 是否有硬编码或魔法值;7. 是否符合组件职责单一原则;8. 是否缺少必要测试用例;9. 是否存在可访问性问题;10. 是否存在明显安全风险,例如直接渲染不可信 HTML。
请区分:- 必须修改;- 建议修改;- 后续优化。
请不要过度设计,不要默认引入新的库。
后端接口 Review 清单
text
请 Review 后端接口代码,重点检查:
1. 参数校验是否完整;2. 权限控制是否遗漏;3. 异常处理是否符合项目规范;4. 日志是否足够定位问题;5. 是否存在空指针风险;6. 是否存在并发或事务问题;7. 是否存在重复查询或性能问题;8. 返回结构是否符合接口约定;9. 是否需要补充单元测试或集成测试;10. 是否涉及敏感数据输出。
请输出:- 问题描述;- 影响范围;- 修改建议;- 验证方法;- 优先级。
这些模板可以放进团队 Wiki,作为 PR 自查的一部分。
十一、代码提交前,建议用 AI 做一次“自查”
在提交 PR 前,可以让 AI 帮自己做一轮自查。
推荐流程如下:
- 粘贴本次改动的核心代码;
- 说明业务背景;
- 说明本次修改目标;
- 说明不希望改动的边界;
- 让 AI 输出 Review 意见;
- 自己筛选必须修改项;
- 补充必要测试;
- 再提交 PR。
PR 自查 Prompt
text
你是一名代码 Review 负责人。
下面是我准备提交 PR 的代码改动,请帮我做提交前自查。
业务背景:这是用户列表页面,支持按状态筛选用户。
本次修改目标:增加接口异常处理、loading 状态和空数据展示。
不希望改动:1. 不引入新的第三方库;2. 不改变接口返回结构;3. 不做大规模组件拆分。
请检查:1. 是否满足本次修改目标;2. 是否存在明显 Bug;3. 是否有遗漏的边界场景;4. 是否需要补充测试;5. PR 描述应该如何写。
请输出:- 检查结果- 发现的问题- 修改建议- 建议测试点- PR 描述草稿
这类 Prompt 很适合日常开发使用,尤其适合提交前最后一轮检查。
十二、注意事项:不要把敏感代码直接交给 AI
使用 AI 辅助代码 Review 时,需要注意安全边界。
不建议直接输入:
- 公司未公开的完整核心代码;
- 生产环境配置;
- Token、密钥、账号密码;
- 内部接口域名;
- 用户隐私数据;
- 业务风控策略;
- 涉及安全防护的关键逻辑。
更安全的方式是:
- 对代码做脱敏处理;
- 删除真实域名和密钥;
- 抽象业务字段;
- 只提供最小可复现代码片段;
- 对敏感逻辑只描述结构,不暴露细节。
例如把真实接口:
text
https://internal.xxx.com/api/users?token=真实Token
改成:
text
/api/users?status=active
把真实用户数据:
json
{ "name": "张三", "phone": "13800000000"}
改成:
json
{ "name": "mock_user", "phone": "mock_phone"}
这样既能保留代码问题,又能降低信息泄露风险。
十三、常见误区
1. AI 能不能替代人工代码 Review?
不能。AI 可以辅助发现问题,但无法完全理解业务背景、团队规范和历史原因。最终是否修改,仍然需要开发者判断。
2. AI 给出的重构建议都要采纳吗?
不需要。很多建议只是“通用最佳实践”,不一定适合当前项目。建议优先处理 Bug 风险、边界条件和可验证问题。
3. 多模型 Review 有必要吗?
对于普通小改动,一个模型做初筛就够了。
对于复杂 PR、核心业务逻辑、影响范围较大的改动,可以用多个模型交叉检查,看看是否存在遗漏角度。
4. AI 生成的测试用例可靠吗?
可以作为草稿,但需要人工补充项目上下文。尤其是权限、数据状态、业务规则相关测试,必须结合真实需求确认。
5. 如何避免 AI 过度设计?
Prompt 里要明确约束:
- 不引入新库;
- 不大规模重构;
- 优先最小改动;
- 区分必须修改和可选优化;
- 说明每条建议的收益和成本。
6. 代码太长怎么办?
可以分段处理:
- 先让 AI 总结文件职责;
- 再按函数或组件逐段 Review;
- 最后让 AI 汇总整体问题;
- 由人工合并判断。
不要一次性丢入过多无关代码,否则模型容易忽略细节。
十四、总结
相比直接让 AI 写代码,我更建议开发者先把 ChatGPT、Claude、Gemini、DeepSeek 用在代码 Review 上。
一套比较稳妥的流程是:
- 提供业务背景和代码片段;
- 明确 Review 维度;
- 让 AI 输出问题、影响和修改建议;
- 要求区分必须修改和可选优化;
- 根据建议做最小改造;
- 继续让 AI 生成测试用例;
- 人工 Review 后再合并代码。
AI 辅助 Review 的核心价值不是“替你判断代码对不对”,而是帮助你更快发现遗漏点,形成更完整的检查清单。
真正可靠的开发流程仍然是:
AI 提供思路,开发者做判断,测试验证结果,团队规范兜底。
把 AI 放在这个位置上,它就不是一个不稳定的“自动写代码工具”,而是一个能持续提升研发效率的辅助审查伙伴。
更多推荐




所有评论(0)