|
| 1 | +--- |
| 2 | +name: code-review-refactor |
| 3 | +description: 对现有 Nuxt 4 + Vue3 + Vuetify3 代码进行 Code Review,并给出“可落地”的重构/复用方案(逻辑抽取、CSS 去重、页面 JSON 驱动复用)。 |
| 4 | +--- |
| 5 | + |
| 6 | +# Code Review & Refactor 规范 Skill |
| 7 | + |
| 8 | +当用户提出“代码很乱 / 需要 Code Review / 重构不够规范 / 提取可复用逻辑 / CSS 太多 / 页面重复应该 JSON 驱动”等诉求时,使用本 Skill。 |
| 9 | + |
| 10 | +## 0. 使用范围(When to Use) |
| 11 | +- 用户明确说要 Code Review |
| 12 | +- 或用户反馈:组件/页面冗长、CSS 重复、相似页面太多、缺少抽取到 `utils/composables/services`、缺少可复用结构 |
| 13 | +- 或发现你在修改时重复造轮子(应优先提取/复用) |
| 14 | + |
| 15 | +## 1. 重构总原则(必须遵守) |
| 16 | +1. **行为优先(Behavior First)**:重构仅做结构优化,不改变既有功能、接口与用户交互语义。 |
| 17 | +2. **小步可验证**:每次改动都应能局部验证;先提取再替换,避免“一次大改导致难排查”。 |
| 18 | +3. **优先抽取可复用逻辑**: |
| 19 | + - 纯函数与可复用算法:`app/utils/` |
| 20 | + - 与组件生命周期/状态联动的逻辑:`app/composables/` |
| 21 | + - API 请求/数据转换:`app/services/` |
| 22 | +4. **优先组件化重复 UI**: |
| 23 | + - 动作按钮组、筛选条、分页条、表格工具栏等重复结构 -> 公共组件 |
| 24 | + - 相似页面 -> 用“配置/JSON + 事件绑定”做驱动,而不是拷贝复制页面 |
| 25 | +5. **CSS 去重**: |
| 26 | + - 多处重复的 CSS -> 提取为组件内共用 class,或提取公共样式(同风格、同作用域规则) |
| 27 | + - 只为“一个小变量”复制 CSS 的 -> 合并成同一个 class + 参数化/状态类 |
| 28 | + |
| 29 | +## 2. Code Review 检查清单(Checklists) |
| 30 | + |
| 31 | +### 2.1 逻辑抽取(Logic Extraction) |
| 32 | +在 review 时,逐段检查是否存在以下情况: |
| 33 | +1. 一个组件里出现多次相同的处理逻辑(如 parse/safeParse/格式化/渲染拼装)。 |
| 34 | +2. 多个页面存在相同的业务流程(如同一类 SSE 流式组装、同一类 markdown/eCharts 渲染触发)。 |
| 35 | +3. 与页面无关的纯逻辑没有被移到 `utils` 或 `composables`。 |
| 36 | + |
| 37 | +输出要求: |
| 38 | +- 指出“重复点”与“提取位置建议”(utils/composables/services 哪个更合适) |
| 39 | +- 给出新的接口/函数签名建议(至少用参数名与返回类型描述) |
| 40 | + |
| 41 | +### 2.2 组件拆分(Componentization) |
| 42 | +- 组件文件是否超过合理规模(建议阈值:500 行内易维护,复杂组件建议拆子组件) |
| 43 | +- 是否存在“混杂多职责”(例如:渲染 + 请求 + 状态 + 事件处理全部写在一个组件) |
| 44 | + |
| 45 | +输出要求: |
| 46 | +- 提出“拆分方案”:哪些子组件/哪些 composables |
| 47 | +- 标明拆分后组件仍保持同样的 Props/事件语义 |
| 48 | + |
| 49 | +### 2.3 CSS 去重(CSS De-duplication) |
| 50 | +检查: |
| 51 | +1. 不同组件/页面有大量相同 CSS(尤其是 `markdown-body`、code block、card spacing、按钮样式等)。 |
| 52 | +2. 相同选择器重复定义或只差少量颜色/间距。 |
| 53 | + |
| 54 | +输出要求: |
| 55 | +- 优先给出“提取成一个 class”方案 |
| 56 | +- 或建议做“公共样式组件/公共 wrapper 组件”(如果是 UI 结构层面的重复) |
| 57 | + |
| 58 | +### 2.4 JSON 驱动的页面复用(Config-Driven Pages) |
| 59 | +当你发现多个管理页面“按钮数量不同、内容通过 JSON 稍有差异”,建议使用 JSON 驱动: |
| 60 | +- 页面结构拆为通用骨架: |
| 61 | + - 顶部标题区 |
| 62 | + - 操作按钮组(来自配置) |
| 63 | + - 表格/列表区(列定义来自配置) |
| 64 | + - 弹窗/抽屉(表单字段来自配置) |
| 65 | +- 事件由页面注入(例如:`onAction(actionKey, payload)` 或通过映射表) |
| 66 | + |
| 67 | +输出要求: |
| 68 | +- 提出一个“最小通用配置 schema”(字段列表 + 示例) |
| 69 | +- 指出每个页面需要补充的差异化配置项 |
| 70 | + |
| 71 | +### 2.5 TypeScript 与安全护栏 |
| 72 | +检查是否存在: |
| 73 | +- `arr[i]` 取值后未做 TS 收窄导致 `T | undefined` 警告 |
| 74 | +- SSE/流式数据拼接在 TS 层面不安全 |
| 75 | + |
| 76 | +输出要求: |
| 77 | +- 给出 TS 收窄的推荐写法(局部变量 + if 守卫 / type guard) |
| 78 | + |
| 79 | +## 3. 推荐的输出格式(必须用) |
| 80 | +当用户说开始 Code Review 时,你的回答应使用以下结构(按序): |
| 81 | + |
| 82 | +1. `## 最关键问题(按严重度从高到低)` |
| 83 | + - 每条用一句话概括 + 标明影响范围(渲染/性能/可维护性/正确性) |
| 84 | +2. `## 重构/复用建议(可落地)` |
| 85 | + - 对每条建议写:提取目标(utils/composables/services/组件/CSS)、原因、预计收益 |
| 86 | +3. `## JSON 驱动复用方案(如果存在重复页面)` |
| 87 | + - 给出配置 schema(字段列表)+ 示例(可以是伪 JSON) |
| 88 | +4. `## 验证与回归(Test Plan)` |
| 89 | + - 给出最少的手动验证清单(UI 是否一致、功能是否不变、关键交互是否回归) |
| 90 | + |
| 91 | +## 4. 允许与禁止 |
| 92 | +允许: |
| 93 | +- 提取公共逻辑、拆子组件、创建新 util/composable/services |
| 94 | +- CSS 合并、抽取公共 class、增加必要 wrapper 组件 |
| 95 | +禁止: |
| 96 | +- 仅为“看起来更漂亮”而改变现有交互语义或数据结构 |
| 97 | +- 大而全的重写(除非用户明确要求并且能接受高风险) |
| 98 | + |
0 commit comments