@tinkcarlos/skillora 0.2.0

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.
Files changed (234) hide show
  1. package/.claude/skills/.temp-skill-index.md +245 -0
  2. package/.claude/skills/SKILL.md +264 -0
  3. package/.claude/skills/api-scaffolding/SKILL.md +431 -0
  4. package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
  5. package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
  6. package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
  7. package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
  8. package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
  9. package/.claude/skills/api-testing-observability/SKILL.md +583 -0
  10. package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
  11. package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
  12. package/.claude/skills/brainstorming/SKILL.md +283 -0
  13. package/.claude/skills/bug-fixing/SKILL.md +382 -0
  14. package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
  15. package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
  16. package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
  17. package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
  18. package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
  19. package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
  20. package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
  21. package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
  22. package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
  23. package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
  24. package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
  25. package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
  26. package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
  27. package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
  28. package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
  29. package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
  30. package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
  31. package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
  32. package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
  33. package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
  34. package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
  35. package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
  36. package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
  37. package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
  38. package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
  39. package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
  40. package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
  41. package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
  42. package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
  43. package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
  44. package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
  45. package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
  46. package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
  47. package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
  48. package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
  49. package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
  50. package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
  51. package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
  52. package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
  53. package/.claude/skills/code-review/SKILL.md +535 -0
  54. package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
  55. package/.claude/skills/code-review/references/automated-analysis.md +456 -0
  56. package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
  57. package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
  58. package/.claude/skills/code-review/references/backend-review.md +868 -0
  59. package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
  60. package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
  61. package/.claude/skills/code-review/references/common-patterns.md +321 -0
  62. package/.claude/skills/code-review/references/configuration-review.md +425 -0
  63. package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
  64. package/.claude/skills/code-review/references/database-review.md +298 -0
  65. package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
  66. package/.claude/skills/code-review/references/external-standards.md +51 -0
  67. package/.claude/skills/code-review/references/feature-review.md +329 -0
  68. package/.claude/skills/code-review/references/file-review-template.md +326 -0
  69. package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
  70. package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
  71. package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
  72. package/.claude/skills/code-review/references/frontend-review.md +783 -0
  73. package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
  74. package/.claude/skills/code-review/references/fullstack-review.md +477 -0
  75. package/.claude/skills/code-review/references/functional-completeness.md +386 -0
  76. package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
  77. package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
  78. package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
  79. package/.claude/skills/code-review/references/iteration-review.md +264 -0
  80. package/.claude/skills/code-review/references/job-review.md +335 -0
  81. package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
  82. package/.claude/skills/code-review/references/logic-completeness.md +535 -0
  83. package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
  84. package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
  85. package/.claude/skills/code-review/references/new-project-review.md +226 -0
  86. package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
  87. package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
  88. package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
  89. package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
  90. package/.claude/skills/code-review/references/python-patterns.md +494 -0
  91. package/.claude/skills/code-review/references/rca-techniques.md +362 -0
  92. package/.claude/skills/code-review/references/report-template.md +430 -0
  93. package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
  94. package/.claude/skills/code-review/references/review-dimensions.md +311 -0
  95. package/.claude/skills/code-review/references/review-guide.md +202 -0
  96. package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
  97. package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
  98. package/.claude/skills/code-review/references/review-record-template.md +195 -0
  99. package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
  100. package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
  101. package/.claude/skills/containerization/SKILL.md +313 -0
  102. package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
  103. package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
  104. package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
  105. package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
  106. package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
  107. package/.claude/skills/frontend-design/LICENSE.txt +177 -0
  108. package/.claude/skills/frontend-design/SKILL.md +587 -0
  109. package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
  110. package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
  111. package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
  112. package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
  113. package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
  114. package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
  115. package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
  116. package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
  117. package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
  118. package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
  119. package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
  120. package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
  121. package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
  122. package/.claude/skills/fullstack-developer/SKILL.md +512 -0
  123. package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
  124. package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
  125. package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
  126. package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
  127. package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
  128. package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
  129. package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
  130. package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
  131. package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
  132. package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
  133. package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
  134. package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
  135. package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
  136. package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
  137. package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
  138. package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
  139. package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
  140. package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
  141. package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
  142. package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
  143. package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
  144. package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
  145. package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
  146. package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
  147. package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
  148. package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
  149. package/.claude/skills/performance-optimization/SKILL.md +250 -0
  150. package/.claude/skills/product-requirements/SKILL.md +357 -0
  151. package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
  152. package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
  153. package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
  154. package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
  155. package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
  156. package/.claude/skills/product-requirements/references/external-standards.md +62 -0
  157. package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
  158. package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
  159. package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
  160. package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
  161. package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
  162. package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
  163. package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
  164. package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
  165. package/.claude/skills/react-best-practices/SKILL.md +198 -0
  166. package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
  167. package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
  168. package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
  169. package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
  170. package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
  171. package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
  172. package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
  173. package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
  174. package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
  175. package/.claude/skills/security-audit/SKILL.md +226 -0
  176. package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
  177. package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
  178. package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
  179. package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
  180. package/.claude/skills/shared-references/skill-call-graph.md +230 -0
  181. package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
  182. package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
  183. package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
  184. package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
  185. package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
  186. package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
  187. package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
  188. package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
  189. package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
  190. package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
  191. package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
  192. package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
  193. package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
  194. package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
  195. package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
  196. package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
  197. package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
  198. package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
  199. package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
  200. package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
  201. package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
  202. package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
  203. package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
  204. package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
  205. package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
  206. package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
  207. package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
  208. package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
  209. package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
  210. package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
  211. package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
  212. package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
  213. package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
  214. package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
  215. package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
  216. package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
  217. package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
  218. package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
  219. package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
  220. package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
  221. package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
  222. package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
  223. package/.claude/skills/test-driven-development/SKILL.md +246 -0
  224. package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
  225. package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
  226. package/.claude/skills/using-skillstack/SKILL.md +127 -0
  227. package/.claude/skills/vercel-deploy/SKILL.md +166 -0
  228. package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
  229. package/.claude/skills/verification-before-completion/SKILL.md +305 -0
  230. package/.claude/skills/writing-plans/SKILL.md +259 -0
  231. package/README.md +69 -0
  232. package/bin/cli.js +468 -0
  233. package/lib/init.js +333 -0
  234. package/package.json +29 -0
