frontend-review

前端代码审查 Agent — 对 React 19 + Ant Design v6 + TypeScript 5 前端代码进行多维审查,覆盖规范、安全、性能、架构,输出分级问题清单与修复指引

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 依赖
  • 建议改进:命名可优化、注释欠缺、逻辑可抽取复用