@bovinphang/frontend-craft 2.5.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 (180) hide show
  1. package/.claude-plugin/marketplace.json +61 -0
  2. package/.claude-plugin/plugin.json +32 -0
  3. package/.mcp.json +44 -0
  4. package/CHANGELOG.md +229 -0
  5. package/CHANGELOG.zh-CN.md +228 -0
  6. package/CODE_OF_CONDUCT.md +34 -0
  7. package/CODE_OF_CONDUCT.zh-CN.md +34 -0
  8. package/CONTRIBUTING.md +356 -0
  9. package/CONTRIBUTING.zh-CN.md +356 -0
  10. package/LICENSE +21 -0
  11. package/README.md +467 -0
  12. package/README.openclaw.md +262 -0
  13. package/README.openclaw.zh-CN.md +262 -0
  14. package/README.zh-CN.md +467 -0
  15. package/SECURITY.md +44 -0
  16. package/SECURITY.zh-CN.md +44 -0
  17. package/agents/fec-architect.md +125 -0
  18. package/agents/fec-code-reviewer.md +152 -0
  19. package/agents/fec-debugger.md +44 -0
  20. package/agents/fec-design-token-mapper.md +75 -0
  21. package/agents/fec-doc-updater.md +30 -0
  22. package/agents/fec-e2e-runner.md +107 -0
  23. package/agents/fec-figma-implementer.md +104 -0
  24. package/agents/fec-performance-optimizer.md +293 -0
  25. package/agents/fec-refactor-cleaner.md +32 -0
  26. package/agents/fec-security-reviewer.md +116 -0
  27. package/agents/fec-test-planner.md +50 -0
  28. package/agents/fec-typescript-reviewer.md +142 -0
  29. package/agents/fec-ui-checker.md +120 -0
  30. package/commands/fec-debug.md +30 -0
  31. package/commands/fec-doc-sync.md +18 -0
  32. package/commands/fec-init.md +70 -0
  33. package/commands/fec-plan.md +94 -0
  34. package/commands/fec-refactor-clean.md +19 -0
  35. package/commands/fec-review.md +66 -0
  36. package/commands/fec-scaffold.md +205 -0
  37. package/commands/fec-tdd.md +21 -0
  38. package/dist/bin/frontend-craft.js +82 -0
  39. package/dist/hooks/fec-cleanup-claude-cache.js +4 -0
  40. package/dist/hooks/fec-format-changed-file.js +1 -0
  41. package/dist/hooks/fec-notify.js +1 -0
  42. package/dist/hooks/fec-run-tests.js +1 -0
  43. package/dist/hooks/fec-security-check.js +2 -0
  44. package/dist/hooks/fec-session-start.js +1 -0
  45. package/docs/example-prompts.md +124 -0
  46. package/docs/ja-JP/README.md +467 -0
  47. package/docs/ko-KR/README.md +467 -0
  48. package/docs/project-structure.md +119 -0
  49. package/docs/runtimes/antigravity.md +10 -0
  50. package/docs/runtimes/augment.md +10 -0
  51. package/docs/runtimes/claude.md +171 -0
  52. package/docs/runtimes/claude.zh-CN.md +169 -0
  53. package/docs/runtimes/cline.md +10 -0
  54. package/docs/runtimes/codebuddy.md +10 -0
  55. package/docs/runtimes/codex.md +10 -0
  56. package/docs/runtimes/copilot.md +10 -0
  57. package/docs/runtimes/cursor.md +10 -0
  58. package/docs/runtimes/gemini.md +10 -0
  59. package/docs/runtimes/kilo.md +10 -0
  60. package/docs/runtimes/openclaw.md +10 -0
  61. package/docs/runtimes/opencode.md +10 -0
  62. package/docs/runtimes/qoder.md +19 -0
  63. package/docs/runtimes/trae.md +10 -0
  64. package/docs/runtimes/windsurf.md +10 -0
  65. package/docs/superpowers/plans/2026-05-29-fec-debug.md +491 -0
  66. package/docs/superpowers/specs/2026-05-29-fec-debug-design.md +340 -0
  67. package/docs/zh-CN/example-prompts.md +124 -0
  68. package/docs/zh-CN/project-structure.md +119 -0
  69. package/docs/zh-TW/README.md +467 -0
  70. package/hooks/hooks.json +71 -0
  71. package/openclaw.plugin.json +26 -0
  72. package/package.json +101 -0
  73. package/skills/TEMPLATE.md +155 -0
  74. package/skills/eval_queries.json +890 -0
  75. package/skills/fec-accessibility-check/SKILL.md +39 -0
  76. package/skills/fec-accessibility-check/references/report-template.md +23 -0
  77. package/skills/fec-accessibility-check/references/screen-reader-testing.md +33 -0
  78. package/skills/fec-api-integration/SKILL.md +78 -0
  79. package/skills/fec-api-integration/references/integration-patterns.md +80 -0
  80. package/skills/fec-browser-storage/SKILL.md +34 -0
  81. package/skills/fec-browser-storage/references/storage-patterns.md +65 -0
  82. package/skills/fec-canvas-threejs/SKILL.md +66 -0
  83. package/skills/fec-canvas-threejs/references/rendering-patterns.md +67 -0
  84. package/skills/fec-canvas-threejs/references/shader-webgl-patterns.md +67 -0
  85. package/skills/fec-code-review/SKILL.md +135 -0
  86. package/skills/fec-code-review/references/report-template.md +29 -0
  87. package/skills/fec-component-testing/SKILL.md +119 -0
  88. package/skills/fec-data-fetching/SKILL.md +62 -0
  89. package/skills/fec-data-fetching/references/query-patterns.md +77 -0
  90. package/skills/fec-debug-framework/SKILL.md +162 -0
  91. package/skills/fec-dependency-upgrade/SKILL.md +34 -0
  92. package/skills/fec-dependency-upgrade/references/dependency-upgrade-workflow.md +56 -0
  93. package/skills/fec-doc-sync/SKILL.md +37 -0
  94. package/skills/fec-e2e-testing/SKILL.md +40 -0
  95. package/skills/fec-e2e-testing/references/e2e-advanced.md +176 -0
  96. package/skills/fec-e2e-testing/references/playwright-patterns.md +95 -0
  97. package/skills/fec-form-handling/SKILL.md +76 -0
  98. package/skills/fec-form-handling/references/advanced-form-patterns.md +72 -0
  99. package/skills/fec-implement-from-design/SKILL.md +122 -0
  100. package/skills/fec-implement-from-design/references/design-plan-template.md +36 -0
  101. package/skills/fec-legacy-to-modern-migration/SKILL.md +180 -0
  102. package/skills/fec-legacy-to-modern-migration/references/migration-report-template.md +41 -0
  103. package/skills/fec-legacy-web-standard/SKILL.md +35 -0
  104. package/skills/fec-legacy-web-standard/references/legacy-patterns.md +85 -0
  105. package/skills/fec-list-virtualization/SKILL.md +34 -0
  106. package/skills/fec-list-virtualization/references/virtualization-patterns.md +52 -0
  107. package/skills/fec-monorepo-project-standard/SKILL.md +142 -0
  108. package/skills/fec-motion-interaction/SKILL.md +66 -0
  109. package/skills/fec-motion-interaction/references/motion-patterns.md +112 -0
  110. package/skills/fec-nextjs-project-standard/SKILL.md +117 -0
  111. package/skills/fec-nuxt-project-standard/SKILL.md +122 -0
  112. package/skills/fec-performance-optimization/SKILL.md +72 -0
  113. package/skills/fec-pwa-implementation/SKILL.md +36 -0
  114. package/skills/fec-pwa-implementation/references/manifest-and-icons.md +53 -0
  115. package/skills/fec-pwa-implementation/references/service-worker-workbox.md +68 -0
  116. package/skills/fec-react-project-standard/SKILL.md +83 -0
  117. package/skills/fec-react-project-standard/references/react-project-details.md +642 -0
  118. package/skills/fec-refactor-clean/SKILL.md +48 -0
  119. package/skills/fec-responsive-layout/SKILL.md +34 -0
  120. package/skills/fec-responsive-layout/references/responsive-layout-patterns.md +59 -0
  121. package/skills/fec-route-protection/SKILL.md +135 -0
  122. package/skills/fec-security-review/SKILL.md +38 -0
  123. package/skills/fec-security-review/references/report-template.md +27 -0
  124. package/skills/fec-security-review/references/security-checklist.md +64 -0
  125. package/skills/fec-source-driven-development/SKILL.md +61 -0
  126. package/skills/fec-state-management/SKILL.md +140 -0
  127. package/skills/fec-state-management/references/state-patterns.md +109 -0
  128. package/skills/fec-storybook-component-doc/SKILL.md +37 -0
  129. package/skills/fec-storybook-component-doc/references/story-patterns.md +118 -0
  130. package/skills/fec-svg-animation/SKILL.md +148 -0
  131. package/skills/fec-tailwind-design-system/SKILL.md +34 -0
  132. package/skills/fec-tailwind-design-system/references/tailwind-system-patterns.md +55 -0
  133. package/skills/fec-tdd-workflow/SKILL.md +52 -0
  134. package/skills/fec-testing-strategy/SKILL.md +45 -0
  135. package/skills/fec-typescript-type-safety/SKILL.md +157 -0
  136. package/skills/fec-typescript-type-safety/references/type-safety-patterns.md +102 -0
  137. package/skills/fec-ui-design/SKILL.md +90 -0
  138. package/skills/fec-ui-design/data/product-rules.json +110 -0
  139. package/skills/fec-ui-design/data/stack-ui-rules.json +14 -0
  140. package/skills/fec-ui-design/data/style-archetypes.json +74 -0
  141. package/skills/fec-ui-design/data/ux-quality-rules.json +56 -0
  142. package/skills/fec-ui-design/references/design-intelligence.md +37 -0
  143. package/skills/fec-ui-design/references/master-page-overrides.md +30 -0
  144. package/skills/fec-ui-design/references/pre-delivery-checklist.md +33 -0
  145. package/skills/fec-ui-design/scripts/design-system.mjs +530 -0
  146. package/skills/fec-validation-fix/SKILL.md +48 -0
  147. package/skills/fec-vite-project-standard/SKILL.md +83 -0
  148. package/skills/fec-vue3-project-standard/SKILL.md +49 -0
  149. package/skills/fec-vue3-project-standard/references/vue3-project-details.md +547 -0
  150. package/skills/fec-web-workers/SKILL.md +36 -0
  151. package/skills/fec-web-workers/references/advanced-workers.md +54 -0
  152. package/skills/fec-web-workers/references/basic-worker.md +67 -0
  153. package/skills/metadata.json +1422 -0
  154. package/skills/relations.json +644 -0
  155. package/templates/claude/CLAUDE.md +106 -0
  156. package/templates/claude/settings.json +62 -0
  157. package/templates/codex/AGENTS.md +105 -0
  158. package/templates/codex/config.toml +32 -0
  159. package/templates/openclaw/AGENTS.md +101 -0
  160. package/templates/openclaw/OPENCLAW-CONFIG.md +12 -0
  161. package/templates/shared/rules/fec-agent-workflow.md +54 -0
  162. package/templates/shared/rules/fec-api-layer.md +99 -0
  163. package/templates/shared/rules/fec-ci-cd.md +128 -0
  164. package/templates/shared/rules/fec-code-comments.md +33 -0
  165. package/templates/shared/rules/fec-design-system.md +248 -0
  166. package/templates/shared/rules/fec-error-handling.md +200 -0
  167. package/templates/shared/rules/fec-git-conventions.md +73 -0
  168. package/templates/shared/rules/fec-i18n.md +112 -0
  169. package/templates/shared/rules/fec-naming-conventions.md +120 -0
  170. package/templates/shared/rules/fec-performance.md +101 -0
  171. package/templates/shared/rules/fec-react.md +82 -0
  172. package/templates/shared/rules/fec-refactoring.md +43 -0
  173. package/templates/shared/rules/fec-rendering-patterns.md +183 -0
  174. package/templates/shared/rules/fec-responsive-design.md +227 -0
  175. package/templates/shared/rules/fec-source-driven-development.md +31 -0
  176. package/templates/shared/rules/fec-state-management.md +163 -0
  177. package/templates/shared/rules/fec-testing.md +98 -0
  178. package/templates/shared/rules/fec-typescript.md +355 -0
  179. package/templates/shared/rules/fec-vue.md +64 -0
  180. package/templates/shared/rules/fec-working-modes.md +50 -0
