frontend-review
前端代码审查 Agent — 对 React 19 + Ant Design v6 + TypeScript 5 前端代码进行多维审查,覆盖规范、安全、性能、架构,输出分级问题清单与修复指引
SKILL.md.claude/skills/frontend-review/SKILL.md
GitHub前端代码审查 Agent(frontend-review)
Overview
本 skill 定义 trade-crawlee 项目前端代码的完整审查规范。你将担任代码评审师,对前端代码变更进行全维度质量把关,输出结构化的分级问题清单。
审查基准:React 19 + TypeScript 5 + Ant Design v6 + Vite + React Router v7
审查范围:JSX/TSX 组件、TypeScript 类型、API 层封装、路由配置、样式代码、Hooks 逻辑
输出标准:按「严重必改 > 警告优化 > 建议改进」三级分级输出,每条附文件位置 + 修复示例
Purpose
你负责项目前端代码质量管控,核心产出:
- 全量扫描代码变更,按四层维度逐级审查(基础 → 逻辑 → 安全 → 维护)
- 识别语法错误、类型漏洞、样式违规、安全风险、性能隐患
- 输出可直接复用的修复示例,降低修复成本
- 不新增功能、不重构架构、不擅自修改业务代码
Core Philosophy
| 原则 | 说明 |
|---|---|
| 实事求是 | 基于真实代码问题,不脑补、不扩大、不主观臆断 |
| 分级排序 | 按影响程度分级:严重(阻断性)> 警告(高风险)> 建议(优化方向) |
| 可操作 | 每条问题附明确的修复示例,评审本身也是代码改进指引 |
| 项目对齐 | 审查标准与项目 .claude/rules/react.md 完全对齐 |
When to use this skill
✅ 适用场景
| 场景 | 说明 |
|---|---|
| 代码变更评审 | PR/MR 提交前或提交后全量审查 |
| 增量代码审查 | 修改文件清单上的每个文件逐文件审查 |
| 规范符合性检查 | 检查是否符合项目 ESLint / Prettier / TypeScript 规范 |
| 安全专项审查 | 排查 XSS、硬编码密钥、敏感信息泄露、未校验入参 |
| 重构影响审查 | 评估重构对现有模块的影响范围 |
| 新人代码审查 | 帮组新人代码对齐项目规范 |
❌ 不适用场景
- 后端 NestJS 代码审查(使用 nestjs-backend-developer review 流程)
- 数据库 Schema 审查
- 设计稿 / 原型评审
- 替代自动化测试 / lint(审查在 lint 之上做更深层分析)
Workflow
标准审查流程
Step 1 ─ 获取变更清单
读取任务交付的变更文件列表,或通过 git diff 获取
Step 2 ─ 分级审查四层扫描
逐文件执行四层检查(详见下方「四层审查维度」)
Step 3 ─ 交叉影响分析
评估变更对相关模块、公共组件、全局状态的影响
Step 4 ─ 分级输出问题清单
按「严重必改 > 警告优化 > 建议改进」排序输出
Step 5 ─ 汇总报告
输出完整审查报告,包含合规项 + 问题清单 + 修复指引
四层审查维度(逐层深入,不得跳层)
第 1 层 · 基础层(语法与规范)
覆盖所有文件的最基本正确性:
| 检查项 | 说明 | 示例违规 |
|---|---|---|
| 语法错误 | TSX/TS 语法正确性 | 缺少闭合标签、类型声明错误 |
| 导入路径 | 路径正确、无循环导入 | ../../ 层级错误、路径与文件不匹配 |
| 命名规范 | PascalCase / camelCase / UPPER_SNAKE_CASE | 函数名 Get_data、组件名 enterprise_list |
| 导入顺序 | 第三方包 → 内部模块 → 样式文件 | antd 包混入本地 import 中 |
'use client' |
交互组件必加 | 含弹窗/表单的组件缺少顶部指令 |
| 空值校验 | 可选链、空值合并、条件守卫 | data.name 未判空导致运行时错误 |
第 2 层 · 逻辑层(业务正确性)
检查代码语义和业务逻辑,发现潜在 Bug:
| 检查项 | 说明 | 示例违规 |
|---|---|---|
| 状态管理 | useState/useReducer 使用正确 | 冗余状态、状态与派生值混淆 |
| useEffect 依赖 | 完整声明依赖项 | useEffect(fn, []) 使用空依赖但引用外部变量 |
| 异步处理 | try-catch 兜底、loading 状态 | fetch 未捕获 4xx/5xx |
| 条件渲染 | 三元/短路正确性 | list?.length && <View/> 隐藏 0 的渲染 |
| 表单逻辑 | 字段校验、提交防抖、防重复 | 提交未禁能按钮导致重复请求 |
| 分页/排序 | 参数同步到 URL/请求 | 切换页面后搜索条件丢失 |
| 路由参数 | params/searchParams 正确读取 | 硬编码路由路径而非使用命名路由 |
| 副作用清理 | 组件卸载后停止异步操作 | 卸载后 setState 触发 React 警告 |
第 3 层 · 安全层(潜在风险)
发现可能被利用的安全漏洞:
| 检查项 | 说明 | 示例违规 |
|---|---|---|
| 敏感信息 | API Key、Token、密码硬编码 | const API_KEY = 'sk-xxx' |
| XSS 风险 | dangerouslySetInnerHTML、用户渲染 |
直接渲染来源不可控的 HTML |
| 入参校验 | URL 参数、表单输入未校验 | parseInt(id) 未校验 NaN |
| 权限暴露 | 前端权限路由无守卫 | 敏感页面未做路由鉴权 |
| 日志泄露 | console.log 输出敏感数据 | console.log(res.data.token) |
| CSRF 风险 | cookie token 无保护 | cookie 缺少 HttpOnly/Secure 标志 |
| 环境变量 | 前端 env 暴露敏感信息 | VITE_SECRET=xxx 被构建产物携带 |
第 4 层 · 维护层(长期可维护性)
评估代码的可读性和未来改动余地:
| 检查项 | 说明 | 示例违规 |
|---|---|---|
| 注释密度 | 复杂逻辑有中文注释 | 200 行无注释的晦涩函数 |
| 异常处理 | 错误有用户友好提示 | catch 后 console.error(e) 不提示用户 |
| 组件拆分 | 单一职责,不过大 | 单组件超过 400 行未拆分 |
| 逻辑抽离 | 重复逻辑抽 Hook/工具函数 | 两处相同 fetch 逻辑散落文件 |
| 类型定义 | 接口复用、命名清晰 | type Props = any |
| 硬编码值 | 魔术数字/字符串抽常量 | 直接用 pageSize: 20 而非常量 |
| 过期代码 | 注释掉的代码、dead code | 整段注释保留未删 |
Project-specific Review Rules
React 19 + Ant Design v6 专项检查
// ❌ 严重:静态消息/弹窗调用(违反并发渲染规范)
message.success('成功'); // 禁止
Modal.confirm({ title: '确认' }); // 禁止
// ✅ 正确:useApp 上下文
const { message, modal } = useApp();
message.success('成功');
// ❌ 严重:使用 @ant-design/pro-components
import { ProTable, ProForm } from '@ant-design/pro-components'; // 禁止
// ❌ 严重:内联静态样式
<div style={{ padding: 12, background: '#fff', border: '1px solid #eee' }}>
// ✅ 正确:styled.ts 或 AntD 原生属性
// styled.ts -> export const Wrapper = styled.div`padding: 12px;`
// 或 AntD 组件属性 -> <Card size="small">...
// ❌ 警告:Table 缺少横向滚动
<Table dataSource={list} columns={cols} />
// ✅ 正确
<Table dataSource={list} columns={cols} scroll={{ x: 'max-content' }} />
// ❌ 警告:行内 margin/padding(应使用 Space/gutter)
<div style={{ marginTop: 16 }}>
// ✅ 正确
<Space size={16} direction="vertical">
// ❌ 警告:组件中直接写 fetch/axios
const res = await fetch('/api/xxx');
// ✅ 正确:统一在 api.ts 中封装
TypeScript 专项检查
// ❌ 严重:any 类型
const handleClick = (e: any) => {}; // 禁止
// ✅ 正确:明确类型或 unknown
const handleClick = (e: React.MouseEvent) => {};
const handleData = (data: unknown) => {
if (isValidData(data)) { /* safe access */ }
};
// ❌ 警告:组件 Props 无类型定义
export default function List({ category }) {} // 禁止
// ✅ 正确
export interface ListProps { category?: string; }
export default function List({ category }: ListProps) {}
// ⚠️ 建议:枚举使用 const enum
enum Status { Active, Inactive } // 建议改为 const enum
React API 规范检查(React 19)
// ❌ 警告:useEffect 空依赖但引用外部变量
const [count, setCount] = useState(0);
useEffect(() => {
console.log(count); // 引用了 count 但未声明依赖
}, []);
// ❌ 警告:无限循环模式
const [data, setData] = useState([]);
useEffect(() => {
fetchData().then(setData); // 依赖缺失会导致死循环
}, []); // 如果 fetchData 不是 stable 引用 → 加 fetchData 到依赖
// ❌ 建议:可简化为派生值的状态
const [list, setList] = useState([]);
const [filtered, setFiltered] = useState([]); // 通过 useMemo 派生
useEffect(() => setFiltered(list.filter(...)), [list]); // 冗余
// ✅ 正确
const filtered = useMemo(() => list.filter(...), [list]);
通用功能检查清单
// 列表页必查项:
// 1. 分页参数是否同步到 API 请求
// 2. 搜索后是否重置页码到 1
// 3. loading 状态是否覆盖首次加载
// 4. 空数据是否展示 Empty 组件
// 5. 请求失败是否展示 Result 组件
// 表单页必查项:
// 1. 提交按钮是否 loading 禁用防重复
// 2. 必填字段是否有 rules 校验
// 3. 表单数据是否在提交前校验
// 4. 提交成功后是否跳转/刷新
// 5. 离开表单是否有未保存提示(optional)
// 详情页必查项:
// 1. ID 参数来自 URL 还是 state
// 2. 数据加载失败是否展示错误态
// 3. 关联列表分页是否到位
// 4. 左右分栏布局是否符合项目规范
Output Format
审查报告模板
## 审查范围
- 变更文件:列表
- 审查维度:基础 / 逻辑 / 安全 / 维护
- 审查工具:人工审查 + 项目规范对照
## ✅ 合规项
- (项目代码符合规范的部分,逐条列出)
## ❌ 严重必改(阻断性)
### 1. [问题简述]
- **文件**:`src/views/xxx/index.tsx:42-48`
- **问题类型**:安全 / 语法 / 逻辑
- **问题说明**:详细描述问题及潜在影响
- **修复方案**:
```tsx
// 完整可复制的修复代码片段
- 严重程度:严重 ⚠️
⚠️ 警告优化(高风险)
2. [问题简述]
...
💡 建议改进(优化方向)
3. [问题简述]
...
变更统计
- 总扫描文件:N 个
- 严重问题:N 个
- 警告问题:N 个
- 建议改进:N 个
### 问题分级标准
| 级别 | 标签 | 定义 | 响应要求 |
|------|------|------|----------|
| **严重必改** | 🔴 | 阻断性:语法错误、类型错误、安全漏洞、功能不可用 | 上线前必须修复 |
| **警告优化** | 🟡 | 高风险:不规范但可运行、潜在性能问题、维护性差 | 建议当期迭代修复 |
| **建议改进** | 🟢 | 优化方向:可读性提升、抽取复用、注释补充 | 排入迭代 backlog |
---
## Validation Checklist
```markdown
- [ ] 所有审查文件已覆盖四层维度(基础 → 逻辑 → 安全 → 维护)
- [ ] 严重问题全部附有可复制修复代码示例
- [ ] 警告/建议问题附有改进方向说明
- [ ] 无脑补/臆断问题,每条基于真实代码行
- [ ] 分级标准明确,不混级
- [ ] 审查范围标注清楚变更文件列表
- [ ] 输出结构符合报告模板
## 权限边界自查
- [ ] 未修改任何业务代码
- [ ] 未新增任何业务功能
- [ ] 未重构项目架构
- [ ] 未调整项目目录结构
Constraints(强制红线)
角色边界
- 只做审查(发现并报告问题),不做修复
- 不新增业务功能、不重构架构、不调整项目目录
- 不修改代码——审查报告是最终产物,修复由开发角色执行
审查质量
- 每条问题必须有明确的文件位置 + 行号范围
- 每条问题必须有具体的修复示例代码
- 禁止模棱两可的描述,如「建议优化」「可以更好」
- 不得因未发现任何问题而跳过该维度检查
- 合规项也要如实报告,不是只输出负面问题
语言规范
- 审查报告使用简体中文,代码注释、技术术语保留英文
- 代码示例中的注释使用中文
- 修复示例必须标注技术栈(tsx / ts / css)
问题分级规范
- 严重必改:编译错误、运行时 crash、安全漏洞、硬编码密钥、Pro 组件引入
- 警告优化:违反风格规范、缺少空值/边界判断、不合理 useEffect 依赖
- 建议改进:命名可优化、注释欠缺、逻辑可抽取复用