Files
agent/.opencode/skills/tech-stack/umijs-procomponents/SKILL.md
2026-02-16 12:46:37 +08:00

149 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: umijs-procomponents
description: UmiJS 4 + Ant Design 5 + ProComponents 全栈开发规范。涵盖技术栈约束、组件用法、样式系统、服务层架构、国际化和图标管理。当项目使用 UmiJS + ProComponents 技术栈时PM 必须将本 Skill 的要点注入给所有子 Agent。
---
# UmiJS + ProComponents 开发规范
## 1. 技术栈
- **框架**: UmiJS 4 + React 18 + TypeScript严格模式
- **UI 库**: Ant Design 5 + ProComponentsProTable, ProForm, ProLayout 等)
- **数据流**: `useRequest`ahooks / Umi 内置、Umi Models
- **路由/权限**: Umi Max 内置插件 — `access``initialState``request``model``locale`
## 2. ProComponents 使用规范
### 2.1 组件选型原则
- **配置优于代码**: 始终优先使用 ProComponents 的 `request` 属性处理数据加载。
- 利用 `valueType` 进行字段自动格式化。
- 只有在 ProComponents 无法满足极度复杂需求时才使用原生 Antd 或手动实现。
### 2.2 组件映射
| 场景 | 组件 |
| :-------- | :------------------------------------- |
| 列表/表格 | `ProTable` |
| 表单 | `ProForm` / `ModalForm` / `DrawerForm` |
| 搜索/筛选 | `QueryFilter` / `LightFilter` |
| 布局 | `ProLayout` / `PageContainer` |
| 详情 | `ProDescriptions` |
### 2.3 ⚠️ 禁止双内边距
- **严禁**在 `ProTable``QueryFilter``ProForm` 外层包裹 `Card` 组件。
- **原因**: ProComponents 自带卡片样式,额外包裹导致双内边距问题。
- **错误示例**: `<Card><ProTable /></Card>`
- **正确示例**: `<ProTable style={{ marginBottom: token.marginLG }} />`
## 3. 搜索区域规范Separated Card 模式)
### 3.1 复杂度规则
- **< 4 个搜索字段**: 使用 `ProTable` 内置 `search` 属性。
- **>= 4 个搜索字段**: 使用独立 `QueryFilter` 组件,配置 `layout="vertical"`
### 3.2 视觉结构
- 搜索区域: 直接使用 `QueryFilter`(自带白色背景和内边距)。
- 背景色: `QueryFilter` **必须**设置白色背景(`token.colorBgContainer`)。
- 表格区域: 直接使用 `ProTable`(自带卡片样式)。
- 间距: `QueryFilter` 使用 `style={{ marginBottom: token.marginLG }}`
- **⚠️ 避免双内边距**: 不要在 `QueryFilter``ProTable` 外层再包裹 `div``Card` 添加 padding。
## 4. 样式系统
### 4.1 零 CSS 文件
- **严格**使用 Ant Design Design Tokens 内联样式。
- 使用 `const { token } = theme.useToken()` 获取 token。
- 间距调整: 使用 `style={{ marginBottom: token.marginLG }}` 而非外层容器。
- **禁止**导入 `.module.css` 或外部样式表。
### 4.2 图标
- **统一**使用 `@ant-design/icons`
- 除非明确要求或用于特定品牌标志否则不使用外部图标库、SVG 或 emoji。
### 4.3 UI 框架
- **严格**使用原生 Ant Design ProComponents。禁止自定义 UI/UX 设计工具。
- 表单布局: 输入标签放在输入框上方(`layout="vertical"`)。
## 5. 服务层架构
### 5.1 真实服务层
- 所有页面逻辑必须调用 `src/services/`。禁止在 JSX 中内联 mock 数据或逻辑。
- **强制使用 useRequest**: 所有数据交互(包括查询、提交、删除)**必须**通过 `useRequest` hook 发起。
- **禁止直接 request**: 严禁在组件内直接手动调用 `request` 方法(除非在极特殊的底层封装中)。`useRequest` 提供了标准化的 loading、error 和 data 状态管理,手动 `request` 会导致状态管理不一致。
### 5.2 统一 Mocking
- 使用 UmiJS `mock/` 目录存放所有 mock 数据。禁止在组件中硬编码对象。
### 5.3 类型定义
- TypeScript 接口统一在 `data.d.ts` 中定义。
### 5.4 菜单配置
- 菜单图标必须在 `src/app.ts` 中配置渲染逻辑(确保图标显示为图形而非文本)。
- 菜单文案必须配置在 `src/locales/`Key 以 `menu.` 开头(如 `menu.system.user`)。
## 6. 国际化 (i18n)
### 6.1 强制规则
- 所有面向用户的字符串**必须**使用 `intl.formatMessage``<FormattedMessage>`
- **每个** `formatMessage``FormattedMessage` 调用**必须**包含 `defaultMessage` 作为后备。
- 示例: `intl.formatMessage({ id: 'key', defaultMessage: '默认文案' })`
-`src/locales/` 中维护翻译。
### 6.2 双语同步
- **必须**同时在 `src/locales/zh-CN.ts``en-US.ts` 中定义所有使用的 Key。
- **严禁**仅添加中文而忽略英文,或仅添加英文而忽略中文。
### 6.3 QA 验证
- 测试时必须在两种语言环境下验证页面显示。
- 浏览器控制台不得出现 `[React Intl] Missing message` 警告。
## 7. Figma 图标导出规范
当 Figma 设计稿中包含图标元素时:
### 7.1 优先级原则
1. **优先匹配 Ant Design Icons**: 检查设计稿中的图标是否可用 `@ant-design/icons` 替代。如果视觉上高度一致,**必须使用 Ant Design 图标**。
2. **自定义图标导出**: 仅当 Ant Design Icons 中**没有匹配或视觉差异明显**时,才从 Figma 导出。
### 7.2 导出流程
1. 使用 Figma MCP 获取图标设计详情。
2. 导出为 **SVG 格式**,保存到 `src/assets/icons/`
3. 文件命名: `icon-{功能名称}.svg`(全小写,中划线分隔)。
4. 封装为 React 组件存放 `src/components/Icons/`
5.`src/components/Icons/index.ts` 中统一导出。
### 7.3 目录结构
```
src/
├── assets/icons/
│ ├── icon-custom-chart.svg
│ └── icon-data-flow.svg
└── components/Icons/
├── index.ts
├── CustomChartIcon.tsx
└── DataFlowIcon.tsx
```
## 8. Ant Design 5 兼容性
- 使用 `open` 而非 `visible`
- 使用 `onOpenChange` 而非 `onVisibleChange`
- 对 Ant Design 5 更新极为警惕,避免使用废弃 API。