@@ -0,0 +1,112 @@
1
+ # 国际化 (i18n) 规则
2
+
3
+ 凡是涉及用户可见文案、提示信息、表单标签、错误消息或 UI 文本时,都应用本文件。
4
+
5
+ <!-- 请根据项目实际 i18n 方案修改 locales 路径、库与 key 前缀 -->
6
+
7
+ ## 适用范围
8
+
9
+ - **现代栈(纯 React / Vue 等)**:以下「核心原则」「文案规范」「实现指导」与通用检查清单优先适用。
10
+ - **遗留 HTML/JS、渐进迁移或新旧并存**:新代码路径仍须满足核心原则;遗留层额外遵守「遗留代码与迁移场景」,避免扩大硬编码与混乱 key。
11
+
12
+ 下文用 **`src/locales/`** 指代项目实际文案资源目录,请按仓库约定替换(如 `public/locales`、`lang/`、`messages/` 等)。
13
+
14
+ ## 核心原则
15
+
16
+ - 在新应用代码(组件、路由页、hooks、composables)中,用户可见文案须使用 i18n,**禁止**硬编码中文或英文字符串
17
+ - i18n key 按模块组织,使用点分命名:`module.component.label`
18
+ - 相同语义的文案复用同一个 key,避免重复定义
19
+
20
+ ## 文案规范
21
+
22
+ ### 命名约定
23
+
24
+ ```
25
+ common.confirm → 通用确认
26
+ common.cancel → 通用取消
27
+ user.login.title → 用户登录标题
28
+ order.list.empty → 订单列表空状态
29
+ ```
30
+
31
+ ### 分类
32
+
33
+ - `common.*` — 跨模块通用文案(确认、取消、提交、加载中等)
34
+ - `module.component.*` — 模块级文案
35
+ - `validation.*` — 表单校验提示
36
+ - `error.*` — 错误信息
37
+
38
+ ### 语言文件
39
+
40
+ - **每种自然语言对应独立资源文件**(命名依项目约定,如 `en.json` 与 `zh-CN.json`,或 `en.ts` / `zh-CN.ts`),置于 `src/locales/`(或项目约定目录)下;**禁止**将多种语言的译文混写在同一文件或同一顶层多语言对象内,以免难以 diff、评审与按需加载。若仓库历史结构暂为混排,新增语言或新模块仍应优先采用分文件约定。
41
+ - **编码**:文案文件须以 **UTF-8** 保存(团队有约定时优先 **UTF-8 无 BOM**),确保在 IDE 中打开时中文、日文等非 ASCII 字符**不出现乱码**;禁止用系统默认 ANSI、GBK 等与 UTF-8 混用导致编码误判。若仓库已有 `.editorconfig`,与其中 `charset = utf-8` 等声明保持一致。
42
+
43
+ ## 遗留代码与迁移场景
44
+
45
+ 在渐进式迁移、微前端或新旧代码并存时:
46
+
47
+ - **遗留层**:不在 legacy HTML 或 JS 中**新写**用户可见的中/英文硬编码,除非该段为纯静态展示且仓库**尚未**建立可接入的国际化路径(避免扩大技术债)。
48
+ - **新代码路径**:React / Vue 等侧新增、修改的提示、错误、按钮、表单标签等,须走 i18n;新增子应用或模块时,须与现有语言文件结构、命名空间、懒加载策略一致,**不破坏**既有语言策略。
49
+ - **复用优先**:同一语义优先复用已有 key 或已有资源项,避免同一含义多份翻译。
50
+ - **多语言同步**:新增或修改条目后,至少核对当前功能已覆盖的**主要语言文件**是否一并更新。
51
+ - **改动前检索**:改提示、错误、按钮、表单标签前,先在 `src/locales/`(或项目约定目录)中搜索是否已有对应文案。
52
+ - **Key 与文案治理**:
53
+ - key 按**页面 / 模块 / 语义**组织,避免继续沿用历史缩写或无意义分段。
54
+ - 先按当前界面真实含义定 key,再写各语言译文。
55
+ - 旧文案若仅「能用但不准」,优先**重命名 key 并重写译文**,不为劣质命名长期保留并行兼容。
56
+ - 仅当某旧 key 已成为**对外契约**(后端、埋点、外部文档、第三方集成等固定引用)时,才引入映射层或别名过渡;否则不把历史包袱复制进新结构。
57
+
58
+ ## 实现指导
59
+
60
+ ### Vue(vue-i18n)
61
+
62
+ ```vue
63
+ <template>
64
+ <!-- 正确 -->
65
+ <span>{{ $t('order.status.pending') }}</span>
66
+ <!-- 错误:硬编码 -->
67
+ <span>待处理</span>
68
+ </template>
69
+ ```
70
+
71
+ ### React(react-intl / react-i18next)
72
+
73
+ ```tsx
74
+ // 正确
75
+ <FormattedMessage id="order.status.pending" />
76
+ // 或
77
+ const { t } = useTranslation();
78
+ <span>{t('order.status.pending')}</span>
79
+
80
+ // 错误:硬编码
81
+ <span>待处理</span>
82
+ ```
83
+
84
+ ## 检查清单
85
+
86
+ ### 通用
87
+
88
+ - [ ] 所有新增用户可见文案使用 i18n key(新代码路径)
89
+ - [ ] 新增 key 已添加到所有**应覆盖**的语言文件,且各语言仍分文件维护(未混写)
90
+ - [ ] 语言资源文件为 UTF-8(无 BOM 或按仓库约定),在 IDE 中打开无乱码
91
+ - [ ] key 命名符合模块.组件.用途 的约定
92
+ - [ ] 包含变量的文案使用插值而非拼接
93
+ - [ ] 复数形式使用 i18n 复数规则而非条件判断
94
+ - [ ] 日期、数字、货币使用 i18n 格式化
95
+
96
+ ### 迁移或混合栈时补充
97
+
98
+ - [ ] 已检索 `src/locales/`(或项目约定目录)中是否已有可复用文案
99
+ - [ ] 相关语言文件已同步更新
100
+ - [ ] 未在可国际化路径上新增用户可见硬编码(遗留静态例外见「遗留代码与迁移场景」)
101
+ - [ ] 新代码未破坏现有语言策略(命名空间、加载方式、子应用边界)
102
+
103
+ ## 反模式
104
+
105
+ - 在模板或 JSX 中直接写中文字符串(新代码路径)
106
+ - 使用字符串拼接代替 i18n 插值(`"共" + count + "条"` → `t('common.total', { count })`)
107
+ - 在 JS/TS 逻辑中硬编码提示信息(新代码路径)
108
+ - 不同模块为相同含义的文案创建不同的 key
109
+ - 多种语言混在同一资源文件或同一顶层对象内,导致 diff、评审与按需加载困难
110
+ - 用非 UTF-8 或错误编码保存文案文件,在 IDE / CI / 协作环境下出现乱码
111
+ - 为迁就历史缩写或劣质命名长期保留多套并行 key,而不做治理
112
+ - 在非契约场景下继续沿用无意义旧 key,把混乱结构复制到新模块
@@ -0,0 +1,120 @@
1
+ # 命名规范
2
+
3
+ ## 文件与目录命名
4
+
5
+ | 类型 | 命名风格 | 示例 |
6
+ |------|----------|------|
7
+ | 页面组件 | PascalCase + `Page` 后缀 | `UserDetailPage.tsx` / `UserDetailPage.vue` |
8
+ | 布局组件 | PascalCase + `Layout` 后缀 | `MainLayout.tsx` / `MainLayout.vue` |
9
+ | 通用组件 | PascalCase | `DataTable.tsx` / `AppButton.vue` |
10
+ | Hooks / Composables | camelCase + `use` 前缀 | `useAuth.ts`、`useDebounce.ts` |
11
+ | Store 文件 | camelCase + `Store` 后缀 | `authStore.ts`、`uiStore.ts` |
12
+ | API 文件 | camelCase | `api.ts` 或按领域命名 `userApi.ts` |
13
+ | 工具函数 | camelCase | `format.ts`、`validators.ts` |
14
+ | 类型文件 | camelCase | `types.ts`、`models.ts` |
15
+ | 常量文件 | camelCase | `constants.ts`、`config.ts` |
16
+ | 测试文件 | 与源文件同名 + `.spec` / `.test` | `Button.spec.tsx`、`useAuth.spec.ts` |
17
+ | 样式文件 | 组件名 + `.styles` + 扩展名 | `Button.styles.css`、`DataTable.styles.scss`;使用 styled-components 时为 `ComponentName.styles.ts` |
18
+ | 语言包 | 语言代码(BCP 47) | `zh-CN.json`、`en-US.json` |
19
+ | 目录名 | PascalCase(组件/页面)或 kebab-case(功能模块) | `UserDetail/`、`auth/`、`order/` |
20
+
21
+ ## 组件命名
22
+
23
+ ### React
24
+
25
+ ```tsx
26
+ // 文件名与组件名一致
27
+ // src/components/DataTable/DataTable.tsx
28
+ export function DataTable({ data, columns }: DataTableProps) { ... }
29
+
30
+ // 页面组件加 Page 后缀
31
+ // src/pages/UserDetail/UserDetailPage.tsx
32
+ export default function UserDetailPage() { ... }
33
+ ```
34
+
35
+ ### Vue
36
+
37
+ ```vue
38
+ <!-- 文件名与组件名一致 -->
39
+ <!-- src/components/AppButton/AppButton.vue -->
40
+ <script setup lang="ts">
41
+ // 无需 defineOptions,文件名即组件名
42
+ </script>
43
+ ```
44
+
45
+ - 多词组件名(避免与 HTML 原生标签冲突)
46
+ - Vue 全局组件推荐使用 `App` 前缀(`AppButton`、`AppModal`)
47
+ - 模板中使用 PascalCase 引用:`<AppButton>` 而非 `<app-button>`
48
+
49
+ ## 变量与函数命名
50
+
51
+ | 类型 | 命名风格 | 示例 |
52
+ |------|----------|------|
53
+ | 普通变量 | camelCase | `userName`、`isLoading`、`pageSize` |
54
+ | 常量 | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT`、`DEFAULT_PAGE_SIZE` |
55
+ | 布尔值 | `is` / `has` / `should` / `can` 前缀 | `isVisible`、`hasPermission`、`canEdit` |
56
+ | 事件处理(组件内) | `handle` 前缀 | `handleClick`、`handleSubmit` |
57
+ | 回调 Props | `on` 前缀 | `onClick`、`onSubmit`、`onChange` |
58
+ | 数组 | 复数名词 | `users`、`orderItems`、`selectedIds` |
59
+ | Map / Record | `xxxMap` 或 `xxxByYyy` | `userMap`、`permissionsById` |
60
+ | Ref (Vue) | 不加 `Ref` 后缀 | `count`(不用 `countRef`) |
61
+ | 接口 | PascalCase,不加 `I` 前缀 | `UserProfile`(不用 `IUserProfile`) |
62
+ | Props 接口 | 组件名 + `Props` | `DataTableProps`、`UserFormProps` |
63
+ | Emits 接口 | 组件名 + `Emits` | `UserFormEmits` |
64
+ | 枚举 | PascalCase,成员用 PascalCase | `OrderStatus.Pending` |
65
+ | 泛型参数 | 单字母大写或语义化 | `T`、`TData`、`TItem` |
66
+
67
+ ## CSS 类命名
68
+
69
+ - 与项目约定保持一致(BEM / CSS Modules / Tailwind / Atomic CSS)
70
+ - 如果使用 CSS Modules,类名用 camelCase:`.headerTitle`、`.cardBody`
71
+ - 如果使用 BEM,遵循 `block__element--modifier` 格式
72
+ - CSS 变量使用 kebab-case:`--color-primary`、`--spacing-md`
73
+
74
+ ## 路由命名
75
+
76
+ | 类型 | 命名风格 | 示例 |
77
+ |------|----------|------|
78
+ | 路由路径 | kebab-case | `/user-detail`、`/order-list` |
79
+ | 路由名称 | PascalCase | `UserDetail`、`OrderList` |
80
+ | 路由参数 | camelCase | `:userId`、`:orderId` |
81
+ | 查询参数 | camelCase | `?pageSize=10&sortBy=name` |
82
+ | 路径常量 | UPPER_SNAKE_CASE | `ROUTE_USER_DETAIL = '/user-detail'` |
83
+
84
+ ## API 命名
85
+
86
+ | 类型 | 命名风格 | 示例 |
87
+ |------|----------|------|
88
+ | GET 列表 | `getXxxList` | `getUserList(params)` |
89
+ | GET 单条 | `getXxxDetail` / `getXxxById` | `getUserDetail(id)` |
90
+ | POST 创建 | `createXxx` | `createOrder(data)` |
91
+ | PUT 更新 | `updateXxx` | `updateUser(id, data)` |
92
+ | DELETE 删除 | `deleteXxx` | `deleteOrder(id)` |
93
+ | DTO 类型 | 动词 + 名词 + `DTO` | `CreateOrderDTO`、`UpdateUserDTO` |
94
+ | 响应类型 | 名词 | `User`、`Order`、`PageResult<User>` |
95
+
96
+ ## i18n Key 命名
97
+
98
+ - 使用点分命名空间:`module.section.label`
99
+ - 示例:`user.form.username`、`common.button.submit`、`error.network.timeout`
100
+ - 不使用中文 / 拼音作为 key
101
+
102
+ ## 反模式
103
+
104
+ - 文件名和组件名不一致(`user-table.tsx` 导出 `DataGrid`)
105
+ - 同一项目混用多种命名风格(有的 kebab-case 有的 PascalCase)
106
+ - 使用缩写或不明确的名称(`btn`、`usr`、`tmp`、`handleA`)
107
+ - 布尔值没有语义前缀(`visible` → 应为 `isVisible`)
108
+ - 常量不用大写(`maxRetry` → 应为 `MAX_RETRY`)
109
+ - CSS 变量硬编码在组件中而非使用统一变量
110
+
111
+ ## 检查清单
112
+
113
+ - [ ] 文件名与导出的组件/函数名一致
114
+ - [ ] 页面组件有 `Page` 后缀,布局组件有 `Layout` 后缀
115
+ - [ ] 布尔变量使用 `is` / `has` / `can` / `should` 前缀
116
+ - [ ] 事件处理用 `handle` 前缀,回调 Props 用 `on` 前缀
117
+ - [ ] 常量使用 UPPER_SNAKE_CASE
118
+ - [ ] 路由路径使用 kebab-case,路由名使用 PascalCase
119
+ - [ ] API 函数命名与 HTTP 方法语义一致
120
+ - [ ] i18n key 使用点分命名空间,无硬编码文案
@@ -0,0 +1,101 @@
1
+ # 前端性能规则
2
+
3
+ 凡是新增页面、组件、资源加载或数据请求时,都应用本文件。
4
+
5
+ ## 核心原则
6
+
7
+ - 默认懒加载,按需加载
8
+ - 减少首屏关键资源
9
+ - 避免不必要的重渲染
10
+ - 关注 Core Web Vitals
11
+ - 前端构建必须同时验证开发体验和生产产物,不能只看 dev server 正常
12
+ - 在上下文或任务边界不清时,不启动大规模性能重构;先定位瓶颈再改代码
13
+ - 对长时间运行的命令保留可回看日志,必要时使用终端会话、CI artifact 或测试报告
14
+ - 每项性能建议都要绑定证据、影响范围、验证方式和回退风险
15
+
16
+ ## 代码分割与懒加载
17
+
18
+ ### 路由级分割
19
+
20
+ ```tsx
21
+ // React
22
+ const Dashboard = lazy(() => import('./pages/Dashboard'));
23
+
24
+ // Vue
25
+ const Dashboard = () => import('./pages/Dashboard.vue');
26
+ ```
27
+
28
+ ### 组件级分割
29
+
30
+ 仅在以下场景使用组件级懒加载:
31
+
32
+ - 重型第三方库(图表、编辑器、地图)
33
+ - 条件渲染的大型模块(如设置面板、高级筛选)
34
+ - 不在首屏可视区域的内容
35
+
36
+ ## 渲染性能
37
+
38
+ ### React
39
+
40
+ - 合理使用 `React.memo` 避免不必要的重渲染
41
+ - `useMemo` / `useCallback` 仅在依赖稳定且子组件使用 memo 时才有意义
42
+ - 列表渲染必须使用稳定的 `key`
43
+ - 避免在渲染函数内创建新对象、数组或函数
44
+
45
+ ### Vue
46
+
47
+ - 使用 `computed` 而非 `watch` + 手动赋值
48
+ - 大列表使用虚拟滚动
49
+ - 避免在 `v-for` 中使用 `v-if`
50
+ - 使用 `shallowRef` / `shallowReactive` 优化大型对象
51
+
52
+ ## 资源优化
53
+
54
+ - 图片使用 WebP/AVIF 格式,提供适当尺寸
55
+ - 图标优先使用 SVG sprite 或 icon font,避免大量独立图片请求
56
+ - 字体按需加载,使用 `font-display: swap`
57
+ - 第三方依赖按需导入(如 `import { Button } from 'antd'` 而非 `import antd from 'antd'`)
58
+
59
+ ## Vite 构建与开发性能
60
+
61
+ 使用 Vite 时额外遵守:
62
+
63
+ - `vite build` 不做类型检查,CI 必须单独执行 `tsc --noEmit` 或接入 `vite-plugin-checker`
64
+ - 慢启动先用 `vite --profile` 定位插件、解析或预构建瓶颈
65
+ - 大项目可使用 `server.warmup.clientFiles` 预热核心入口
66
+ - CJS/UMD 依赖互操作问题优先通过 `optimizeDeps.include` 处理
67
+ - 手动分包优先使用稳定对象形式,不要把每个 `node_modules` 包拆成独立 chunk
68
+ - 组件库模式必须 externalize peer dependencies,并单独产出类型声明
69
+ - `vite preview` 只用于本地构建烟测,不是生产服务器
70
+
71
+ ## 数据请求
72
+
73
+ - 避免瀑布式请求(串行依赖),尽可能并行
74
+ - 合理使用缓存策略(SWR / React Query / VueQuery)
75
+ - 分页加载或虚拟滚动处理大数据集
76
+ - 防抖/节流处理高频触发的请求(搜索、滚动)
77
+
78
+ ## 检查清单
79
+
80
+ - [ ] 是否记录核心路由、设备、网络和当前指标
81
+ - [ ] 路由是否按需加载
82
+ - [ ] 重型组件是否懒加载
83
+ - [ ] 大列表是否使用虚拟滚动或分页
84
+ - [ ] 图片是否使用现代格式和合理尺寸
85
+ - [ ] 第三方库是否按需导入
86
+ - [ ] 是否存在不必要的重渲染
87
+ - [ ] Vite 项目是否单独执行 typecheck
88
+ - [ ] Vite 构建产物是否经过 `vite build` 和本地预览烟测
89
+ - [ ] 是否复查 loading、error、empty、disabled 和移动端状态没有被优化破坏
90
+
91
+ ## 反模式
92
+
93
+ - 将所有路由打包在一个 chunk 中
94
+ - 在首屏加载整个图表库或编辑器
95
+ - 在组件内重复创建相同的 API 请求
96
+ - 大列表不做虚拟化直接渲染数千行 DOM
97
+ - 频繁操作(如输入、滚动)不做防抖/节流
98
+ - 认为 `vite build` 通过就代表 TypeScript 没有错误
99
+ - 设置 `envPrefix: ""` 或把服务端密钥注入客户端 bundle
100
+ - 未先复现卡顿、包体积或 Web Vitals 指标,就做大范围“性能优化”
101
+ - 为追求实验室分数删除状态反馈、降低可访问性或牺牲主路径可维护性
@@ -0,0 +1,82 @@
1
+ # React 规则
2
+
3
+ 当仓库或目标模块使用 React 时,应用本文件。
4
+
5
+ ## 技术栈
6
+
7
+ <!-- 请根据项目实际情况修改 -->
8
+
9
+ - 框架: React + TypeScript
10
+ - 样式: Tailwind CSS + CSS Modules
11
+ - 状态管理: Zustand / Redux Toolkit / Jotai(按项目实际选择)
12
+ - UI 组件库: 按项目实际选择(如 Ant Design、Material UI 或内部 Design System)
13
+ - 版本与依赖:新建模块、补充 `package.json` 或更新本节前,优先采用彼此兼容的主流稳定版本(对齐官方文档、脚手架默认值或包管理器推荐),避免混用已停止维护或与仓库主线 major 不匹配的依赖。
14
+
15
+ ## React 组件规范
16
+
17
+ - 使用**函数组件**、Hooks 与 TypeScript;**不要**新增类组件(含手写 Error Boundary,统一用 `react-error-boundary` 等库)
18
+ - 保持组件小而可组合
19
+ - 将可复用逻辑提取到 hooks
20
+ - props 保持明确且类型清晰
21
+ - 保持可访问性与键盘交互
22
+ - 优先使用可推导状态,避免重复维护 state
23
+ - 在创建新基础组件前,先复用现有设计系统
24
+ - 禁止使用 any,优先使用 unknown
25
+ - CSS 命名遵循 BEM(CSS Modules 场景)
26
+
27
+ ## 模式与最佳实践(React)
28
+
29
+ - **组合**:用小组件 + `children`/props 拼装;避免宽布尔 props 与假「继承」。
30
+ - **复合组件**:根组件用 Context 向子组件暴露状态;子组件在缺少 Context 时明确报错。
31
+ - **Render Props**:仅在需要封装数据态并把渲染交给上层时考虑;多数场景优先自定义 Hook + 普通组件。
32
+ - **Context + useReducer**:中等复杂度的多子树客户端状态;勿把高频变化大对象放在顶层 Context;服务端数据用 React Query / SWR。
33
+ - **表单**:中大型表单优先 React Hook Form + Zod;避免单文件巨型受控 state。
34
+ - **Error Boundary**:关键模块用 **`react-error-boundary`**(或团队统一的同类库)在模块边界兜底;业务组件一律函数式,不手写类组件 Error Boundary。
35
+ - **性能**:`useMemo`/`useCallback`/`React.memo` 按需使用;长列表用虚拟列表(如 TanStack Virtual、react-window);昂贵计算注意不可变派生(勿原地 `sort` 原数组)。
36
+ - **动效**:Framer Motion 或 CSS transition;尊重 `prefers-reduced-motion`。
37
+ - **无障碍**:复合控件补齐 `role`/`aria-*` 与键盘操作;弹窗管理焦点落入与关闭后恢复。
38
+ - **Next.js**:App Router 与 Server Components 相关约定以项目 Next 规则为准。
39
+
40
+ ## React 实现指导
41
+
42
+ 创建新组件前:
43
+
44
+ 1. 先搜索是否已存在等价组件
45
+ 2. 判断逻辑是否应该放入自定义 hook
46
+ 3. 与项目当前样式方案保持一致
47
+
48
+ 编辑 React 组件时:
49
+
50
+ - 避免在同一个文件里混合数据请求、重业务逻辑和展示逻辑
51
+ - 避免设计过宽或语义不清的 props API
52
+ - 对局部问题避免滥用 context
53
+ - 保持条件渲染可读,必要时提取重复分支
54
+
55
+ ## React 文件组织
56
+
57
+ 优先遵循仓库已有约定。
58
+ 常见输出可能包括:
59
+
60
+ - `Component.tsx`
61
+ - `Component.types.ts`
62
+ - `hooks/useComponentLogic.ts`
63
+ - `ComponentName.styles.css`(普通 CSS / CSS Modules;使用 styled-components 时为 `ComponentName.styles.ts`)
64
+ - 如果仓库采用就近测试,则补充测试文件,如:`__tests__/Component.spec.tsx`
65
+
66
+ ## 组件文件规模
67
+
68
+ - 单个组件文件保持**职责单一**、语义清晰、易于维护。
69
+ - **行数参考**:优先将单文件控制在约 **300 行**以内;超过 **500 行**应视为**强烈拆分信号**。
70
+ - **未到 500 行也应拆分**的情形:同时存在**复杂状态交织**、**过多副作用**、**JSX 嵌套过深**、**密集条件分支**、数据获取与 UI 长期混在同一文件等,使单文件难以一眼把握时,应拆为**子组件**、**自定义 Hooks**、**工具函数**、**常量**与**类型定义**等独立单元(目录与命名仍遵循上文「React 文件组织」)。
71
+
72
+ ## React 反模式
73
+
74
+ 避免:
75
+
76
+ - 新建**类组件**或手写类式 Error Boundary(应使用函数组件 + `react-error-boundary` 等)
77
+ - 对可推导值使用多余 state
78
+ - 大段 JSX 不拆成子组件
79
+ - 单文件堆叠过多职责与行数,**逾 500 行或复杂度已高**仍拒不拆分(参见上文「组件文件规模」)
80
+ - 使用不稳定 key
81
+ - 在 props 和 hooks 中无理由使用 `any`
82
+ - 没有充分理由时引入第二套样式体系
@@ -0,0 +1,43 @@
1
+ # 重构项目规则
2
+
3
+ 当任务涉及从现有项目重构、迁移或重写前端代码时,应用本文件。
4
+
5
+ ## 目标
6
+
7
+ - **视觉和交互**:与原项目一致,用户无感知差异
8
+ - **代码质量**:更简洁、易维护,符合目标框架规范
9
+ - **业务功能**:与原项目保持一致,**不得缺失功能**;重构前后行为等价
10
+
11
+ ## 图片与图标
12
+
13
+ - 直接使用原项目的图片资源路径,不重新托管或替换
14
+ - 可使用 SVG 图片(`<img src="*.svg" />` 或 CSS `background-image`),**禁止使用内联 SVG**(`<svg>...</svg>` 直接写在组件中)
15
+ - **若原项目使用了 iconfont 或 IcoMoon 图标,重构时继续使用**,保持图标体系一致;不替换为其他图标方案
16
+ - 图标优先使用原项目已有的图标文件(iconfont / IcoMoon / 已有 SVG),必要时可引入 SVG 文件作为独立资源
17
+
18
+ ## 样式
19
+
20
+ - 布局样式对齐原项目视觉效果,但**只参考原项目效果,不照搬其 CSS**
21
+ - 优先使用 **flex 弹性布局**,避免 `float`、复杂 `position`、冗余嵌套
22
+ - 避免不合理写法:`!important` 滥用、过深选择器、重复定义
23
+ - **组件中禁止使用内联样式**(`style={{ ... }}` / `style="..."`),样式统一放在 CSS Modules、Tailwind 类或样式文件中,便于维护
24
+
25
+ ## 强约束
26
+
27
+ - 业务功能与原项目完整等价,不得缺失
28
+ - 图片使用原项目资源,无内联 SVG;若原项目用 iconfont/IcoMoon 则继续使用
29
+ - 样式参考原项目效果但不照搬 CSS,优先 flex 布局,无内联样式
30
+ - 对公共 API、路由、事件、埋点、权限、缓存和错误状态建立行为清单,重构前后逐项核对
31
+
32
+ ## 死代码清理
33
+
34
+ 清理未使用代码、导出、样式或依赖时:
35
+
36
+ - 先建立验证基线,再做清理。
37
+ - 使用工具或搜索证据证明候选项无引用。
38
+ - 将候选项分为 SAFE、CAUTION、DANGER。
39
+ - 仅自动清理 SAFE 项;路由、配置、运行时模板、动态 import 和公开 API 默认视为高风险。
40
+ - 每批清理后运行受影响验证命令。
41
+ - 若验证失败,先回到最近一批候选项定位,不继续扩大清理范围。
42
+
43
+ 不要把死代码清理与功能重写、视觉调整或依赖升级混在同一个改动里。
@@ -0,0 +1,183 @@
1
+ # 渲染模式选型
2
+
3
+ 当项目需要选择渲染策略或评估 SSR / CSR / SSG / ISR 时,参考本文件。
4
+
5
+ ## 渲染模式概览
6
+
7
+ | 模式 | 全称 | 生成时机 | 适用框架 |
8
+ | ------- | ------------------------------- | ----------------------- | ------------------------ |
9
+ | **CSR** | Client-Side Rendering | 运行时(浏览器) | React SPA, Vue SPA, Vite |
10
+ | **SSR** | Server-Side Rendering | 请求时(服务端) | Next.js, Nuxt, Remix |
11
+ | **SSG** | Static Site Generation | 构建时 | Next.js, Astro, Hugo |
12
+ | **ISR** | Incremental Static Regeneration | 构建时 + 运行时按需更新 | Next.js, Nuxt |
13
+ | **RSC** | React Server Components | 请求时(服务端组件) | Next.js App Router |
14
+
15
+ ## 选型决策矩阵
16
+
17
+ ### 核心决策因素
18
+
19
+ | 因素 | 权重 | 推荐模式 |
20
+ | --------------------- | ---- | ---------------------------------- |
21
+ | **SEO 必须** | 高 | SSR / SSG / ISR |
22
+ | **首屏速度必须 < 1s** | 高 | SSG / ISR |
23
+ | **内容实时性** | 中 | SSR(实时)/ ISR(秒级延迟可接受) |
24
+ | **服务器成本敏感** | 中 | SSG / CSR(无需 Node 服务) |
25
+ | **交互复杂度** | 中 | CSR / RSC |
26
+ | **页面数量 > 10000** | 中 | SSR / ISR(SSG 构建时间过长) |
27
+ | **纯后台管理系统** | 低 | CSR |
28
+
29
+ ### 场景推荐
30
+
31
+ ```
32
+ 目标场景是什么?
33
+ ├── 营销官网 / 博客 / 文档站
34
+ │ ├── 内容更新频率低(天级)→ SSG
35
+ │ └── 内容更新频率高(小时级)→ ISR
36
+ │
37
+ ├── 电商 / 社交网络 / 新闻门户
38
+ │ ├── 商品页(SEO + 可缓存)→ SSR + CDN 缓存
39
+ │ ├── 搜索结果(实时)→ SSR
40
+ │ └── 分类页(变化慢)→ ISR
41
+ │
42
+ ├── SaaS Dashboard / 后台管理系统
43
+ │ ├── 登录后页面 → CSR
44
+ │ └── 登录/注册页(SEO)→ SSG
45
+ │
46
+ ├── 混合场景(公开页 + 私有页)
47
+ │ └── 混合模式:公开页 SSR/SSG,私有页 CSR
48
+ │
49
+ └── 内容密集型(博客 + 商品 + Dashboard)
50
+ └── RSC(Next.js App Router)
51
+ ```
52
+
53
+ ### 详细对比
54
+
55
+ | 维度 | CSR | SSR | SSG | ISR |
56
+ | -------------- | ------------------------ | --------------------- | --------------------- | ----------------------- |
57
+ | **SEO** | ❌ 搜索引擎看到空壳 HTML | ✅ 完整 HTML | ✅ 完整 HTML | ✅ 完整 HTML |
58
+ | **FCP** | ⚠️ 慢(需下载执行 JS) | ✅ 快(服务端已渲染) | ✅ 最快(纯静态文件) | ✅ 最快(同 SSG) |
59
+ | **TTI** | ⚠️ 慢(hydrate 后交互) | ⚠️ 中(hydrate 开销) | ✅ 快 | ✅ 快 |
60
+ | **内容实时性** | ✅ 实时 | ✅ 实时 | ❌ 构建时固定 | ⚠️ 可配置(秒/分钟级) |
61
+ | **服务器成本** | ✅ 无需 Node 服务 | ❌ 需 Node 服务 | ✅ 仅需 CDN | ⚠️ 需 Node 服务(按需) |
62
+ | **构建时间** | ✅ 快 | — | ⚠️ 页面多时慢 | ✅ 增量构建 |
63
+ | **缓存友好** | ⚠️ API 级缓存 | ⚠️ 页面级缓存 | ✅ CDN 全量缓存 | ✅ CDN + 按需失效 |
64
+ | **复杂度** | ✅ 低 | ⚠️ 中 | ✅ 低 | ⚠️ 中 |
65
+
66
+ ## 各模式实施要点
67
+
68
+ ### CSR(客户端渲染)
69
+
70
+ 适用:后台管理系统、内部工具、登录后页面。
71
+
72
+ ```tsx
73
+ // 纯 SPA 入口
74
+ import { createRoot } from "react-dom/client";
75
+ import { App } from "./App";
76
+
77
+ createRoot(document.getElementById("root")!).render(<App />);
78
+ ```
79
+
80
+ **SEO 补救**:对需要 SEO 的页面使用动态 import 加载预渲染版本,或使用 Prerender SPA Plugin。
81
+
82
+ ### SSR(服务端渲染)
83
+
84
+ 适用:电商、新闻、社交等 SEO 关键场景。
85
+
86
+ ```tsx
87
+ // Next.js Pages Router
88
+ export async function getServerSideProps() {
89
+ const data = await fetchProductData();
90
+ return { props: { data } };
91
+ }
92
+
93
+ // Next.js App Router (RSC)
94
+ async function ProductPage() {
95
+ const data = await fetchProductData(); // 服务端直接 await
96
+ return <ProductLayout data={data} />;
97
+ }
98
+ ```
99
+
100
+ **注意**:
101
+
102
+ - SSR 页面必须考虑服务端兼容性(无 window/document)
103
+ - Hydration 不匹配会导致客户端重新渲染(SSR 水合失败)
104
+ - 服务端数据获取必须有超时和错误降级
105
+
106
+ ### SSG(静态站点生成)
107
+
108
+ 适用:博客、文档、营销落地页。
109
+
110
+ ```tsx
111
+ // Next.js 构建时生成
112
+ export async function getStaticProps() {
113
+ const posts = await fetchPosts();
114
+ return { props: { posts } };
115
+ }
116
+
117
+ export async function getStaticPaths() {
118
+ const posts = await fetchPosts();
119
+ return {
120
+ paths: posts.map((p) => `/blog/${p.slug}`),
121
+ fallback: false, // 未预渲染的 404
122
+ };
123
+ }
124
+ ```
125
+
126
+ ### ISR(增量静态再生)
127
+
128
+ 适用:页面数量多、内容更新频繁但非实时。
129
+
130
+ ```tsx
131
+ export async function getStaticProps() {
132
+ const product = await fetchProduct();
133
+ return {
134
+ props: { product },
135
+ revalidate: 60, // 60 秒内返回缓存版本,后台异步更新
136
+ };
137
+ }
138
+ ```
139
+
140
+ ## React Server Components(RSC)
141
+
142
+ Next.js App Router 的默认模式,服务端组件不发送 JS 到客户端:
143
+
144
+ ```tsx
145
+ // 服务端组件(默认)— 可直接 await 数据库查询
146
+ async function ProductList() {
147
+ const products = await db.products.findMany();
148
+ return (
149
+ <div>
150
+ {products.map((p) => (
151
+ <ProductCard key={p.id} product={p} />
152
+ ))}
153
+ </div>
154
+ );
155
+ }
156
+
157
+ // 客户端组件 — 需要交互/状态时显式标记
158
+ ("use client");
159
+
160
+ function AddToCartButton({ productId }: { productId: string }) {
161
+ const [loading, setLoading] = useState(false);
162
+ return (
163
+ <button onClick={() => addToCart(productId)}>
164
+ {loading ? "..." : "加入购物车"}
165
+ </button>
166
+ );
167
+ }
168
+ ```
169
+
170
+ **RSC 优势**:
171
+
172
+ - 服务端组件的 JS 不发送到客户端,减小 bundle
173
+ - 直接 await 数据库/API 调用,无需 useEffect + loading 状态
174
+ - 服务端组件可嵌套客户端组件,按需选择
175
+
176
+ ## 检查清单
177
+
178
+ - [ ] 明确哪些页面需要 SEO(公开页 vs 私有页)
179
+ - [ ] 明确哪些页面需要实时数据(SSR),哪些可接受延迟(ISR/SSG)
180
+ - [ ] 评估页面数量(> 10000 时 SSG 构建时间可能不可接受)
181
+ - [ ] 评估服务器成本(SSR 需 Node 服务,SSG 仅需 CDN)
182
+ - [ ] 确认 Hydration 一致性(SSR 页面首屏 HTML 与客户端渲染匹配)
183
+ - [ ] 为 SSR 页面设置合理的缓存策略(CDN 缓存 + revalidate)