sdd-full 5.0.4 → 5.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/api-contract-agent.md +102 -44
- package/.claude/agents/ui-designer-agent.md +64 -30
- package/.claude/instructions/ui-designer-agent.md +98 -33
- package/.claude/skills/architecture-refactor/SKILL.md +150 -0
- package/.claude/skills/code-review-standard/SKILL.md +169 -0
- package/.claude/skills/code-split-spec/SKILL.md +252 -0
- package/.claude/skills/component-split/SKILL.md +252 -0
- package/.claude/skills/data-fetching/SKILL.md +219 -0
- package/.claude/skills/sdd-code/SKILL.md +11 -2
- package/.claude/skills/sdd-common/SKILL.md +48 -0
- package/.claude/skills/state-management/SKILL.md +260 -0
- package/.claude/standards/code-standard.md +40 -0
- package/bin.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review-standard
|
|
3
|
+
description: 代码审查标准技能 - 具体的代码审查检查清单和审查流程规范
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# code-review-standard - 代码审查标准技能
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
提供具体的代码审查检查清单和审查流程规范,确保代码质量。
|
|
11
|
+
|
|
12
|
+
**核心原则:客观、具体、建设性**
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. 代码审查流程
|
|
17
|
+
|
|
18
|
+
### 1.1 审查前准备
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
1. 变更范围:PR 不超过 400 行(建议)
|
|
22
|
+
2. 描述清晰:说明变更目的、影响范围
|
|
23
|
+
3. 自测通过:提交前已验证功能
|
|
24
|
+
4. 检查清单:作者先自查
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 1.2 审查中
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
1. 理解意图:先理解代码做什么
|
|
31
|
+
2. 逐项检查:对照清单检查
|
|
32
|
+
3. 具体反馈:指明问题位置和原因
|
|
33
|
+
4. 建议优先:用建议代替命令
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 1.3 审查后
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
1. 讨论分歧:有不同意见时及时沟通
|
|
40
|
+
2. 确认修复:确保所有问题都处理
|
|
41
|
+
3. 记录学习:记录有价值的审查点
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 2. 代码审查检查清单
|
|
47
|
+
|
|
48
|
+
### 2.1 功能性检查
|
|
49
|
+
|
|
50
|
+
- [ ] 功能实现正确,符合需求
|
|
51
|
+
- [ ] 边界条件处理(空值、最大值等)
|
|
52
|
+
- [ ] 错误处理完整
|
|
53
|
+
- [ ] 没有明显的 bug
|
|
54
|
+
|
|
55
|
+
### 2.2 代码质量检查
|
|
56
|
+
|
|
57
|
+
- [ ] 命名清晰、有意义
|
|
58
|
+
- [ ] 函数/类单一职责
|
|
59
|
+
- [ ] 没有重复代码
|
|
60
|
+
- [ ] 注释适量,不冗余
|
|
61
|
+
- [ ] 遵循项目代码规范
|
|
62
|
+
|
|
63
|
+
### 2.3 架构/设计检查
|
|
64
|
+
|
|
65
|
+
- [ ] 模块划分合理
|
|
66
|
+
- [ ] 依赖关系清晰
|
|
67
|
+
- [ ] 没有引入不必要的依赖
|
|
68
|
+
- [ ] 考虑可扩展性
|
|
69
|
+
|
|
70
|
+
### 2.4 性能检查
|
|
71
|
+
|
|
72
|
+
- [ ] 没有明显的性能问题
|
|
73
|
+
- [ ] 避免不必要的计算
|
|
74
|
+
- [ ] 合理使用缓存
|
|
75
|
+
|
|
76
|
+
### 2.5 安全检查
|
|
77
|
+
|
|
78
|
+
- [ ] 输入验证/ sanitization
|
|
79
|
+
- [ ] 没有安全漏洞(SQL注入、XSS等)
|
|
80
|
+
- [ ] 敏感数据处理得当
|
|
81
|
+
|
|
82
|
+
### 2.6 测试检查
|
|
83
|
+
|
|
84
|
+
- [ ] 有对应的单元测试
|
|
85
|
+
- [ ] 测试覆盖核心场景
|
|
86
|
+
- [ ] 测试清晰、可维护
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 3. 审查反馈的写法
|
|
91
|
+
|
|
92
|
+
### 3.1 好的反馈 vs 坏的反馈
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
坏的反馈:
|
|
96
|
+
"这代码写得不好"
|
|
97
|
+
"你应该用另一种方法"
|
|
98
|
+
|
|
99
|
+
好的反馈:
|
|
100
|
+
"这里可以考虑用 xxx 方法,原因是..."
|
|
101
|
+
"这个变量命名可以更清晰一点,建议叫 xxx"
|
|
102
|
+
"这部分逻辑有点复杂,能否加个注释?"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 3.2 反馈分类
|
|
106
|
+
|
|
107
|
+
- **必须修改**:功能问题、安全问题
|
|
108
|
+
- **建议修改**:可改进点
|
|
109
|
+
- **可选**:风格问题
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 4. 常见问题处理
|
|
114
|
+
|
|
115
|
+
### 4.1 意见分歧
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
1. 理解对方观点
|
|
119
|
+
2. 提供客观理由
|
|
120
|
+
3. 必要时寻求第三方意见
|
|
121
|
+
4. 以目标为导向,而非个人
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 4.2 大 PR 处理
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
建议拆分:
|
|
128
|
+
1. 按功能模块拆分
|
|
129
|
+
2. 按重构 vs 新功能拆分
|
|
130
|
+
3. 分阶段提交审查
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 5. Flutter/前端/后端 专项检查
|
|
136
|
+
|
|
137
|
+
### 5.1 Flutter 专项
|
|
138
|
+
|
|
139
|
+
- [ ] Widget 拆分合理
|
|
140
|
+
- [ ] 状态管理恰当
|
|
141
|
+
- [ ] 性能优化考虑(const、key等)
|
|
142
|
+
|
|
143
|
+
### 5.2 前端专项
|
|
144
|
+
|
|
145
|
+
- [ ] 组件复用合理
|
|
146
|
+
- [ ] 状态管理恰当
|
|
147
|
+
- [ ] 响应式/适配考虑
|
|
148
|
+
|
|
149
|
+
### 5.3 后端专项
|
|
150
|
+
|
|
151
|
+
- [ ] API 设计合理
|
|
152
|
+
- [ ] 数据库查询优化
|
|
153
|
+
- [ ] 事务处理正确
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 6. 审查文化
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
- 对事不对人
|
|
161
|
+
- 互相学习
|
|
162
|
+
- 感谢审查者的时间
|
|
163
|
+
- 快速响应反馈
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## 与其他技能的衔接
|
|
167
|
+
|
|
168
|
+
- **配合**:code-split-spec、test-driven-development
|
|
169
|
+
- **参考**:sdd-code、quality-gate
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-split-spec
|
|
3
|
+
description: 代码拆分规范 - 指导代码文件、模块、组件的拆分原则和最佳实践
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# code-split-spec - 代码拆分规范技能
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
提供代码拆分的统一规范和最佳实践,指导如何合理拆分代码文件、模块、组件,确保代码可维护性、可扩展性。
|
|
11
|
+
|
|
12
|
+
**核心原则:高内聚、低耦合、单一职责**
|
|
13
|
+
|
|
14
|
+
## 1. 代码拆分判断标准
|
|
15
|
+
|
|
16
|
+
### 1.1 何时需要拆分
|
|
17
|
+
|
|
18
|
+
| 判断维度 | 拆分阈值 | 说明 |
|
|
19
|
+
|---------|---------|------|
|
|
20
|
+
| 文件行数 | >500行 | 单个文件过大,考虑拆分 |
|
|
21
|
+
| 函数行数 | >50行 | 函数过长,提取子函数 |
|
|
22
|
+
| 类/组件职责 | >3个 | 职责过多,拆分为多个类 |
|
|
23
|
+
| 模块依赖 | >5个外部依赖 | 依赖过多,考虑解耦 |
|
|
24
|
+
| 变更频率 | 不同部分变更频率差异大 | 按变更频率拆分 |
|
|
25
|
+
|
|
26
|
+
### 1.2 何时不应拆分
|
|
27
|
+
|
|
28
|
+
- 高度耦合的逻辑(必须一起修改)
|
|
29
|
+
- 拆分后导致接口过度复杂
|
|
30
|
+
- 过度设计(YAGNI原则)
|
|
31
|
+
- 小功能(<100行,清晰易懂)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. 通用代码拆分规范
|
|
36
|
+
|
|
37
|
+
### 2.1 文件拆分原则
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
单一职责:每个文件只负责一个核心功能
|
|
41
|
+
命名清晰:文件名准确表达内容
|
|
42
|
+
层级合理:目录深度不超过5层
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 2.2 模块拆分原则
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
按功能域拆分:用户、订单、支付等
|
|
49
|
+
按层次拆分:UI层、业务层、数据层
|
|
50
|
+
按依赖方向:核心模块不依赖边缘模块
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 2.3 通用目录结构示例
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
src/
|
|
57
|
+
├── core/ # 核心基础设施
|
|
58
|
+
│ ├── utils/ # 工具函数
|
|
59
|
+
│ ├── constants/ # 常量定义
|
|
60
|
+
│ └── types/ # 类型定义
|
|
61
|
+
├── features/ # 功能模块(按领域拆分)
|
|
62
|
+
│ ├── user/ # 用户模块
|
|
63
|
+
│ └── order/ # 订单模块
|
|
64
|
+
├── shared/ # 共享组件/模块
|
|
65
|
+
└── app/ # 应用入口、配置
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 3. 前端代码拆分规范
|
|
71
|
+
|
|
72
|
+
### 3.1 React/Vue 组件拆分
|
|
73
|
+
|
|
74
|
+
#### 组件拆分层级
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
1. Pages/Views - 页面级组件(路由对应)
|
|
78
|
+
2. Layouts - 布局组件
|
|
79
|
+
3. Features - 业务功能组件
|
|
80
|
+
4. Shared/Common - 通用UI组件
|
|
81
|
+
5. UI Kit - 基础原子组件
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
#### 组件文件结构示例
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
features/
|
|
88
|
+
└── user-profile/
|
|
89
|
+
├── index.ts # 模块入口
|
|
90
|
+
├── UserProfile.tsx # 主组件
|
|
91
|
+
├── UserProfile.test.tsx
|
|
92
|
+
├── components/ # 子组件
|
|
93
|
+
│ ├── Avatar.tsx
|
|
94
|
+
│ └── BioEditor.tsx
|
|
95
|
+
├── hooks/ # 自定义Hooks
|
|
96
|
+
│ └── useUserProfile.ts
|
|
97
|
+
├── services/ # 服务层
|
|
98
|
+
│ └── userApi.ts
|
|
99
|
+
└── types/ # 类型定义
|
|
100
|
+
└── user.types.ts
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 3.2 状态与逻辑拆分
|
|
104
|
+
|
|
105
|
+
- **状态管理**:单独的 store/state 目录
|
|
106
|
+
- **业务逻辑**:放在 hooks/services 中,不在组件内
|
|
107
|
+
- **纯函数**:提取到 utils/helpers
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 4. 后端代码拆分规范
|
|
112
|
+
|
|
113
|
+
### 4.1 分层架构拆分
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
Controller/Handler 层:请求处理、参数校验
|
|
117
|
+
Service 层:业务逻辑
|
|
118
|
+
Repository/DAO 层:数据访问
|
|
119
|
+
Model/Entity 层:数据模型
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 4.2 后端目录结构示例
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
src/
|
|
126
|
+
├── controllers/ # 控制器层
|
|
127
|
+
├── services/ # 服务层
|
|
128
|
+
├── repositories/ # 数据访问层
|
|
129
|
+
├── models/ # 数据模型
|
|
130
|
+
├── dto/ # 数据传输对象
|
|
131
|
+
├── middleware/ # 中间件
|
|
132
|
+
└── utils/ # 工具
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 4.3 按领域拆分(DDD)
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
src/
|
|
139
|
+
├── modules/
|
|
140
|
+
│ ├── user/
|
|
141
|
+
│ │ ├── UserController.ts
|
|
142
|
+
│ │ ├── UserService.ts
|
|
143
|
+
│ │ ├── UserRepository.ts
|
|
144
|
+
│ │ └── User.ts
|
|
145
|
+
│ └── order/
|
|
146
|
+
└── shared/
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 5. Flutter 代码拆分规范
|
|
152
|
+
|
|
153
|
+
### 5.1 Flutter 目录结构
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
lib/
|
|
157
|
+
├── core/
|
|
158
|
+
│ ├── constants/
|
|
159
|
+
│ ├── utils/
|
|
160
|
+
│ ├── theme/
|
|
161
|
+
│ └── router/
|
|
162
|
+
├── features/
|
|
163
|
+
│ └── feature_name/
|
|
164
|
+
│ ├── data/ # 数据层
|
|
165
|
+
│ │ ├── models/
|
|
166
|
+
│ │ ├── datasources/
|
|
167
|
+
│ │ └── repositories/
|
|
168
|
+
│ ├── domain/ # 领域层
|
|
169
|
+
│ │ ├── entities/
|
|
170
|
+
│ │ ├── repositories/
|
|
171
|
+
│ │ └── usecases/
|
|
172
|
+
│ └── presentation/ # 表现层
|
|
173
|
+
│ ├── pages/
|
|
174
|
+
│ ├── widgets/
|
|
175
|
+
│ └── bloc/ # 或 provider/riverpod
|
|
176
|
+
└── shared/
|
|
177
|
+
├── widgets/
|
|
178
|
+
└── utils/
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### 5.2 Widget 拆分原则
|
|
182
|
+
|
|
183
|
+
- 一个 Widget 一个文件
|
|
184
|
+
- 拆分为小的、可复用的 Widget
|
|
185
|
+
- 业务逻辑放在 State 或外部管理类中
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 6. 代码拆分检查清单
|
|
190
|
+
|
|
191
|
+
### 6.1 拆分前检查
|
|
192
|
+
|
|
193
|
+
- [ ] 明确拆分目标(可维护性、可测试性、复用性)
|
|
194
|
+
- [ ] 分析依赖关系,避免循环依赖
|
|
195
|
+
- [ ] 规划拆分后的目录结构
|
|
196
|
+
- [ ] 评估对现有代码的影响
|
|
197
|
+
|
|
198
|
+
### 6.2 拆分后检查
|
|
199
|
+
|
|
200
|
+
- [ ] 单一职责:每个模块/文件职责清晰
|
|
201
|
+
- [ ] 低耦合:模块间依赖最小化
|
|
202
|
+
- [ ] 可测试:拆分后的代码更容易测试
|
|
203
|
+
- [ ] 命名规范:文件/模块命名准确
|
|
204
|
+
- [ ] 文档更新:相关文档同步更新
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 7. 常见拆分模式
|
|
209
|
+
|
|
210
|
+
### 7.1 按职责拆分
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
// Bad: 一个文件包含太多职责
|
|
214
|
+
class UserManager {
|
|
215
|
+
validateUser() { ... }
|
|
216
|
+
saveUser() { ... }
|
|
217
|
+
sendWelcomeEmail() { ... }
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Good: 按职责拆分
|
|
221
|
+
class UserValidator { ... }
|
|
222
|
+
class UserRepository { ... }
|
|
223
|
+
class EmailService { ... }
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 7.2 按变更频率拆分
|
|
227
|
+
|
|
228
|
+
- 稳定的核心逻辑 → 独立模块
|
|
229
|
+
- 频繁变更的配置 → 配置文件
|
|
230
|
+
- 可选的功能 → 插件/扩展机制
|
|
231
|
+
|
|
232
|
+
### 7.3 按复用范围拆分
|
|
233
|
+
|
|
234
|
+
- 全局复用 → shared/common
|
|
235
|
+
- 模块内复用 → 模块内部
|
|
236
|
+
- 一次性使用 → 就地定义
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 8. 重构拆分流程
|
|
241
|
+
|
|
242
|
+
1. **分析现状**:绘制依赖图,识别耦合点
|
|
243
|
+
2. **制定计划**:明确拆分步骤,避免 breaking change
|
|
244
|
+
3. **小步迭代**:每次只拆分一小部分,确保可运行
|
|
245
|
+
4. **保持测试**:每次拆分后运行测试
|
|
246
|
+
5. **提交验证**:频繁提交,方便回滚
|
|
247
|
+
|
|
248
|
+
## 与其他技能的衔接
|
|
249
|
+
|
|
250
|
+
- **前置**:sdd-code(SDD拆分)
|
|
251
|
+
- **配合**:component-split、architecture-refactor
|
|
252
|
+
- **后置**:test-driven-development(测试保障)
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: component-split
|
|
3
|
+
description: 组件拆分技能 - 前端组件化拆分的最佳实践和可复用性指导
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# component-split - 组件拆分技能
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
提供前端组件拆分的统一规范,指导如何将复杂界面拆分为可复用、可测试的小组件。
|
|
11
|
+
|
|
12
|
+
**核心原则:单一职责、可复用、可组合、可测试**
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. 组件拆分判断标准
|
|
17
|
+
|
|
18
|
+
### 1.1 何时拆分组件
|
|
19
|
+
|
|
20
|
+
| 判断维度 | 拆分阈值 | 说明 |
|
|
21
|
+
|---------|---------|------|
|
|
22
|
+
| JSX/模板行数 | >100行 | 组件过大 |
|
|
23
|
+
| 职责数量 | >2个 | 职责过多 |
|
|
24
|
+
| Props数量 | >7个 | 接口复杂 |
|
|
25
|
+
| 嵌套层级 | >5层 | 难以理解 |
|
|
26
|
+
| 可复用性 | 2+处使用 | 提取为组件 |
|
|
27
|
+
|
|
28
|
+
### 1.2 组件类型拆分
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
1. 容器组件(Smart):负责数据、逻辑
|
|
32
|
+
2. 展示组件(Dumb):负责UI、样式
|
|
33
|
+
3. 业务组件:特定业务场景
|
|
34
|
+
4. 通用组件:跨场景复用
|
|
35
|
+
5. 布局组件:页面结构
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 2. React 组件拆分实践
|
|
41
|
+
|
|
42
|
+
### 2.1 按职责拆分示例
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// Bad: 大而全的组件
|
|
46
|
+
function UserPage() {
|
|
47
|
+
const [user, setUser] = useState();
|
|
48
|
+
const [loading, setLoading] = useState();
|
|
49
|
+
const [formData, setFormData] = useState();
|
|
50
|
+
|
|
51
|
+
useEffect(() => { fetchUser(); }, []);
|
|
52
|
+
|
|
53
|
+
const handleSubmit = () => { ... };
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<div>
|
|
57
|
+
<header>
|
|
58
|
+
<nav>...</nav>
|
|
59
|
+
</header>
|
|
60
|
+
<main>
|
|
61
|
+
<div>
|
|
62
|
+
<img src={user.avatar} />
|
|
63
|
+
<h1>{user.name}</h1>
|
|
64
|
+
<form onSubmit={handleSubmit}>
|
|
65
|
+
...大量表单代码
|
|
66
|
+
</form>
|
|
67
|
+
</div>
|
|
68
|
+
</main>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Good: 按职责拆分
|
|
74
|
+
function UserPage() {
|
|
75
|
+
const { user, loading } = useUser();
|
|
76
|
+
return (
|
|
77
|
+
<PageLayout>
|
|
78
|
+
<UserHeader user={user} />
|
|
79
|
+
<UserProfileForm user={user} />
|
|
80
|
+
</PageLayout>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2.2 组件目录结构
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
src/components/
|
|
89
|
+
├── layout/
|
|
90
|
+
│ ├── PageLayout.tsx
|
|
91
|
+
│ ├── Header.tsx
|
|
92
|
+
│ └── Sidebar.tsx
|
|
93
|
+
├── ui/ # 基础UI组件
|
|
94
|
+
│ ├── Button.tsx
|
|
95
|
+
│ ├── Input.tsx
|
|
96
|
+
│ ├── Card.tsx
|
|
97
|
+
│ └── Modal.tsx
|
|
98
|
+
├── user/ # 用户相关组件
|
|
99
|
+
│ ├── UserAvatar.tsx
|
|
100
|
+
│ ├── UserProfile.tsx
|
|
101
|
+
│ └── UserForm.tsx
|
|
102
|
+
└── product/ # 产品相关组件
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 3. Vue 组件拆分实践
|
|
108
|
+
|
|
109
|
+
### 3.1 组合式函数拆分
|
|
110
|
+
|
|
111
|
+
```vue
|
|
112
|
+
<!-- Bad: 大组件 -->
|
|
113
|
+
<script setup>
|
|
114
|
+
const user = ref();
|
|
115
|
+
const loading = ref();
|
|
116
|
+
const formData = ref();
|
|
117
|
+
async function fetchUser() { ... }
|
|
118
|
+
function handleSubmit() { ... }
|
|
119
|
+
</script>
|
|
120
|
+
|
|
121
|
+
<template>
|
|
122
|
+
<div>
|
|
123
|
+
<!-- 大量代码 -->
|
|
124
|
+
</div>
|
|
125
|
+
</template>
|
|
126
|
+
|
|
127
|
+
<!-- Good: 拆分 -->
|
|
128
|
+
<script setup>
|
|
129
|
+
const { user, loading } = useUser();
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
<template>
|
|
133
|
+
<PageLayout>
|
|
134
|
+
<UserHeader :user="user" />
|
|
135
|
+
<UserProfileForm :user="user" />
|
|
136
|
+
</PageLayout>
|
|
137
|
+
</template>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 4. Flutter Widget 拆分实践
|
|
143
|
+
|
|
144
|
+
### 4.1 Widget 拆分原则
|
|
145
|
+
|
|
146
|
+
```dart
|
|
147
|
+
// Bad: 大而全的 build 方法
|
|
148
|
+
class UserPage extends StatelessWidget {
|
|
149
|
+
@override
|
|
150
|
+
Widget build(BuildContext context) {
|
|
151
|
+
return Scaffold(
|
|
152
|
+
appBar: AppBar(title: Text('User')),
|
|
153
|
+
body: Column(
|
|
154
|
+
children: [
|
|
155
|
+
// ... 大量嵌套代码
|
|
156
|
+
],
|
|
157
|
+
),
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Good: 拆分为小 Widget
|
|
163
|
+
class UserPage extends StatelessWidget {
|
|
164
|
+
@override
|
|
165
|
+
Widget build(BuildContext context) {
|
|
166
|
+
return Scaffold(
|
|
167
|
+
appBar: const UserPageAppBar(),
|
|
168
|
+
body: Column(
|
|
169
|
+
children: const [
|
|
170
|
+
UserAvatar(),
|
|
171
|
+
UserProfile(),
|
|
172
|
+
UserActionButtons(),
|
|
173
|
+
],
|
|
174
|
+
),
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
class UserPageAppBar extends StatelessWidget { ... }
|
|
180
|
+
class UserAvatar extends StatelessWidget { ... }
|
|
181
|
+
class UserProfile extends StatelessWidget { ... }
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 5. 组件设计原则
|
|
187
|
+
|
|
188
|
+
### 5.1 Props 设计
|
|
189
|
+
|
|
190
|
+
- **少而精**:不超过7个props
|
|
191
|
+
- **单一数据结构**:相关数据组合为对象
|
|
192
|
+
- **回调函数命名**:on+动作,如 `onClick`、`onSubmit`
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// Bad: props过多
|
|
196
|
+
<Component
|
|
197
|
+
title="..."
|
|
198
|
+
subtitle="..."
|
|
199
|
+
avatar="..."
|
|
200
|
+
onClick={...}
|
|
201
|
+
onEdit={...}
|
|
202
|
+
/>
|
|
203
|
+
|
|
204
|
+
// Good: 组合数据
|
|
205
|
+
<Component user={user} onAction={handleAction} />
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### 5.2 组件通信
|
|
209
|
+
|
|
210
|
+
```
|
|
211
|
+
1. 父 → 子:Props
|
|
212
|
+
2. 子 → 父:回调函数
|
|
213
|
+
3. 兄弟:共同父组件 + 状态提升
|
|
214
|
+
4. 跨层级:Context/Provider/状态管理
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 6. 可复用性设计
|
|
220
|
+
|
|
221
|
+
### 6.1 组件抽象层级
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
原子组件:Button、Input、Icon
|
|
225
|
+
↓
|
|
226
|
+
复合组件:SearchBar(Input+Button)、FormField
|
|
227
|
+
↓
|
|
228
|
+
业务组件:UserCard、ProductList
|
|
229
|
+
↓
|
|
230
|
+
页面组件:UserPage、ProductDetail
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 6.2 复用 vs 复制
|
|
234
|
+
|
|
235
|
+
- **复用**:逻辑相同,仅数据不同
|
|
236
|
+
- **复制**:看起来相似,实则独立演进
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 7. 组件拆分检查清单
|
|
241
|
+
|
|
242
|
+
- [ ] 单一职责:每个组件只做一件事
|
|
243
|
+
- [ ] Props简洁:不超过7个
|
|
244
|
+
- [ ] 可测试:容易编写单元测试
|
|
245
|
+
- [ ] 可复用:考虑未来复用场景
|
|
246
|
+
- [ ] 命名清晰:见名知意
|
|
247
|
+
- [ ] 文档完整:关键用法有示例
|
|
248
|
+
|
|
249
|
+
## 与其他技能的衔接
|
|
250
|
+
|
|
251
|
+
- **配合**:code-split-spec、state-management
|
|
252
|
+
- **参考**:design-to-code、sdd-code
|