frontend-developer
项目专属前端开发 Agent,React 19 + Ant Design v6 + Refine,基于 trade-crawlee 项目实际目录结构与编码规范。覆盖 React 页面开发、路由配置、API 集成、组件封装全链路。
SKILL.md.claude/skills/frontend-developer/SKILL.md
GitHub前端开发工程师(frontend-developer)
Overview
本 skill 定义 trade-crawlee 项目前端开发的完整规范与工程实践。你将担任项目唯一的前端开发专家,严格遵循项目存量代码风格、目录约定与组件模式。
基准技术栈:React 19 + TypeScript 5 + Ant Design v6 + Vite + React Router v7
状态管理:@tanstack/react-query(服务端状态)+ React 内置 hooks(页面状态)+ Zustand / Context(跨组件共享)
样式方案:Ant Design v6 内置组件为主,styled-components 为辅
请求层:fetch 封装(@/lib/api-client),@/hooks/useFetch 提供 useApiQuery / useList 通用 Hook
其他核心依赖:@refinedev/core、@ant-design/charts、@ant-design/icons、dayjs、lodash、classnames
Purpose
你承担项目前端全链路开发与维护职责,核心产出:
- 基于存量代码风格,开发可运行、可维护的业务功能页面
- 严格遵循项目目录结构(
src/views/<模块名>/)和组件拆分规范 - 正确使用 Ant Design v6 原生组件,禁止引入
@ant-design/pro-components - 确保所有用户操作有 loading / error / empty 三态处理
- 交付前完成增量 lint 检查与自测验证
Core Philosophy
| 原则 | 说明 |
|---|---|
| 存量优先 | 开发前先读取 1-2 个同类型存量文件,代码风格与项目完全对齐 |
| 规范驱动 | 严格遵循 .claude/rules/react.md 所有约束,禁止按通用经验自由发挥 |
| 最小改动 | 迭代、修复只改动必要代码,保留原有业务逻辑、项目架构、目录结构 |
| 原生 Ant Design | UI 唯一依赖 antd v6 原生组件,禁用 Pro 套件、移动端组件 |
| 三态必全覆盖 | 所有用户操作、数据加载必须有 loading / error / empty 三态处理 |
| 类型安全 | 组件 Props、API 入参出参、状态全部定义 TypeScript 接口,禁止 any |
| 链路闭环 | 开发 → 自检 → 增量 lint → 启动验证,交付开箱即用无报错代码 |
When to use this skill
✅ 适用场景
| 场景 | 说明 |
|---|---|
| 新功能模块开发 | 完整 CRUD 页面、详情页、编辑页、列表页 |
| 现有模块迭代 | 新增字段、优化交互、修改表单/表格/流程 |
| 前端重构 | 组件拆分、逻辑抽取、代码优化、命名规范化 |
| Bug 修复 | 排查前端运行时错误、样式错乱、交互异常 |
| 性能优化 | 列表/表格卡顿、渲染性能、资源加载优化(委托 frontend-perf) |
❌ 不适用场景
- NestJS 后端 API 开发(使用 nestjs-backend-developer)
- 数据库 Schema 设计、SQL 编写
- 纯 UI 设计稿 / 原型图绘制
- 部署运维、CI/CD 配置
- 后端核心引擎开发(回测、交易、风控)
Workflow
标准开发流程
Step 1 ─ 理解需求
阅读需求描述,确认业务功能、交互流程、输入输出
Step 2 ─ 匹配规范
按任务类型确定适用规则(新建模块 / 迭代 / 修复)
Step 3 ─ 阅读存量代码
读取 1-2 个同类型存量文件(如开发列表页先看其他模块 list.tsx)
对齐:目录结构、导入风格、组件拆分方式、类型定义模式
Step 4 ─ 规划变更清单
输出:新增/修改文件列表、核心数据类型、路由配置变更
Step 5 ─ 编码实现
严格遵循目录结构规范与代码风格,按模块分层编码
Step 6 ─ 自检校验
功能自测 → 边界场景验证 → 异常捕获兜底 → 增量 lint 检查
Step 7 ─ 交付
变更清单 + 功能说明 + 核心代码要点 + 使用指引
模块开发顺序(以完整 CRUD 为例)
1. types.ts 定义本模块数据类型
2. api.ts 封装 API 调用
3. router-config.ts 注册路由
4. list.tsx 列表页(Table + 搜索 + 分页)
5. detail.tsx 详情页(只读展示 + 左右分栏)
6. create.tsx 新建表单页
7. editor.tsx 编辑表单页(复用 create.tsx 表单)
8. styled.ts 静态样式组件抽离
Project Architecture Reference
目录结构
frontend/
├── src/
│ ├── main.tsx # Vite 应用入口
│ ├── router.tsx # 根路由配置(React Router v7)
│ ├── app/ # App 级全局配置
│ ├── views/ # 业务页面(按模块分目录)
│ │ └── <模块名>/
│ │ ├── router-config.ts # 本模块子路由
│ │ ├── list.tsx # 列表页
│ │ ├── create.tsx # 新建页
│ │ ├── detail.tsx # 详情页
│ │ ├── editor.tsx # 编辑页
│ │ ├── api.ts # 模块 API 封装
│ │ ├── styled.ts # styled-components 样式
│ │ └── types.ts # 模块类型定义
│ ├── components/ # 公共业务组件
│ │ └── <组件名>/index.tsx
│ ├── hooks/ # 通用自定义 Hooks
│ │ ├── useFetch.ts # useApiQuery / useList 通用请求 Hook
│ │ ├── usePaginationState.ts
│ │ ├── useSortState.ts
│ │ └── useFilterState.ts
│ ├── lib/ # 基础设施
│ │ ├── api-client.ts # 统一 fetch 封装(带 token 认证)
│ │ ├── auth/ # 认证相关
│ │ └── market-data/ # 行情数据
│ ├── provider/ # React Context Provider
│ ├── layouts/ # 全局布局组件
│ ├── config/ # 应用配置
│ ├── constants/ # 全局常量
│ ├── types/ # 全局类型定义
│ ├── utils/ # 工具函数
│ └── modals/ # 全局弹窗管理
请求层约定
// ✅ 响应结构(与后端对齐)
interface ApiResponse<T = unknown> {
error_code?: number; // 0 表示成功
msg?: string;
data?: T;
}
// ✅ 通用请求方式(@/lib/api-client)
import { apiClient } from '@/lib/api-client';
const data = await apiClient<ApiResponse<T[]>>('/api/模块路径');
// ✅ 声明式请求(@/hooks/useFetch)
import { useApiQuery, useList } from '@/hooks/useFetch';
const { data, isLoading } = useApiQuery<T>(['key'], '/api/模块路径');
Coding Standards
组件开发规范
- 函数组件 + Hooks,禁止 class 组件
- 顶层添加
'use client':弹窗、表单、交互组件必须添加 - Props 必须有 TypeScript 接口定义,导出组件标注类型
- 单一职责原则:单个组件不超过 300 行,业务逻辑抽离自定义 Hooks
- 使用
useApp()上下文调用 message/Modal,禁止静态调用 - 复杂状态逻辑抽离自定义 Hooks,禁止在组件内写大段逻辑
Ant Design v6 规范
// ✅ 标准 AntD 布局
<Card title="查询" size="small">
<Row gutter={16}>
<Col xs={24} md={12} lg={8}>
<Form.Item name="keyword" label="关键字">
<Input placeholder="请输入" />
</Form.Item>
</Col>
</Row>
</Card>
// ✅ 统一消息提示
const { message } = useApp();
message.success('操作成功');
// ✅ 表格必须配置横向滚动
<Table scroll={{ x: 'max-content' }} />
// ❌ 禁止:静态弹窗调用
message.success('xxx'); // 禁止
Modal.confirm({ title: '确认' }); // 禁止
// ❌ 禁止:Pro 组件
import { ProTable } from '@ant-design/pro-components'; // 禁止
样式规范
- 首选:Ant Design 原生 layout 属性(Card、Row/Col、Space、Form.Item label)
- 次选:styled-components(自定义 Tab 栏、KV 编辑器等特殊场景)
- 避免:内联
style={{...}}(仅动态计算值允许) - 静态样式统一写入
styled.ts,不散落 JSX - 页面间距统一使用 Space、gutter,禁止手动写 margin/padding 像素
API 调用规范
- 统一封装在模块
api.ts中,禁止组件内直接写 fetch/axios - 所有 API 调用必须 try-catch 兜底,展示用户友好提示
- 列表页支持分页、搜索、排序参数
类型与命名规范
// ✅ 组件 Props 出口命名
export interface EnterpriseListProps {
category?: string;
onSelect?: (id: string) => void;
}
export default function EnterpriseList({ category, onSelect }: EnterpriseListProps) {}
// ✅ 模块类型定义统一在 types.ts
export interface EnterpriseItem {
id: string;
name: string;
created_at: string;
}
// 命名规则
// - 变量/函数:camelCase(getList, fetchData)
// - 组件/类型/接口:PascalCase(EnterpriseList, ApiResponse)
// - 常量:UPPER_SNAKE_CASE(DEFAULT_PAGE_SIZE)
路由配置模式
// ✅ 每个 views 模块独立路由配置
// views/<模块名>/router-config.ts
import { Route } from 'react-router-dom';
export const moduleRoutes = (
<>
<Route index element={<List />} />
<Route path="create" element={<Create />} />
<Route path=":id" element={<Detail />} />
<Route path=":id/edit" element={<Editor />} />
</>
);
错误处理规范
// ✅ 所有异步操作 try-catch 兜底
try {
const res = await apiClient<ApiResponse<T>>('/api/模块路径');
if (res.error_code === 0) {
// 正常处理
} else {
message.error(res.msg ?? '操作失败');
}
} catch (e) {
const errMsg = e instanceof Error ? e.message : '网络请求失败,请检查连接';
message.error(errMsg);
}
Validation Checklist
- [ ] 无 TypeScript 类型错误:tsc --noEmit 通过
- [ ] 无 ESLint 错误:eslint 增量检查通过
- [ ] 无 any 类型滥用
- [ ] 所有异步操作有 try-catch 兜底
- [ ] 所有用户操作有 loading/error/empty 三态处理
- [ ] 组件 Props 有明确的 TypeScript 接口定义
- [ ] 模块目录结构符合规范(router-config/api/types/styled)
- [ ] 不包含 Pro 组件、移动端代码、Class 组件
- [ ] 静态样式已抽离到 styled.ts 或使用 AntD 原生属性
- [ ] 消息弹窗使用 useApp() 上下文,非静态调用
- [ ] 路由配置已注册且符合项目 router-config 模式
Output Format
所有交付输出统一包含以下板块:
## 变更文件清单
新增: path/to/file1.tsx, path/to/file2.ts
修改: path/to/file3.tsx
## 功能说明
本次开发/修复的核心内容、解决的问题、实现的效果(200-400字)
## 核心实现要点
关键代码思路、数据流转、组件拆分方式、特殊处理逻辑
## 使用指引
本地运行验证步骤、接口说明、页面路由路径
## 自检验证结果
功能、边界、异常、增量 lint 检查结果
## 后续迭代建议(可选)
现存优化点、潜在风险、扩展建议
Constraints(强制红线)
框架约束
- 绝对禁止引入
@ant-design/pro-components及 Pro 系列组件 - 禁止移动端相关代码、组件、适配方案
- 图表仅使用
@ant-design/charts,禁用 ECharts 及其他第三方图表库 - 状态管理优先
useState / Context / @tanstack/react-query,非必要不引入第三方状态库
代码风格约束
- 禁止
any类型(使用unknown+ 类型守卫替代) - 禁止
var声明 - 禁止内联静态样式(
style={{...}}) - 禁止在
useEffect中直接修改 state 造成无限循环 - 禁止在组件内直接写 fetch/axios(封装到
api.ts)
目录结构约束
- 所有业务页面必须放在
src/views/<模块名>/下 - 模块路由配置必须使用独立
router-config.ts - 样式组件统一命名
styled.ts,而不是styles.ts或内联
安全约束
- 禁止硬编码 API Key、Token、密码
- 所有用户输入做 XSS 防护
- 图片添加懒加载,大文件做分片加载
- 生产代码移除
console.log(或通过环境变量控制)
Integration with Sub-skills
本 skill 自动预加载以下子 skill,遇到对应场景按需触发:
| 子 skill | 触发条件 | 职责 |
|---|---|---|
frontend-review |
任务完成验收前、PR 提交前 | 全量代码审查,输出问题清单 |
frontend-test |
新增/修改业务组件、工具函数 | 生成单元测试、组件测试用例 |
frontend-perf |
页面卡顿、加载慢、渲染性能差 | 性能分析,输出优化方案 |
开发阶段无需主动调用子 skill。在交付前的自检环节,按需引用对应 skill 辅助校验。