@bovinphang/frontend-craft 2.5.0 → 2.7.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.
- package/.claude-plugin/marketplace.json +7 -3
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +77 -1
- package/CHANGELOG.zh-CN.md +77 -1
- package/CONTRIBUTING.md +15 -10
- package/CONTRIBUTING.zh-CN.md +15 -10
- package/README.md +69 -43
- package/README.openclaw.md +11 -9
- package/README.openclaw.zh-CN.md +11 -9
- package/README.zh-CN.md +69 -43
- package/agents/fec-typescript-reviewer.md +1 -1
- package/commands/fec-doc-sync.md +7 -6
- package/dist/bin/frontend-craft.js +30 -27
- package/docs/example-prompts.md +82 -69
- package/docs/ja-JP/README.md +110 -84
- package/docs/ko-KR/README.md +100 -74
- package/docs/project-structure.md +8 -4
- package/docs/runtimes/antigravity.md +1 -1
- package/docs/runtimes/augment.md +1 -1
- package/docs/runtimes/claude.md +16 -10
- package/docs/runtimes/claude.zh-CN.md +16 -10
- package/docs/runtimes/cline.md +1 -1
- package/docs/runtimes/codebuddy.md +1 -1
- package/docs/runtimes/codex.md +1 -1
- package/docs/runtimes/copilot.md +1 -1
- package/docs/runtimes/cursor.md +1 -1
- package/docs/runtimes/gemini.md +1 -1
- package/docs/runtimes/kilo.md +1 -1
- package/docs/runtimes/openclaw.md +1 -1
- package/docs/runtimes/opencode.md +1 -1
- package/docs/runtimes/qoder.md +1 -1
- package/docs/runtimes/trae.md +1 -1
- package/docs/runtimes/windsurf.md +1 -1
- package/docs/zh-CN/example-prompts.md +82 -69
- package/docs/zh-CN/project-structure.md +8 -4
- package/docs/zh-TW/README.md +88 -62
- package/openclaw.plugin.json +1 -1
- package/package.json +3 -3
- package/skills/eval_queries.json +179 -56
- package/skills/fec-accessibility-check/SKILL.md +1 -1
- package/skills/fec-alchemy/SKILL.md +74 -0
- package/skills/fec-alchemy/assets/absorption-plan-template.md +47 -0
- package/skills/fec-alchemy/assets/intake-template.md +55 -0
- package/skills/fec-alchemy/assets/review-checklist.md +31 -0
- package/skills/fec-alchemy/references/methodology.md +94 -0
- package/skills/fec-alchemy/references/originality-and-licensing.md +57 -0
- package/skills/fec-backend-requirements-handoff/SKILL.md +45 -0
- package/skills/fec-browser-storage/SKILL.md +1 -1
- package/skills/fec-canvas-threejs/SKILL.md +1 -1
- package/skills/fec-code-review/SKILL.md +11 -3
- package/skills/fec-data-fetching/SKILL.md +15 -15
- package/skills/fec-data-fetching/references/query-patterns.md +27 -1
- package/skills/fec-debug-framework/SKILL.md +14 -19
- package/skills/fec-debug-framework/references/report-template.md +58 -0
- package/skills/fec-doc-sync/SKILL.md +19 -17
- package/skills/fec-drawio-studio/SKILL.md +69 -0
- package/skills/fec-drawio-studio/data/THIRD_PARTY_NOTICES.md +10 -0
- package/skills/fec-drawio-studio/data/brand-icons.json +878 -0
- package/skills/fec-drawio-studio/data/shape-index.json.gz +0 -0
- package/skills/fec-drawio-studio/references/data-residency.md +27 -0
- package/skills/fec-drawio-studio/references/diagram-patterns.md +41 -0
- package/skills/fec-drawio-studio/references/layout-and-export.md +57 -0
- package/skills/fec-drawio-studio/references/troubleshooting.md +29 -0
- package/skills/fec-drawio-studio/references/xml-and-mermaid.md +54 -0
- package/skills/fec-drawio-studio/scripts/brand-symbols.mjs +99 -0
- package/skills/fec-drawio-studio/scripts/diagram-lint.mjs +143 -0
- package/skills/fec-drawio-studio/scripts/diagram-url.mjs +102 -0
- package/skills/fec-drawio-studio/scripts/layout-graph.mjs +107 -0
- package/skills/fec-drawio-studio/scripts/png-embed-fix.mjs +26 -0
- package/skills/fec-drawio-studio/scripts/scan-go-packages.mjs +36 -0
- package/skills/fec-drawio-studio/scripts/scan-js-modules.mjs +52 -0
- package/skills/fec-drawio-studio/scripts/scan-python-classes.mjs +30 -0
- package/skills/fec-drawio-studio/scripts/scan-python-modules.mjs +55 -0
- package/skills/fec-drawio-studio/scripts/scan-rust-modules.mjs +35 -0
- package/skills/fec-drawio-studio/scripts/scan-ts-modules.mjs +7 -0
- package/skills/fec-drawio-studio/scripts/shape-query.mjs +81 -0
- package/skills/fec-drawio-studio/scripts/studio-core.mjs +139 -0
- package/skills/fec-drawio-studio/styles/built-in/corporate.json +49 -0
- package/skills/fec-drawio-studio/styles/built-in/default.json +49 -0
- package/skills/fec-drawio-studio/styles/built-in/handdrawn.json +49 -0
- package/skills/fec-drawio-studio/styles/schema.json +112 -0
- package/skills/fec-e2e-testing/SKILL.md +5 -3
- package/skills/fec-e2e-testing/references/e2e-ci-reporting.md +62 -0
- package/skills/fec-e2e-testing/references/e2e-special-scenarios.md +52 -0
- package/skills/fec-e2e-testing/references/e2e-visual-regression.md +60 -0
- package/skills/fec-form-handling/SKILL.md +11 -11
- package/skills/fec-form-handling/references/advanced-form-patterns.md +34 -5
- package/skills/fec-image-generation/SKILL.md +56 -0
- package/skills/fec-image-generation/references/artifact-routing.md +80 -0
- package/skills/fec-image-generation/references/diagram-workflows.md +43 -0
- package/skills/fec-image-generation/references/png-qa-autofix.md +30 -0
- package/skills/fec-image-generation/scripts/png-qa.mjs +431 -0
- package/skills/fec-implement-from-design/SKILL.md +9 -2
- package/skills/fec-legacy-to-modern-migration/SKILL.md +29 -163
- package/skills/fec-legacy-to-modern-migration/references/migration-execution-checklist.md +110 -0
- package/skills/fec-legacy-to-modern-migration/references/migration-strategy-and-mapping.md +48 -0
- package/skills/fec-legacy-web-standard/SKILL.md +1 -1
- package/skills/fec-list-virtualization/SKILL.md +3 -3
- package/skills/fec-list-virtualization/references/virtualization-patterns.md +32 -4
- package/skills/fec-motion-interaction/SKILL.md +7 -0
- package/skills/fec-nextjs-project-standard/SKILL.md +7 -1
- package/skills/fec-performance-optimization/SKILL.md +9 -1
- package/skills/fec-performance-optimization/references/framework-performance-patterns.md +38 -0
- package/skills/fec-performance-optimization/references/report-template.md +59 -0
- package/skills/fec-pwa-implementation/SKILL.md +3 -4
- package/skills/fec-react-project-standard/SKILL.md +12 -4
- package/skills/fec-react-project-standard/references/react-performance-patterns.md +35 -0
- package/skills/fec-react-project-standard/references/react-project-structure.md +197 -0
- package/skills/fec-react-project-standard/references/react-quality-patterns.md +131 -0
- package/skills/fec-react-project-standard/references/react-runtime-patterns.md +293 -0
- package/skills/fec-refactor-clean/SKILL.md +4 -1
- package/skills/fec-refactor-clean/references/report-template.md +42 -0
- package/skills/fec-responsive-layout/references/responsive-layout-patterns.md +11 -0
- package/skills/fec-security-review/SKILL.md +3 -3
- package/skills/fec-source-driven-development/SKILL.md +26 -0
- package/skills/fec-state-management/SKILL.md +1 -1
- package/skills/fec-storybook-component-doc/SKILL.md +2 -2
- package/skills/fec-tailwind-design-system/references/tailwind-system-patterns.md +5 -1
- package/skills/fec-typescript-project-standard/SKILL.md +54 -0
- package/skills/{fec-typescript-type-safety → fec-typescript-project-standard}/references/type-safety-patterns.md +1 -1
- package/skills/{fec-typescript-type-safety/SKILL.md → fec-typescript-project-standard/references/type-safety.md} +1 -10
- package/skills/fec-ui-design/SKILL.md +26 -8
- package/skills/fec-ui-design/data/style-archetypes.json +40 -0
- package/skills/fec-ui-design/data/ux-quality-rules.json +35 -0
- package/skills/fec-ui-design/references/design-intelligence.md +66 -6
- package/skills/fec-ui-design/references/pre-delivery-checklist.md +6 -0
- package/skills/fec-ui-design/scripts/design-system.mjs +119 -1
- package/skills/fec-validation-fix/SKILL.md +5 -2
- package/skills/fec-validation-fix/references/report-template.md +43 -0
- package/skills/fec-vue3-project-standard/SKILL.md +12 -3
- package/skills/fec-vue3-project-standard/references/vue3-composables-routing.md +163 -0
- package/skills/fec-vue3-project-standard/references/vue3-performance-patterns.md +13 -0
- package/skills/fec-vue3-project-standard/references/vue3-project-structure.md +177 -0
- package/skills/fec-vue3-project-standard/references/vue3-state-api-quality.md +216 -0
- package/skills/fec-web-video-presentation/SKILL.md +61 -0
- package/skills/fec-web-video-presentation/data/starter-themes.json +59 -0
- package/skills/fec-web-video-presentation/references/chapter-craft.md +37 -0
- package/skills/fec-web-video-presentation/references/content-plan.md +38 -0
- package/skills/fec-web-video-presentation/references/recording-and-audio.md +33 -0
- package/skills/fec-web-video-presentation/references/theme-system.md +36 -0
- package/skills/fec-web-video-presentation/scripts/create-video-presentation.mjs +430 -0
- package/skills/fec-web-workers/SKILL.md +3 -4
- package/skills/metadata.json +381 -168
- package/skills/relations.json +136 -25
- package/templates/shared/rules/fec-ci-cd.md +20 -108
- package/templates/shared/rules/fec-design-system.md +47 -223
- package/templates/shared/rules/fec-error-handling.md +35 -179
- package/templates/shared/rules/fec-i18n.md +43 -91
- package/templates/shared/rules/fec-refactoring.md +4 -0
- package/templates/shared/rules/fec-rendering-patterns.md +28 -171
- package/templates/shared/rules/fec-responsive-design.md +34 -211
- package/templates/shared/rules/fec-state-management.md +41 -144
- package/templates/shared/rules/fec-typescript.md +47 -290
- package/skills/fec-e2e-testing/references/e2e-advanced.md +0 -176
- package/skills/fec-react-project-standard/references/react-project-details.md +0 -642
- package/skills/fec-vue3-project-standard/references/vue3-project-details.md +0 -547
|
@@ -1,180 +1,46 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fec-legacy-to-modern-migration
|
|
3
|
-
description: Use when planning or implementing an intentional migration from JavaScript, jQuery, HTML/CSS, server-rendered templates,
|
|
3
|
+
description: Use when planning or implementing an intentional migration from JavaScript, jQuery, HTML/CSS, server-rendered templates, MPA legacy frontend code, or older framework code toward a modern frontend stack while preserving behavior. Do not use for routine legacy bug fixes that stay in the old stack; Chinese triggers include 遗留项目, 技术栈升级, jQuery 迁移.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 传统前端到现代框架迁移
|
|
7
7
|
|
|
8
|
-
适用于将 JavaScript + jQuery + HTML/CSS 多页面应用(MPA
|
|
8
|
+
适用于将 JavaScript + jQuery + HTML/CSS 多页面应用(MPA)、服务端模板渲染项目或旧框架代码,渐进迁移到 React、Vue、Next.js、Nuxt、TypeScript,或保留 MPA 形态但现代化模块、构建、类型和测试的场景。
|
|
9
9
|
|
|
10
10
|
## Purpose
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
指导传统前端项目渐进迁移到目标现代栈,提供迁移策略、概念映射、分阶段步骤和实施约束,确保功能等价和风险可控。
|
|
13
13
|
|
|
14
|
-
##
|
|
14
|
+
## Procedure
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
## 概念映射
|
|
24
|
-
|
|
25
|
-
### jQuery → React
|
|
26
|
-
|
|
27
|
-
| 遗留模式 | React 对应 |
|
|
28
|
-
| ------------------------------------------ | -------------------------------------- |
|
|
29
|
-
| `$(selector).html(content)` | 声明式 JSX + state 驱动渲染 |
|
|
30
|
-
| `$(document).on('click', '.btn', handler)` | `onClick` + 事件委托由 React 处理 |
|
|
31
|
-
| `$.ajax()` / `$.get()` | `fetch` / `axios` + React Query 或 SWR |
|
|
32
|
-
| 全局变量 / 命名空间存储状态 | `useState` / `useContext` / Zustand |
|
|
33
|
-
| `$(el).show()` / `$(el).hide()` | 条件渲染 `{visible && <Component />}` |
|
|
34
|
-
| 手动 DOM 操作 `append` / `remove` | 数据驱动,通过 setState 触发重渲染 |
|
|
35
|
-
| 模板字符串拼接 HTML | JSX 组件 + props |
|
|
36
|
-
| 多页面 + 服务端路由 | React Router 客户端路由 |
|
|
37
|
-
|
|
38
|
-
### jQuery → Vue 3
|
|
39
|
-
|
|
40
|
-
| 遗留模式 | Vue 3 对应 |
|
|
41
|
-
| ------------------------------------------ | -------------------------------------------------- |
|
|
42
|
-
| `$(selector).html(content)` | 模板 + `ref` / `reactive` 驱动渲染 |
|
|
43
|
-
| `$(document).on('click', '.btn', handler)` | `@click` + 事件修饰符 |
|
|
44
|
-
| `$.ajax()` / `$.get()` | `fetch` / `axios` + VueUse `useFetch` 或 Vue Query |
|
|
45
|
-
| 全局变量 / 命名空间存储状态 | `ref` / `reactive` / Pinia |
|
|
46
|
-
| `$(el).show()` / `$(el).hide()` | `v-show` / `v-if` |
|
|
47
|
-
| 手动 DOM 操作 | 数据驱动,通过响应式更新视图 |
|
|
48
|
-
| 模板字符串拼接 HTML | 单文件组件 `<template>` + props |
|
|
49
|
-
| 多页面 + 服务端路由 | Vue Router 客户端路由 |
|
|
50
|
-
|
|
51
|
-
### 通用映射
|
|
52
|
-
|
|
53
|
-
| 遗留概念 | 现代对应 |
|
|
54
|
-
| --------------------------------- | ------------------------------------------ |
|
|
55
|
-
| 页面级 JS 入口(每页一个 script) | 路由 + 懒加载页面组件 |
|
|
56
|
-
| 公共 JS 模块(utils、ajax 封装) | `services/`、`utils/`、类型化 API 层 |
|
|
57
|
-
| 内联样式 / 页面级 CSS | CSS Modules / Tailwind / styled-components |
|
|
58
|
-
| 服务端模板变量 | 通过 API 获取 + 前端状态管理 |
|
|
59
|
-
| 表单提交 + 整页刷新 | 表单库 + 客户端校验 + API 调用 |
|
|
60
|
-
|
|
61
|
-
## 迁移前分析
|
|
62
|
-
|
|
63
|
-
在动手迁移前,必须完成以下分析并输出**迁移分析报告**:
|
|
64
|
-
|
|
65
|
-
1. **存量盘点**
|
|
66
|
-
- 页面数量、功能模块数量
|
|
67
|
-
- 依赖的 jQuery 插件及替代方案(如 DataTables → TanStack Table)
|
|
68
|
-
- 现有 API 调用方式、是否有统一封装
|
|
69
|
-
- 是否有服务端模板(JSP/Thymeleaf/EJS 等)需改为纯前端渲染
|
|
70
|
-
|
|
71
|
-
2. **依赖关系**
|
|
72
|
-
- 页面间共享的 JS/CSS 模块
|
|
73
|
-
- 跨页面复用的业务逻辑
|
|
74
|
-
- 与后端的接口契约(是否需调整)
|
|
75
|
-
|
|
76
|
-
3. **迁移优先级**
|
|
77
|
-
- 按业务价值、复杂度、耦合度排序
|
|
78
|
-
- 优先迁移独立模块、低耦合页面
|
|
79
|
-
- 识别可复用的工具函数、常量、类型定义
|
|
80
|
-
|
|
81
|
-
## 分阶段迁移流程
|
|
82
|
-
|
|
83
|
-
### 阶段 0:准备
|
|
84
|
-
|
|
85
|
-
- 搭建新项目脚手架(Vite + React/Vue + TypeScript)
|
|
86
|
-
- 配置 ESLint、Prettier、测试框架
|
|
87
|
-
- 建立 `services/request.ts` 统一请求层,与现有 API 兼容
|
|
88
|
-
- 将遗留项目中的 `utils`、`constants` 逐步迁移并补充类型
|
|
89
|
-
|
|
90
|
-
### 阶段 1:基础层
|
|
91
|
-
|
|
92
|
-
- 迁移并类型化 API 调用(`$.ajax` → `axios`/`fetch`)
|
|
93
|
-
- 迁移工具函数(日期、格式化、校验等)
|
|
94
|
-
- 迁移常量、枚举、类型定义
|
|
95
|
-
- 建立路由骨架,占位未迁移页面(重定向或 iframe 嵌入旧页面)
|
|
96
|
-
|
|
97
|
-
### 阶段 2:按模块/页面迁移
|
|
98
|
-
|
|
99
|
-
- 每次迁移一个完整功能或页面
|
|
100
|
-
- 从简单到复杂:静态页 → 列表页 → 表单页 → 复杂交互页
|
|
101
|
-
- 迁移时提取可复用组件,遵循目标 React 或 Vue 项目的目录结构
|
|
102
|
-
- 每完成一个模块,补充单元测试和 E2E 关键路径
|
|
103
|
-
|
|
104
|
-
### 阶段 3:收尾
|
|
105
|
-
|
|
106
|
-
- 移除旧代码入口,全面切换至 SPA
|
|
107
|
-
- 配置 404、错误边界、全局错误处理
|
|
108
|
-
- 性能优化(懒加载、代码分割、缓存策略)
|
|
109
|
-
- 文档更新、部署流程调整
|
|
110
|
-
|
|
111
|
-
## 重构实施要求
|
|
112
|
-
|
|
113
|
-
迁移时需遵循以下实施约束,确保视觉与交互一致、代码更简洁易维护。
|
|
114
|
-
|
|
115
|
-
### 图片与图标
|
|
116
|
-
|
|
117
|
-
- 直接使用原项目的图片资源路径,不重新托管或替换
|
|
118
|
-
- 可使用 SVG 图片(`<img src="*.svg" />` 或 CSS `background-image`),**禁止使用内联 SVG**(`<svg>...</svg>` 直接写在组件中)
|
|
119
|
-
- **若原项目使用了 iconfont 或 IcoMoon 图标,重构时继续使用**,保持图标体系一致;不替换为其他图标方案(如独立 SVG、其他图标库)
|
|
120
|
-
- 图标优先使用原项目已有的图标文件(iconfont / IcoMoon / 已有 SVG),必要时可引入 SVG 文件作为独立资源
|
|
121
|
-
|
|
122
|
-
### 国际化(i18n)
|
|
123
|
-
|
|
124
|
-
- 新栈代码(React / Vue 等)中的用户可见文案须走项目 i18n,不在新代码里硬编码中/英文案
|
|
125
|
-
- 遗留 HTML/JS 中**不要新增**用户可见硬编码文案,除非纯静态且仓库尚无可用 i18n 接入点;改动文案前先查 locales 是否已有条目,并同步主要语言文件
|
|
126
|
-
- key 按页面/模块/语义组织,复用既有 key;仅当旧 key 为对外契约时才做映射过渡,详见项目规则中的 **国际化 (i18n)**(`templates/shared/rules/fec-i18n.md` 内「遗留代码与迁移场景」)
|
|
127
|
-
|
|
128
|
-
### 样式
|
|
129
|
-
|
|
130
|
-
- 布局样式对齐原项目视觉效果,但**只参考原项目效果,不照搬其 CSS**
|
|
131
|
-
- 优先使用 **flex 弹性布局**,避免 `float`、复杂 `position`、冗余嵌套
|
|
132
|
-
- 避免不合理写法:如 `!important` 滥用、过深选择器、重复定义
|
|
133
|
-
- **组件中禁止使用内联样式**(`style={{ ... }}` / `style="..."`),样式统一放在 CSS Modules、Tailwind 类或样式文件中,便于维护
|
|
134
|
-
|
|
135
|
-
### 目标
|
|
136
|
-
|
|
137
|
-
- **视觉和交互**:与原项目一致,用户无感知差异
|
|
138
|
-
- **代码质量**:更简洁、易维护,符合目标框架规范
|
|
139
|
-
- **业务功能**:与原项目保持一致,**不得缺失功能**;迁移前后行为等价
|
|
140
|
-
|
|
141
|
-
## 迁移检查清单
|
|
142
|
-
|
|
143
|
-
每个迁移单元完成后,确认:
|
|
144
|
-
|
|
145
|
-
- [ ] 业务逻辑与旧实现一致,无功能遗漏,功能完整等价
|
|
146
|
-
- [ ] 类型定义完整,无 `any` 滥用
|
|
147
|
-
- [ ] API 调用使用统一 request 层,错误处理完整
|
|
148
|
-
- [ ] 表单校验、loading、空状态、错误状态已实现
|
|
149
|
-
- [ ] 可访问性:表单有 label、交互可键盘操作
|
|
150
|
-
- [ ] 无 XSS 风险(用户输入已转义或使用安全 API)
|
|
151
|
-
- [ ] 关键路径有测试覆盖
|
|
152
|
-
- [ ] 符合目标框架的项目规范(参考目标 React / Vue 项目约定)
|
|
153
|
-
- [ ] 图片使用原项目资源,无内联 SVG;若原项目用 iconfont/IcoMoon 则继续使用
|
|
154
|
-
- [ ] 样式参考原项目效果但不照搬 CSS,优先 flex 布局,无内联样式
|
|
155
|
-
- [ ] 视觉与交互与原项目一致,代码更简洁易维护
|
|
156
|
-
- [ ] 新代码路径文案已 i18n;遗留层未扩大硬编码;locales 检索与多语言同步已完成(参见 i18n 规则迁移补充清单)
|
|
16
|
+
1. 先识别目标栈、迁移边界和是否保留 MPA/服务端模板形态。
|
|
17
|
+
2. 加载 [references/migration-strategy-and-mapping.md](references/migration-strategy-and-mapping.md),选择渐进式或一次性重写策略,并明确遗留模式到目标栈的映射。
|
|
18
|
+
3. 加载 [references/migration-execution-checklist.md](references/migration-execution-checklist.md),完成存量盘点、依赖分析、优先级排序和分阶段迁移计划。
|
|
19
|
+
4. 撰写迁移分析或迁移计划报告时,加载 [references/migration-report-template.md](references/migration-report-template.md)。
|
|
20
|
+
5. 按准备、基础层、模块/页面迁移、收尾的顺序推进,每次迁移一个可验证单元。
|
|
21
|
+
6. 每个迁移单元验证功能等价、视觉一致、类型安全、可访问性、i18n、资源和样式边界。
|
|
157
22
|
|
|
158
23
|
## Constraints
|
|
159
24
|
|
|
160
|
-
-
|
|
161
|
-
- 不要在一次迁移中同时改架构、改 UI
|
|
162
|
-
-
|
|
163
|
-
-
|
|
164
|
-
- 遇到 jQuery 插件无现成替代时,可暂时用 iframe
|
|
165
|
-
-
|
|
166
|
-
-
|
|
167
|
-
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
25
|
+
- 迁移前必须先输出迁移分析报告,明确策略、优先级和风险。
|
|
26
|
+
- 不要在一次迁移中同时改架构、改 UI、改接口。
|
|
27
|
+
- 优先保证功能等价,再考虑优化和现代化。
|
|
28
|
+
- 迁移过程中保持旧系统可运行,避免大爆炸式上线。
|
|
29
|
+
- 遇到 jQuery 插件无现成替代时,可暂时用 iframe 或微前端方式嵌入,待后续替换。
|
|
30
|
+
- 目标栈先识别 React/Vue/Next/Nuxt、现代 MPA 或局部现代化目标,不默认强制改成 SPA。
|
|
31
|
+
- 图片使用原项目资源;图标体系优先沿用原项目或目标项目规范;内联 SVG 例外需有可访问性、组件化或维护理由。
|
|
32
|
+
- 样式参考原项目效果但不照搬 CSS,优先使用目标项目样式体系;内联样式例外需局部、可解释。
|
|
33
|
+
- 目标是视觉与交互一致、代码更简洁易维护,业务功能不得缺失。
|
|
34
|
+
- 涉及页面、组件、路由、表单、弹窗、导航或关键用户流程的迁移,必须建立重构前后的行为清单,并使用 Playwright 或同等真实浏览器验证方式对关键路径做对比验证。
|
|
35
|
+
- 对视觉敏感页面,应补充截图对比或人工截图验收;动态内容、动画、字体和环境差异需明确屏蔽、稳定化或说明。
|
|
36
|
+
- 对纯逻辑、类型、构建或无 UI 的迁移,不强制 Playwright,应选择更贴近风险的验证层:type-check、unit test、component test、build 或 lint。
|
|
37
|
+
- 验证目标不是像素级完全一致,而是确认业务功能无缺失、关键交互等价、主要视觉布局无非预期偏差,并且代码比旧实现更清晰、可维护。
|
|
172
38
|
|
|
173
39
|
## Expected Output
|
|
174
40
|
|
|
175
|
-
- 迁移分析报告保存为 `reports/migration-plan-YYYY-MM-DD-HHmmss.md
|
|
176
|
-
-
|
|
177
|
-
-
|
|
178
|
-
- 类型定义完整,无 `any` 滥用,API
|
|
179
|
-
-
|
|
180
|
-
- 新代码文案已 i18n
|
|
41
|
+
- 迁移分析报告保存为 `reports/migration-plan-YYYY-MM-DD-HHmmss.md`,包含策略选择、存量盘点、依赖关系、分阶段步骤、风险与回滚方案。
|
|
42
|
+
- 迁移后的业务功能与原项目完全等价,无功能缺失。
|
|
43
|
+
- 视觉与交互与原项目一致,用户无感知差异。
|
|
44
|
+
- 类型定义完整,无 `any` 滥用,API 调用统一且类型安全。
|
|
45
|
+
- 图片使用原项目资源,样式进入目标项目样式体系,图标和内联样式例外有明确理由。
|
|
46
|
+
- 新代码文案已 i18n,关键路径有测试覆盖。
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# 迁移执行与检查清单
|
|
2
|
+
|
|
3
|
+
## 迁移前分析
|
|
4
|
+
|
|
5
|
+
在动手迁移前,必须完成以下分析并输出**迁移分析报告**:
|
|
6
|
+
|
|
7
|
+
1. **存量盘点**
|
|
8
|
+
- 页面数量、功能模块数量
|
|
9
|
+
- 依赖的 jQuery 插件及替代方案(如 DataTables → TanStack Table)
|
|
10
|
+
- 现有 API 调用方式、是否有统一封装
|
|
11
|
+
- 是否有服务端模板(JSP/Thymeleaf/EJS 等)需要保留、局部替换或改为纯前端渲染
|
|
12
|
+
- 目标栈是 React/Vue/Next/Nuxt、现代 MPA,还是只做局部 TypeScript/构建/测试现代化
|
|
13
|
+
|
|
14
|
+
2. **依赖关系**
|
|
15
|
+
- 页面间共享的 JS/CSS 模块
|
|
16
|
+
- 跨页面复用的业务逻辑
|
|
17
|
+
- 与后端的接口契约(是否需调整)
|
|
18
|
+
|
|
19
|
+
3. **迁移优先级**
|
|
20
|
+
- 按业务价值、复杂度、耦合度排序
|
|
21
|
+
- 优先迁移独立模块、低耦合页面
|
|
22
|
+
- 识别可复用的工具函数、常量、类型定义
|
|
23
|
+
|
|
24
|
+
## 分阶段迁移流程
|
|
25
|
+
|
|
26
|
+
### 阶段 0:准备
|
|
27
|
+
|
|
28
|
+
- 搭建或识别目标项目骨架:React/Vue/Next/Nuxt、现代 MPA,或现有项目内的渐进式 TypeScript/构建入口
|
|
29
|
+
- 配置 ESLint、Prettier、测试框架
|
|
30
|
+
- 建立 `services/request.ts` 统一请求层,与现有 API 兼容
|
|
31
|
+
- 将遗留项目中的 `utils`、`constants` 逐步迁移并补充类型
|
|
32
|
+
|
|
33
|
+
### 阶段 1:基础层
|
|
34
|
+
|
|
35
|
+
- 迁移并类型化 API 调用(`$.ajax` → `axios`/`fetch`)
|
|
36
|
+
- 迁移工具函数(日期、格式化、校验等)
|
|
37
|
+
- 迁移常量、枚举、类型定义
|
|
38
|
+
- 建立目标导航/页面入口骨架;未迁移页面可继续走旧路由、重定向、iframe 或微前端嵌入
|
|
39
|
+
|
|
40
|
+
### 阶段 2:按模块/页面迁移
|
|
41
|
+
|
|
42
|
+
- 每次迁移一个完整功能或页面
|
|
43
|
+
- 从简单到复杂:静态页 → 列表页 → 表单页 → 复杂交互页
|
|
44
|
+
- 迁移时提取可复用组件,遵循目标 React 或 Vue 项目的目录结构
|
|
45
|
+
- 每完成一个模块,补充单元测试和 E2E 关键路径
|
|
46
|
+
|
|
47
|
+
### 阶段 3:收尾
|
|
48
|
+
|
|
49
|
+
- 按迁移策略移除或冻结旧代码入口;若保留 MPA,则收敛旧入口并完成现代化边界
|
|
50
|
+
- 配置 404、错误边界、全局错误处理
|
|
51
|
+
- 性能优化(懒加载、代码分割、缓存策略)
|
|
52
|
+
- 文档更新、部署流程调整
|
|
53
|
+
|
|
54
|
+
## 重构实施要求
|
|
55
|
+
|
|
56
|
+
迁移时需遵循以下实施约束,确保视觉与交互一致、代码更简洁易维护。
|
|
57
|
+
|
|
58
|
+
### 图片与图标
|
|
59
|
+
|
|
60
|
+
- 直接使用原项目的图片资源路径,不重新托管或替换
|
|
61
|
+
- 可使用 SVG 图片(`<img src="*.svg" />` 或 CSS `background-image`);图标组件或可访问交互确需内联 SVG 时,应遵循目标项目图标规范并说明理由。
|
|
62
|
+
- 若原项目使用了 iconfont 或 IcoMoon 图标,重构时优先继续使用,保持图标体系一致;替换为其他图标方案前需评估视觉一致性、包体和维护成本。
|
|
63
|
+
- 图标优先使用原项目已有的图标文件(iconfont / IcoMoon / 已有 SVG),必要时可引入 SVG 文件作为独立资源
|
|
64
|
+
|
|
65
|
+
### 国际化(i18n)
|
|
66
|
+
|
|
67
|
+
- 新栈代码(React / Vue 等)中的用户可见文案须走项目 i18n,不在新代码里硬编码中/英文案
|
|
68
|
+
- 遗留 HTML/JS 中**不要新增**用户可见硬编码文案,除非纯静态且仓库尚无可用 i18n 接入点;改动文案前先查 locales 是否已有条目,并同步主要语言文件
|
|
69
|
+
- key 按页面/模块/语义组织,复用既有 key;仅当旧 key 为对外契约时才做映射过渡,详见项目规则中的 **国际化 (i18n)**(`templates/shared/rules/fec-i18n.md` 内「遗留代码与迁移场景」)
|
|
70
|
+
|
|
71
|
+
### 样式
|
|
72
|
+
|
|
73
|
+
- 布局样式对齐原项目视觉效果,但**只参考原项目效果,不照搬其 CSS**
|
|
74
|
+
- 优先使用 **flex 弹性布局**,避免 `float`、复杂 `position`、冗余嵌套
|
|
75
|
+
- 避免不合理写法:如 `!important` 滥用、过深选择器、重复定义
|
|
76
|
+
- 组件中优先避免内联样式(`style={{ ... }}` / `style="..."`);确需使用运行时动态值、第三方组件 API 或 CSS 变量桥接时,应保持局部、可解释,并优先放入目标项目样式体系。
|
|
77
|
+
|
|
78
|
+
### 目标
|
|
79
|
+
|
|
80
|
+
- **视觉和交互**:与原项目一致,用户无感知差异
|
|
81
|
+
- **代码质量**:更简洁、易维护,符合目标框架规范
|
|
82
|
+
- **业务功能**:与原项目保持一致,**不得缺失功能**;迁移前后行为等价
|
|
83
|
+
|
|
84
|
+
### 验证分层
|
|
85
|
+
|
|
86
|
+
- 涉及页面、组件、路由、表单、弹窗、导航或关键用户流程的迁移,先建立重构前后的行为清单,再使用 Playwright 或同等真实浏览器验证方式对关键路径做对比验证。
|
|
87
|
+
- 对视觉敏感页面,补充截图对比或人工截图验收;动态内容、动画、字体和环境差异需明确屏蔽、稳定化或说明。
|
|
88
|
+
- 对纯逻辑、类型、构建或无 UI 的迁移,不强制 Playwright,应选择更贴近风险的验证层:type-check、unit test、component test、build 或 lint。
|
|
89
|
+
- 验证目标不是像素级完全一致,而是确认业务功能无缺失、关键交互等价、主要视觉布局无非预期偏差,并且代码比旧实现更清晰、可维护。
|
|
90
|
+
|
|
91
|
+
## 迁移检查清单
|
|
92
|
+
|
|
93
|
+
每个迁移单元完成后,确认:
|
|
94
|
+
|
|
95
|
+
- [ ] 已建立重构前后的行为清单,覆盖公共 API、路由、表单、权限、错误状态、缓存、埋点和关键交互
|
|
96
|
+
- [ ] 业务逻辑与旧实现一致,无功能遗漏,功能完整等价
|
|
97
|
+
- [ ] 涉及 UI、交互或关键流程的迁移已使用 Playwright 或同等真实浏览器验证方式完成关键路径对比
|
|
98
|
+
- [ ] 视觉敏感页面已完成截图对比或人工截图验收,并说明动态内容、动画、字体和环境差异处理方式
|
|
99
|
+
- [ ] 纯逻辑、类型、构建或无 UI 迁移已选择更贴近风险的验证层,不强制套用 Playwright
|
|
100
|
+
- [ ] 类型定义完整,无 `any` 滥用
|
|
101
|
+
- [ ] API 调用使用统一 request 层,错误处理完整
|
|
102
|
+
- [ ] 表单校验、loading、空状态、错误状态已实现
|
|
103
|
+
- [ ] 可访问性:表单有 label、交互可键盘操作
|
|
104
|
+
- [ ] 无 XSS 风险(用户输入已转义或使用安全 API)
|
|
105
|
+
- [ ] 关键路径有测试覆盖
|
|
106
|
+
- [ ] 符合目标栈的项目规范(React / Vue / Next / Nuxt / MPA 现代化等)
|
|
107
|
+
- [ ] 图片使用原项目资源;图标体系优先沿用原项目或目标项目规范,例外已说明
|
|
108
|
+
- [ ] 样式参考原项目效果但不照搬 CSS,优先使用目标项目样式体系,内联样式例外已说明
|
|
109
|
+
- [ ] 视觉与交互与原项目一致,代码更简洁易维护
|
|
110
|
+
- [ ] 新代码路径文案已 i18n;遗留层未扩大硬编码;locales 检索与多语言同步已完成(参见 i18n 规则迁移补充清单)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# 迁移策略与概念映射
|
|
2
|
+
|
|
3
|
+
## 迁移策略选择
|
|
4
|
+
|
|
5
|
+
| 策略 | 适用情况 | 优点 | 风险 |
|
|
6
|
+
| --------------------------- | ------------------------------------ | ---------------------------- | ---------------------------- |
|
|
7
|
+
| **渐进式(Strangler Fig)** | 大型项目、需持续交付、团队熟悉度不足 | 风险可控、可分批上线、可回滚 | 新旧并存期长、需维护两套代码 |
|
|
8
|
+
| **一次性重写** | 中小型项目、业务稳定、有充足时间窗口 | 目标架构清晰、无历史包袱 | 周期长、上线压力大、回滚困难 |
|
|
9
|
+
|
|
10
|
+
**推荐**:优先考虑渐进式,除非项目规模小且业务简单。
|
|
11
|
+
|
|
12
|
+
## 概念映射
|
|
13
|
+
|
|
14
|
+
### jQuery → React
|
|
15
|
+
|
|
16
|
+
| 遗留模式 | React 对应 |
|
|
17
|
+
| ------------------------------------------ | -------------------------------------- |
|
|
18
|
+
| `$(selector).html(content)` | 声明式 JSX + state 驱动渲染 |
|
|
19
|
+
| `$(document).on('click', '.btn', handler)` | `onClick` + 事件委托由 React 处理 |
|
|
20
|
+
| `$.ajax()` / `$.get()` | 项目请求层、`fetch` / `axios`,可按需接 TanStack Query 或 SWR |
|
|
21
|
+
| 全局变量 / 命名空间存储状态 | 局部 state、Context 或项目既有 store,可按需使用 Zustand/Redux |
|
|
22
|
+
| `$(el).show()` / `$(el).hide()` | 条件渲染 `{visible && <Component />}` |
|
|
23
|
+
| 手动 DOM 操作 `append` / `remove` | 数据驱动,通过 setState 触发重渲染 |
|
|
24
|
+
| 模板字符串拼接 HTML | JSX 组件 + props |
|
|
25
|
+
| 多页面 + 服务端路由 | React Router 客户端路由 |
|
|
26
|
+
|
|
27
|
+
### jQuery → Vue 3
|
|
28
|
+
|
|
29
|
+
| 遗留模式 | Vue 3 对应 |
|
|
30
|
+
| ------------------------------------------ | -------------------------------------------------- |
|
|
31
|
+
| `$(selector).html(content)` | 模板 + `ref` / `reactive` 驱动渲染 |
|
|
32
|
+
| `$(document).on('click', '.btn', handler)` | `@click` + 事件修饰符 |
|
|
33
|
+
| `$.ajax()` / `$.get()` | 项目请求层、`fetch` / `axios`,可按需接 VueUse、Nuxt `useFetch` 或 TanStack Query Vue adapter |
|
|
34
|
+
| 全局变量 / 命名空间存储状态 | `ref` / `reactive` / Pinia |
|
|
35
|
+
| `$(el).show()` / `$(el).hide()` | `v-show` / `v-if` |
|
|
36
|
+
| 手动 DOM 操作 | 数据驱动,通过响应式更新视图 |
|
|
37
|
+
| 模板字符串拼接 HTML | 单文件组件 `<template>` + props |
|
|
38
|
+
| 多页面 + 服务端路由 | Vue Router 客户端路由 |
|
|
39
|
+
|
|
40
|
+
### 通用映射
|
|
41
|
+
|
|
42
|
+
| 遗留概念 | 现代对应 |
|
|
43
|
+
| --------------------------------- | ------------------------------------------ |
|
|
44
|
+
| 页面级 JS 入口(每页一个 script) | 路由/页面入口 + 懒加载模块,或保留 MPA 入口并现代化打包 |
|
|
45
|
+
| 公共 JS 模块(utils、ajax 封装) | `services/`、`utils/`、类型化 API 层 |
|
|
46
|
+
| 内联样式 / 页面级 CSS | 目标项目样式体系,如 CSS Modules、Tailwind、全局样式分层或组件库样式 |
|
|
47
|
+
| 服务端模板变量 | 通过 API 获取、SSR/loader 注入,或保留服务端模板边界并类型化数据 |
|
|
48
|
+
| 表单提交 + 整页刷新 | 表单库 + 客户端校验 + API 调用 |
|
|
@@ -18,7 +18,7 @@ description: Use when maintaining or safely modifying existing non-framework fro
|
|
|
18
18
|
5. HTML/CSS 保持语义、label、alt、BEM/既有命名和低选择器深度。
|
|
19
19
|
6. 安全重点检查 `.html()`、`innerHTML`、URL 参数渲染、CSRF token 和文件上传。
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## 详细参考
|
|
22
22
|
|
|
23
23
|
涉及 jQuery 命名空间、事件绑定、Ajax、XSS 转义、文件组织和维护清单示例时,加载 [references/legacy-patterns.md](references/legacy-patterns.md)。
|
|
24
24
|
|
|
@@ -12,14 +12,14 @@ description: Use when optimizing or reviewing large lists, virtual scrolling, wi
|
|
|
12
12
|
## Procedure
|
|
13
13
|
|
|
14
14
|
1. 先确认列表规模和瓶颈:500+ 项、滚动掉帧、DOM 节点过多或内存飙升才引入虚拟化。
|
|
15
|
-
2.
|
|
15
|
+
2. 先遵循项目现有框架、依赖和设计系统约束,再按场景选库:React 可考虑 `react-window` 或 TanStack Virtual;Vue/Solid/Svelte、动态测量、网格或跨框架场景优先考虑 TanStack Virtual;遗留 `react-virtualized` 只维护不新增。
|
|
16
16
|
3. 明确 item size、overscan、容器高度、key、滚动容器和 resize 行为。
|
|
17
17
|
4. 无限滚动时分离数据分页和 DOM 虚拟化;数据获取可联用数据获取 workflow。
|
|
18
18
|
5. 验证 DOM 节点数、滚动 FPS、键盘/屏幕阅读器体验和 Ctrl+F/SEO 限制。
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## 详细参考
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
涉及是否需要虚拟化、库选型、固定高度、可变/动态高度、无限滚动、网格虚拟化和性能注意事项时,加载 [references/virtualization-patterns.md](references/virtualization-patterns.md)。
|
|
23
23
|
|
|
24
24
|
## Constraints
|
|
25
25
|
|
|
@@ -1,6 +1,34 @@
|
|
|
1
1
|
# 虚拟列表模式
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 先判断是否需要虚拟化
|
|
4
|
+
|
|
5
|
+
- 只有列表规模、渲染成本或滚动性能已经形成瓶颈时才引入虚拟化;小列表、轻量静态列表和分页后可控的列表不需要。
|
|
6
|
+
- SEO 关键内容、依赖浏览器原生 Ctrl+F 的全文内容、需要一次性打印/导出的内容,不要只存在于虚拟项中。
|
|
7
|
+
- 虚拟化只减少 DOM 渲染成本,不替代数据分页、接口缓存、图片懒加载或复杂行组件的渲染优化。
|
|
8
|
+
|
|
9
|
+
## 选型参考
|
|
10
|
+
|
|
11
|
+
先沿用项目已有虚拟列表库和框架约定;新增依赖时再按场景选择。
|
|
12
|
+
|
|
13
|
+
| 场景 | 候选方案 | 注意点 |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| React 固定高度列表 | `react-window` 或 TanStack Virtual | `react-window` 轻量稳定;TanStack Virtual 更适合统一复杂场景。 |
|
|
16
|
+
| React 可变高度列表 | `react-window` 的 `VariableSizeList` 或 TanStack Virtual | 高度可计算时两者都可用;内容真实高度会变化时需要测量和重置。 |
|
|
17
|
+
| 动态测量、聊天流、展开行 | TanStack Virtual | 配合 `measureElement` / ResizeObserver,处理布局抖动和滚动锚点。 |
|
|
18
|
+
| Vue / Solid / Svelte / 跨框架 | TanStack Virtual 或项目既有生态库 | 不要为非 React 项目引入 React-only 虚拟列表库。 |
|
|
19
|
+
| 二维网格、表格、列虚拟化 | TanStack Virtual row/column 双轴方案或现有表格库虚拟化能力 | 固定列、粘性表头和键盘导航需要单独验证。 |
|
|
20
|
+
| 遗留 `react-virtualized` 项目 | 维护现有实现 | 不建议新功能继续扩散;大改时评估迁移成本。 |
|
|
21
|
+
|
|
22
|
+
## 通用实现原则
|
|
23
|
+
|
|
24
|
+
- 容器高度必须稳定,滚动容器必须明确,item key 必须来自稳定业务标识。
|
|
25
|
+
- 行根元素必须透传虚拟库提供的 `style`、定位属性和测量 ref。
|
|
26
|
+
- `overscan` 按设备和行渲染成本调节:过小会白屏,过大会接近全量渲染。
|
|
27
|
+
- 动态高度需要估算高度、真实测量、resize 更新和滚动锚点策略。
|
|
28
|
+
- 无限滚动要分离“数据分页”和“DOM 虚拟化”;不要在 render 阶段无条件触发请求。
|
|
29
|
+
- 验证键盘导航、屏幕阅读器语义、焦点保持、滚动恢复、空态/加载态和错误态。
|
|
30
|
+
|
|
31
|
+
## React 固定高度示例
|
|
4
32
|
|
|
5
33
|
```tsx
|
|
6
34
|
import { FixedSizeList as List } from "react-window";
|
|
@@ -16,7 +44,7 @@ export const UserList = ({ users }: { users: User[] }) => (
|
|
|
16
44
|
);
|
|
17
45
|
```
|
|
18
46
|
|
|
19
|
-
##
|
|
47
|
+
## React 可变高度示例
|
|
20
48
|
|
|
21
49
|
```tsx
|
|
22
50
|
import { VariableSizeList as List } from "react-window";
|
|
@@ -28,7 +56,7 @@ const getItemSize = (index: number) => (items[index].hasSummary ? 120 : 60);
|
|
|
28
56
|
</List>;
|
|
29
57
|
```
|
|
30
58
|
|
|
31
|
-
##
|
|
59
|
+
## TanStack Virtual 动态高度示例
|
|
32
60
|
|
|
33
61
|
```tsx
|
|
34
62
|
const virtualizer = useVirtualizer({
|
|
@@ -39,7 +67,7 @@ const virtualizer = useVirtualizer({
|
|
|
39
67
|
});
|
|
40
68
|
```
|
|
41
69
|
|
|
42
|
-
动态内容需要测量元素并处理 ResizeObserver
|
|
70
|
+
动态内容需要测量元素并处理 ResizeObserver;Vue/Solid/Svelte 项目使用 TanStack Virtual 对应框架 adapter,核心选项保持一致。
|
|
43
71
|
|
|
44
72
|
## 无限滚动
|
|
45
73
|
|
|
@@ -31,12 +31,16 @@ description: Use when designing, implementing, or reviewing frontend interaction
|
|
|
31
31
|
- Level 3-4:加入短 stagger、局部 spring 和轻量 reveal,适合仪表盘、设置页和管理台。
|
|
32
32
|
- Level 5-6:加入视差、布局 morph、指针响应,适合产品展示和交互式首页。
|
|
33
33
|
- Level 7+:使用滚动叙事、固定段落或 3D/WebGL 配合,必须单独做移动端和 reduced-motion 降级。
|
|
34
|
+
- 场景默认值:公共服务、医疗、金融和强可访问性产品从 Level 1-2 起步;SaaS 工具和数据后台从 Level 2-3 起步;营销页、品牌页和作品集可从 Level 4-6 起步;实验性活动页或沉浸式叙事才考虑 Level 7+。
|
|
35
|
+
- 如果 UI 设计流程已经设定了动效强度拨盘,沿用该拨盘;不要因为引入了某个动效库就自动提高强度。
|
|
34
36
|
|
|
35
37
|
4. 建立性能边界
|
|
36
38
|
- 只高频动画 `transform`、`opacity`,谨慎使用 `filter` 和 `clip-path`。
|
|
37
39
|
- GSAP、Lottie、Three.js、重型动画组件必须动态导入或隔离在叶子组件。
|
|
38
40
|
- 持续动画需要暂停条件:不可见、标签页隐藏、用户关闭、低电量或 reduced motion。
|
|
39
41
|
- 不在滚动事件中同步读写布局;使用 IntersectionObserver、ScrollTimeline 或节流后的 rAF。
|
|
42
|
+
- 滚动叙事、stagger、spring、磁吸指针和视差效果必须各自有明确职责;同一屏不要同时堆叠多种高强度运动语言。
|
|
43
|
+
- 长页面中重复 reveal 动画要控制节奏,避免每个区块都以同一种延迟、方向和 easing 进入,造成模板感和滚动疲劳。
|
|
40
44
|
|
|
41
45
|
5. 设计可访问降级
|
|
42
46
|
- 所有非必要动效读取 `prefers-reduced-motion`,降级为静态、淡入或即时状态。
|
|
@@ -50,12 +54,15 @@ description: Use when designing, implementing, or reviewing frontend interaction
|
|
|
50
54
|
- 检查首次加载 bundle 是否因动效库显著膨胀。
|
|
51
55
|
- 手动开启 reduced motion,确认动画被禁用或弱化。
|
|
52
56
|
- 用性能面板或实际设备确认滚动和关键交互没有明显掉帧。
|
|
57
|
+
- 检查动效强度是否匹配页面类型:工作台不应出现营销式滚动剧场,作品集也不应只有默认 hover 淡入。
|
|
58
|
+
- 对滚动触发序列确认用户可以快速到达内容,不因 pinned 区块、过长时间轴或不可中断过渡丢失上下文。
|
|
53
59
|
|
|
54
60
|
## Constraints
|
|
55
61
|
|
|
56
62
|
- 不在同一个组件内混用 Framer Motion 和 GSAP 控制同一元素。
|
|
57
63
|
- 不用动效掩盖 loading、empty、error、disabled 等状态缺失。
|
|
58
64
|
- 不为普通后台表格、配置页和高频工作台默认加入大幅视差或滚动劫持。
|
|
65
|
+
- 不让所有区块使用相同 reveal 模板;动效节奏应随信息层级和用户任务变化。
|
|
59
66
|
- 不动画 `width`、`height`、`top`、`left`、`margin`、`padding` 等会频繁触发布局的属性。
|
|
60
67
|
- 不把大型 Lottie JSON、GSAP 插件或 3D 场景放入首屏同步包。
|
|
61
68
|
- 不让动画改变阅读顺序、焦点顺序或键盘可达性。
|
|
@@ -18,7 +18,8 @@ description: Use when creating or reviewing Next.js 14+ App Router projects, fil
|
|
|
18
18
|
3. 明确 SSR / SSG / ISR / CSR 渲染模式和 Next fetch/cache 策略。
|
|
19
19
|
4. 为路由补齐 `loading.tsx`、`error.tsx`、`not-found.tsx`、metadata 和敏感逻辑的服务端边界。
|
|
20
20
|
5. 引入第三方库前检查是否支持 Server Component;浏览器专属、动效、图表、编辑器和 WebGL 库必须放进客户端叶子组件并按需加载。
|
|
21
|
-
6.
|
|
21
|
+
6. 对动态渲染、缓存失效、RSC 序列化、route handler、middleware 和首屏 bundle 做证据优先审查;不确定时先收集构建、trace、headers 或路由行为证据。
|
|
22
|
+
7. 客户端组件架构问题分流到 React 项目 workflow。
|
|
22
23
|
|
|
23
24
|
## 项目结构
|
|
24
25
|
|
|
@@ -73,6 +74,8 @@ src/
|
|
|
73
74
|
- 客户端组件:`useEffect` + `useState`,或 SWR / React Query
|
|
74
75
|
- 优先在服务端获取数据,减少客户端水合
|
|
75
76
|
- 使用 `loading.tsx` 和 Suspense 包裹异步区块,提供流式体验
|
|
77
|
+
- 缓存策略要写清 `force-cache`、`no-store`、`revalidate`、tag/path revalidation 或用户私有数据约束
|
|
78
|
+
- 任何会让路由从静态变动态的读取(cookies、headers、searchParams、未缓存 fetch)都要说明原因和验证方式
|
|
76
79
|
|
|
77
80
|
## 路由与布局
|
|
78
81
|
|
|
@@ -102,6 +105,8 @@ src/
|
|
|
102
105
|
- 不把密钥、内部 API 地址或服务端 token 放入 `NEXT_PUBLIC_` 环境变量。
|
|
103
106
|
- 不让大型动效库、3D 场景、富文本编辑器或地图 SDK 进入根布局同步 bundle。
|
|
104
107
|
- 首屏媒体必须有确定尺寸、真实资源和合理 priority;不要用远程占位图撑布局。
|
|
108
|
+
- 不在没有指标、响应头、构建输出或路由行为证据时断言某路由“已缓存”或“必须动态”。
|
|
109
|
+
- Middleware 只处理路由级轻量决策,不承载重型鉴权查询、日志批处理或可放到 route handler 的业务逻辑。
|
|
105
110
|
|
|
106
111
|
## 与客户端 UI 模式的分工
|
|
107
112
|
|
|
@@ -115,3 +120,4 @@ src/
|
|
|
115
120
|
- 渲染模式选择正确(SSR/SSG/ISR/CSR),数据获取路径清晰
|
|
116
121
|
- 元数据和 SEO 配置完整(title、description、openGraph)
|
|
117
122
|
- 敏感逻辑在服务端,客户端组件仅处理交互
|
|
123
|
+
- 缓存、动态渲染和首屏 bundle 决策有可复查证据,性能风险可分流到专项性能 workflow
|
|
@@ -21,6 +21,7 @@ description: Use when diagnosing or improving frontend performance, Core Web Vit
|
|
|
21
21
|
- 对页面体验优先使用 Lighthouse、Performance trace、React Profiler、Vue Devtools、Memory snapshot 或 RUM 数据。
|
|
22
22
|
- 对包体优先看构建产物、source map、依赖重复、首屏 chunk 和动态 import 边界。
|
|
23
23
|
- 对运行时卡顿优先看长任务、重复渲染、昂贵计算、同步循环、布局抖动和大列表。
|
|
24
|
+
- 如果已有线上监控、平台指标或 CI 产物,先用它们确认受影响路由、设备、时间窗和用户主路径,再决定读哪些源码。
|
|
24
25
|
|
|
25
26
|
3. 分层定位
|
|
26
27
|
- 加载层:关键 CSS、字体、图片、脚本阻塞、预加载和缓存。
|
|
@@ -34,6 +35,7 @@ description: Use when diagnosing or improving frontend performance, Core Web Vit
|
|
|
34
35
|
- 优先处理高频主路径和 P95 体验;低频后台任务不抢占首屏预算。
|
|
35
36
|
- 先做低风险高收益改动,如懒加载、去重、缓存、尺寸预留、虚拟列表、稳定引用和释放资源。
|
|
36
37
|
- 对会牺牲可维护性的技巧,必须说明收益证据和替代方案。
|
|
38
|
+
- 建议进入实现前先过候选门禁:是否有指标支撑、能否定位到路由/组件/chunk/请求、是否可由前端验证、是否存在更小改动。
|
|
37
39
|
|
|
38
40
|
5. 验证回归
|
|
39
41
|
- 重新运行受影响构建、测试和性能采集命令。
|
|
@@ -66,7 +68,13 @@ description: Use when diagnosing or improving frontend performance, Core Web Vit
|
|
|
66
68
|
- 不为一次 Lighthouse 分数牺牲真实用户主路径。
|
|
67
69
|
- 不引入大型新依赖解决小问题;先利用项目已有工具和浏览器能力。
|
|
68
70
|
- 不把后端、网络和浏览器侧问题混为一谈;前端能验证的部分要单独列证据。
|
|
71
|
+
- 不从 repo-wide grep 直接跳到优化结论;先用指标或复现路径收窄候选,再读相关源码。
|
|
72
|
+
|
|
73
|
+
## 详细参考
|
|
74
|
+
|
|
75
|
+
撰写性能分析报告时,加载 [references/report-template.md](references/report-template.md)。
|
|
76
|
+
需要按 React、Vue、Next.js 或 Nuxt 分类定位框架专项性能风险时,加载 [references/framework-performance-patterns.md](references/framework-performance-patterns.md)。
|
|
69
77
|
|
|
70
78
|
## Expected Output
|
|
71
79
|
|
|
72
|
-
|
|
80
|
+
输出有证据链的性能分析报告,说明基线、候选门禁、瓶颈、优化建议、验证方式和剩余风险。报告保存为 `reports/performance-review-YYYY-MM-DD-HHmmss.md`。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 框架专项性能诊断模式
|
|
2
|
+
|
|
3
|
+
本参考用于已经进入性能优化流程后的专项定位。先建立目标、基线和候选门禁,再按框架读取对应分类;不要从这些清单直接跳到结论。
|
|
4
|
+
|
|
5
|
+
## React / Client React
|
|
6
|
+
|
|
7
|
+
- **Waterfall**:独立请求、权限检查、feature flag 或子组件数据是否被串行等待。用 Network waterfall、React Profiler 或用户路径日志确认依赖关系。
|
|
8
|
+
- **Bundle**:首屏是否同步引入图表、编辑器、地图、3D、全量图标、重型日期库或 barrel export。用构建产物、source map 或 bundle analyzer 定位 chunk。
|
|
9
|
+
- **Rerender**:Context 是否过宽,selector 是否过粗,默认对象/数组 props 是否每次新建,昂贵派生是否在热路径重复执行。用 React Profiler 或可复现交互证明。
|
|
10
|
+
- **Effect**:是否用 effect 保存可直接推导的数据,是否把交互逻辑放进 effect,是否缺少取消、清理或稳定依赖。用渲染次数、请求次数或内存/订阅证据确认。
|
|
11
|
+
- **Lazy boundary**:Suspense、动态 import、错误 fallback、loading/empty/error 状态是否成对出现,懒加载是否破坏焦点或首屏布局稳定性。
|
|
12
|
+
|
|
13
|
+
## Vue 3 / Nuxt Client
|
|
14
|
+
|
|
15
|
+
- **Reactive payload size**:大型对象、表格数据或第三方实例是否被深层响应式代理。用组件更新、内存快照或长任务证据判断是否需要浅响应式或不可变边界。
|
|
16
|
+
- **Computed/watch**:本该 computed 的派生值是否用大范围 watcher 手动同步,watch 是否监听过宽对象,异步 watch 是否缺少取消和竞态处理。
|
|
17
|
+
- **Template hot path**:`v-for` 中是否混用 `v-if`、内联重计算、缺少稳定 `:key`,或在大列表中渲染非视区节点。
|
|
18
|
+
- **Async component boundary**:重型组件是否使用异步组件或路由级动态导入,加载状态是否稳定,错误态是否可恢复。
|
|
19
|
+
- **Store fan-out**:Pinia store 是否把高频 UI 临时状态扩散到大范围订阅者,或把服务端缓存复制到全局 store。
|
|
20
|
+
|
|
21
|
+
## Next.js
|
|
22
|
+
|
|
23
|
+
- **Dynamic route drift**:cookies、headers、searchParams 或未缓存 fetch 是否让静态路由变动态。用构建输出、响应头或路由行为确认。
|
|
24
|
+
- **RSC serialization**:Server Component 是否向 Client Component 传递过大 props、重复数据或不可序列化结构。
|
|
25
|
+
- **Fetch/cache policy**:`force-cache`、`no-store`、`revalidate`、tag/path revalidation 是否与数据私有性和更新频率匹配。
|
|
26
|
+
- **Client boundary leakage**:根布局或高层客户端边界是否同步带入重型浏览器库、Provider 或不必要状态。
|
|
27
|
+
- **Middleware cost**:middleware 是否承载重型查询、日志批处理或可放到 route handler 的业务逻辑。
|
|
28
|
+
|
|
29
|
+
## Nuxt 3
|
|
30
|
+
|
|
31
|
+
- **Rendering mode mismatch**:页面是否应为 SSR、SSG、ISR/route rules 或 SPA,实际行为是否和部署目标一致。
|
|
32
|
+
- **Data duplication**:`useFetch` / `useAsyncData` 是否重复请求,key 是否稳定,客户端 hydration 是否重复拉取同一数据。
|
|
33
|
+
- **Route middleware cost**:路由中间件是否做重型异步工作、重复鉴权请求或不可缓存的全局阻塞逻辑。
|
|
34
|
+
- **Client-only islands**:只在浏览器运行的图表、编辑器、地图或 WebGL 是否被隔离到 client-only 或异步边界。
|
|
35
|
+
|
|
36
|
+
## 输出要求
|
|
37
|
+
|
|
38
|
+
每个框架专项建议都要写清楚:证据来源、受影响路由/组件/chunk/请求、建议改法、验证命令和可能影响的 loading、error、empty、offline、reduced-motion 或移动端状态。
|