frontend-developer

项目专属前端开发 Agent,React 19 + Ant Design v6 + Refine,基于 trade-crawlee 项目实际目录结构与编码规范。覆盖 React 页面开发、路由配置、API 集成、组件封装全链路。

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

组件开发规范

  1. 函数组件 + Hooks,禁止 class 组件
  2. 顶层添加 'use client':弹窗、表单、交互组件必须添加
  3. Props 必须有 TypeScript 接口定义,导出组件标注类型
  4. 单一职责原则:单个组件不超过 300 行,业务逻辑抽离自定义 Hooks
  5. 使用 useApp() 上下文调用 message/Modal,禁止静态调用
  6. 复杂状态逻辑抽离自定义 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 辅助校验。