@@ -0,0 +1,482 @@
1
+ # 前端常见问题检查清单 (Frontend Common Issues)
2
+
3
+ > 前端开发中经常出现的 Bug 和问题,代码审查时必须逐项检查。
4
+
5
+ ---
6
+
7
+ ## 🔴 P0 级问题 (必须修复)
8
+
9
+ ### 1. 状态管理问题
10
+
11
+ #### 1.1 闭包陷阱 (Stale Closure)
12
+
13
+ ```typescript
14
+ // ❌ 错误:闭包捕获了旧的 state 值
15
+ const [count, setCount] = useState(0);
16
+
17
+ useEffect(() => {
18
+ const timer = setInterval(() => {
19
+ console.log(count); // 永远是 0!
20
+ setCount(count + 1); // 永远设置为 1!
21
+ }, 1000);
22
+ return () => clearInterval(timer);
23
+ }, []); // 空依赖数组导致闭包陷阱
24
+
25
+ // ✅ 正确:使用函数式更新
26
+ useEffect(() => {
27
+ const timer = setInterval(() => {
28
+ setCount(prev => prev + 1); // 使用最新值
29
+ }, 1000);
30
+ return () => clearInterval(timer);
31
+ }, []);
32
+ ```
33
+
34
+ **检查点**:
35
+ - [ ] setInterval/setTimeout 中是否使用了函数式更新
36
+ - [ ] 事件监听器中是否使用了 useCallback 或 useRef
37
+ - [ ] 异步回调中是否依赖了可能过期的 state
38
+
39
+ #### 1.2 useEffect 依赖缺失
40
+
41
+ ```typescript
42
+ // ❌ 错误:缺少依赖
43
+ const [userId, setUserId] = useState(1);
44
+ const [user, setUser] = useState(null);
45
+
46
+ useEffect(() => {
47
+ fetchUser(userId).then(setUser);
48
+ }, []); // 缺少 userId 依赖!userId 变化不会重新获取
49
+
50
+ // ✅ 正确:包含所有依赖
51
+ useEffect(() => {
52
+ fetchUser(userId).then(setUser);
53
+ }, [userId]);
54
+ ```
55
+
56
+ **检查点**:
57
+ - [ ] useEffect 依赖数组是否包含所有使用的变量
58
+ - [ ] ESLint exhaustive-deps 规则是否启用
59
+ - [ ] 是否有 // eslint-disable-next-line 注释绕过检查
60
+
61
+ #### 1.3 useEffect 清理缺失
62
+
63
+ ```typescript
64
+ // ❌ 错误:没有清理订阅
65
+ useEffect(() => {
66
+ const subscription = eventBus.subscribe('event', handler);
67
+ // 组件卸载后 handler 仍会被调用!
68
+ }, []);
69
+
70
+ // ✅ 正确:清理订阅
71
+ useEffect(() => {
72
+ const subscription = eventBus.subscribe('event', handler);
73
+ return () => subscription.unsubscribe();
74
+ }, []);
75
+ ```
76
+
77
+ **检查点**:
78
+ - [ ] WebSocket 连接是否在卸载时关闭
79
+ - [ ] 定时器是否在卸载时清除
80
+ - [ ] 事件监听是否在卸载时移除
81
+ - [ ] 异步请求是否有取消机制
82
+
83
+ #### 1.4 竞态条件 (Race Condition)
84
+
85
+ ```typescript
86
+ // ❌ 错误:快速切换 userId 可能显示错误数据
87
+ useEffect(() => {
88
+ fetchUser(userId).then(setUser);
89
+ }, [userId]);
90
+
91
+ // ✅ 正确:使用标志位或 AbortController
92
+ useEffect(() => {
93
+ let cancelled = false;
94
+ fetchUser(userId).then(data => {
95
+ if (!cancelled) setUser(data);
96
+ });
97
+ return () => { cancelled = true; };
98
+ }, [userId]);
99
+
100
+ // ✅ 更好:使用 AbortController
101
+ useEffect(() => {
102
+ const controller = new AbortController();
103
+ fetchUser(userId, { signal: controller.signal })
104
+ .then(setUser)
105
+ .catch(e => {
106
+ if (e.name !== 'AbortError') throw e;
107
+ });
108
+ return () => controller.abort();
109
+ }, [userId]);
110
+ ```
111
+
112
+ **检查点**:
113
+ - [ ] 快速切换参数时是否会显示错误数据
114
+ - [ ] 是否有取消机制防止过期响应更新状态
115
+
116
+ ---
117
+
118
+ ### 2. 表单处理问题
119
+
120
+ #### 2.1 表单重复提交
121
+
122
+ ```typescript
123
+ // ❌ 错误:没有防重复提交
124
+ const handleSubmit = async () => {
125
+ await api.submit(formData);
126
+ };
127
+
128
+ // ✅ 正确:禁用按钮 + loading 状态
129
+ const [isSubmitting, setIsSubmitting] = useState(false);
130
+
131
+ const handleSubmit = async () => {
132
+ if (isSubmitting) return;
133
+ setIsSubmitting(true);
134
+ try {
135
+ await api.submit(formData);
136
+ } finally {
137
+ setIsSubmitting(false);
138
+ }
139
+ };
140
+
141
+ <button disabled={isSubmitting} onClick={handleSubmit}>
142
+ {isSubmitting ? '提交中...' : '提交'}
143
+ </button>
144
+ ```
145
+
146
+ **检查点**:
147
+ - [ ] 提交按钮是否在请求期间禁用
148
+ - [ ] 是否有 loading 状态提示
149
+ - [ ] 是否防止了快速双击
150
+
151
+ #### 2.2 表单验证缺失
152
+
153
+ ```typescript
154
+ // ❌ 错误:没有前端验证
155
+ const handleSubmit = () => {
156
+ api.submit({ email, password }); // 直接提交
157
+ };
158
+
159
+ // ✅ 正确:前端验证 + 错误提示
160
+ const handleSubmit = () => {
161
+ const errors = {};
162
+ if (!email) errors.email = '邮箱不能为空';
163
+ if (!email.includes('@')) errors.email = '邮箱格式不正确';
164
+ if (!password) errors.password = '密码不能为空';
165
+ if (password.length < 8) errors.password = '密码至少8位';
166
+
167
+ if (Object.keys(errors).length > 0) {
168
+ setErrors(errors);
169
+ return;
170
+ }
171
+ api.submit({ email, password });
172
+ };
173
+ ```
174
+
175
+ **检查点**:
176
+ - [ ] 必填字段是否有验证
177
+ - [ ] 格式验证是否完整(邮箱、手机号、身份证等)
178
+ - [ ] 错误信息是否清晰显示
179
+ - [ ] 验证失败时是否阻止提交
180
+
181
+ ---
182
+
183
+ ### 3. 异步处理问题
184
+
185
+ #### 3.1 Promise 错误未捕获
186
+
187
+ ```typescript
188
+ // ❌ 错误:Promise 错误未处理
189
+ const fetchData = async () => {
190
+ const data = await api.getData(); // 如果失败,错误被吞掉
191
+ setData(data);
192
+ };
193
+
194
+ // ✅ 正确:捕获并处理错误
195
+ const fetchData = async () => {
196
+ try {
197
+ const data = await api.getData();
198
+ setData(data);
199
+ } catch (error) {
200
+ setError(error.message);
201
+ toast.error('获取数据失败');
202
+ }
203
+ };
204
+ ```
205
+
206
+ **检查点**:
207
+ - [ ] 所有 async 函数是否有 try-catch
208
+ - [ ] 所有 Promise 是否有 .catch()
209
+ - [ ] 错误是否有用户友好的提示
210
+
211
+ #### 3.2 Loading 状态缺失
212
+
213
+ ```typescript
214
+ // ❌ 错误:没有 loading 状态
215
+ const [data, setData] = useState(null);
216
+
217
+ useEffect(() => {
218
+ api.getData().then(setData);
219
+ }, []);
220
+
221
+ return <div>{data?.name}</div>; // 加载时显示空白
222
+
223
+ // ✅ 正确:完整的状态处理
224
+ const [data, setData] = useState(null);
225
+ const [loading, setLoading] = useState(true);
226
+ const [error, setError] = useState(null);
227
+
228
+ useEffect(() => {
229
+ setLoading(true);
230
+ api.getData()
231
+ .then(setData)
232
+ .catch(setError)
233
+ .finally(() => setLoading(false));
234
+ }, []);
235
+
236
+ if (loading) return <Spinner />;
237
+ if (error) return <ErrorMessage error={error} />;
238
+ if (!data) return <EmptyState />;
239
+ return <div>{data.name}</div>;
240
+ ```
241
+
242
+ **检查点**:
243
+ - [ ] 是否有 loading 状态
244
+ - [ ] 是否有 error 状态
245
+ - [ ] 是否有 empty 状态
246
+ - [ ] 状态切换是否平滑
247
+
248
+ ---
249
+
250
+ ### 4. 渲染问题
251
+
252
+ #### 4.1 条件渲染短路问题
253
+
254
+ ```typescript
255
+ // ❌ 错误:0 会被渲染出来
256
+ const count = 0;
257
+ return <div>{count && <span>Count: {count}</span>}</div>;
258
+ // 渲染结果: <div>0</div>
259
+
260
+ // ✅ 正确:使用三元运算符或 Boolean 转换
261
+ return <div>{count > 0 && <span>Count: {count}</span>}</div>;
262
+ // 或
263
+ return <div>{Boolean(count) && <span>Count: {count}</span>}</div>;
264
+ // 或
265
+ return <div>{count ? <span>Count: {count}</span> : null}</div>;
266
+ ```
267
+
268
+ **检查点**:
269
+ - [ ] && 左侧是否可能是 0 或空字符串
270
+ - [ ] 条件渲染是否使用了正确的方式
271
+
272
+ #### 4.2 列表 key 问题
273
+
274
+ ```typescript
275
+ // ❌ 错误:使用 index 作为 key
276
+ {items.map((item, index) => (
277
+ <Item key={index} data={item} />
278
+ ))}
279
+
280
+ // ✅ 正确:使用唯一标识
281
+ {items.map(item => (
282
+ <Item key={item.id} data={item} />
283
+ ))}
284
+ ```
285
+
286
+ **检查点**:
287
+ - [ ] 列表是否使用了唯一且稳定的 key
288
+ - [ ] key 是否避免使用 index(除非列表不会重排序)
289
+
290
+ #### 4.3 无限渲染循环
291
+
292
+ ```typescript
293
+ // ❌ 错误:每次渲染都创建新对象,触发无限循环
294
+ const Component = () => {
295
+ const [data, setData] = useState({});
296
+
297
+ useEffect(() => {
298
+ setData({ ...data, updated: true }); // 无限循环!
299
+ }, [data]);
300
+ };
301
+
302
+ // ✅ 正确:使用函数式更新或正确的依赖
303
+ useEffect(() => {
304
+ setData(prev => ({ ...prev, updated: true }));
305
+ }, []); // 只执行一次
306
+ ```
307
+
308
+ **检查点**:
309
+ - [ ] useEffect 是否可能触发无限循环
310
+ - [ ] setState 是否在 render 中直接调用
311
+
312
+ ---
313
+
314
+ ## 🟠 P1 级问题 (应该修复)
315
+
316
+ ### 5. 性能问题
317
+
318
+ #### 5.1 不必要的重渲染
319
+
320
+ ```typescript
321
+ // ❌ 错误:每次父组件渲染都创建新函数
322
+ const Parent = () => {
323
+ const handleClick = () => console.log('clicked');
324
+ return <Child onClick={handleClick} />;
325
+ };
326
+
327
+ // ✅ 正确:使用 useCallback
328
+ const Parent = () => {
329
+ const handleClick = useCallback(() => console.log('clicked'), []);
330
+ return <Child onClick={handleClick} />;
331
+ };
332
+ ```
333
+
334
+ **检查点**:
335
+ - [ ] 传递给子组件的函数是否使用 useCallback
336
+ - [ ] 传递给子组件的对象是否使用 useMemo
337
+ - [ ] 子组件是否使用 React.memo
338
+
339
+ #### 5.2 大列表未虚拟化
340
+
341
+ ```typescript
342
+ // ❌ 错误:渲染 10000 个 DOM 节点
343
+ {items.map(item => <Item key={item.id} data={item} />)}
344
+
345
+ // ✅ 正确:使用虚拟列表
346
+ import { FixedSizeList } from 'react-window';
347
+
348
+ <FixedSizeList
349
+ height={400}
350
+ itemCount={items.length}
351
+ itemSize={50}
352
+ >
353
+ {({ index, style }) => (
354
+ <Item style={style} data={items[index]} />
355
+ )}
356
+ </FixedSizeList>
357
+ ```
358
+
359
+ **检查点**:
360
+ - [ ] 列表超过 100 项是否使用虚拟化
361
+ - [ ] 表格数据量大时是否有分页或虚拟滚动
362
+
363
+ ---
364
+
365
+ ### 6. 用户体验问题
366
+
367
+ #### 6.1 无障碍访问缺失
368
+
369
+ ```typescript
370
+ // ❌ 错误:缺少无障碍属性
371
+ <div onClick={handleClick}>点击我</div>
372
+
373
+ // ✅ 正确:添加无障碍支持
374
+ <button onClick={handleClick}>点击我</button>
375
+ // 或
376
+ <div
377
+ role="button"
378
+ tabIndex={0}
379
+ onClick={handleClick}
380
+ onKeyDown={e => e.key === 'Enter' && handleClick()}
381
+ >
382
+ 点击我
383
+ </div>
384
+ ```
385
+
386
+ **检查点**:
387
+ - [ ] 可点击元素是否使用 button 或有 role="button"
388
+ - [ ] 图片是否有 alt 属性
389
+ - [ ] 表单元素是否有 label
390
+ - [ ] 颜色对比度是否足够
391
+
392
+ #### 6.2 移动端适配问题
393
+
394
+ ```css
395
+ /* ❌ 错误:点击区域太小 */
396
+ .icon-button {
397
+ width: 24px;
398
+ height: 24px;
399
+ }
400
+
401
+ /* ✅ 正确:最小 44x44px */
402
+ .icon-button {
403
+ width: 44px;
404
+ height: 44px;
405
+ display: flex;
406
+ align-items: center;
407
+ justify-content: center;
408
+ }
409
+ ```
410
+
411
+ **检查点**:
412
+ - [ ] 点击区域是否至少 44x44px
413
+ - [ ] 是否有响应式布局
414
+ - [ ] 输入框字体是否 >= 16px(防止 iOS 缩放)
415
+
416
+ ---
417
+
418
+ ### 7. 安全问题
419
+
420
+ #### 7.1 XSS 风险
421
+
422
+ ```typescript
423
+ // ❌ 危险:直接插入 HTML
424
+ <div dangerouslySetInnerHTML={{ __html: userInput }} />
425
+
426
+ // ✅ 安全:使用 DOMPurify 清理
427
+ import DOMPurify from 'dompurify';
428
+ <div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(userInput) }} />
429
+ ```
430
+
431
+ **检查点**:
432
+ - [ ] 是否使用了 dangerouslySetInnerHTML
433
+ - [ ] 用户输入是否经过清理
434
+ - [ ] URL 参数是否经过验证
435
+
436
+ #### 7.2 敏感信息泄露
437
+
438
+ ```typescript
439
+ // ❌ 错误:在前端存储敏感信息
440
+ localStorage.setItem('password', password);
441
+ console.log('API Key:', apiKey);
442
+
443
+ // ✅ 正确:只存储必要的 token
444
+ localStorage.setItem('accessToken', token);
445
+ // 敏感信息只在内存中短暂存在
446
+ ```
447
+
448
+ **检查点**:
449
+ - [ ] localStorage 是否存储了敏感信息
450
+ - [ ] console.log 是否输出了敏感信息
451
+ - [ ] 错误信息是否暴露了内部细节
452
+
453
+ ---
454
+
455
+ ## 📋 前端检查清单汇总
456
+
457
+ ```markdown
458
+ ## 前端代码审查检查清单
459
+
460
+ ### P0 必须检查
461
+ - [ ] 闭包陷阱:setInterval/setTimeout 中使用函数式更新
462
+ - [ ] useEffect 依赖:依赖数组完整
463
+ - [ ] useEffect 清理:订阅/定时器/连接正确清理
464
+ - [ ] 竞态条件:快速切换不会显示错误数据
465
+ - [ ] 表单重复提交:按钮禁用 + loading 状态
466
+ - [ ] 表单验证:必填 + 格式验证
467
+ - [ ] Promise 错误处理:try-catch 或 .catch()
468
+ - [ ] Loading/Error/Empty 状态:三态完整
469
+
470
+ ### P1 应该检查
471
+ - [ ] 条件渲染:&& 左侧不是 0 或空字符串
472
+ - [ ] 列表 key:使用唯一标识
473
+ - [ ] 无限循环:useEffect 不会无限触发
474
+ - [ ] 性能优化:useCallback/useMemo/React.memo
475
+ - [ ] 大列表:虚拟化或分页
476
+ - [ ] 无障碍:button/role/alt/label
477
+ - [ ] 移动端:点击区域 >= 44px
478
+
479
+ ### P0 安全检查
480
+ - [ ] XSS:dangerouslySetInnerHTML 使用 DOMPurify
481
+ - [ ] 敏感信息:不在 localStorage/console 暴露
482
+ ```