fec-legacy-to-modern-migration · git:20260607.44659b6 · 2026-06-07 · sha256 cbe24913cbc445e1
fec-legacy-to-modern-migration git:20260607.44659b6A
Immutable. This exact content never changes and is served at /api/v1/blob/cbe24913cbc445e1.
---
name: fec-legacy-to-modern-migration
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 迁移.
---
# 传统前端到现代框架迁移
适用于将 JavaScript + jQuery + HTML/CSS 多页面应用(MPA)、服务端模板渲染项目或旧框架代码,渐进迁移到 React、Vue、Next.js、Nuxt、TypeScript,或保留 MPA 形态但现代化模块、构建、类型和测试的场景。
## Purpose
指导传统前端项目渐进迁移到目标现代栈,提供迁移策略、概念映射、分阶段步骤和实施约束,确保功能等价和风险可控。
## Procedure
1. 先识别目标栈、迁移边界和是否保留 MPA/服务端模板形态。
2. 选择渐进式或一次性重写策略,并输出迁移分析报告。
3. 做存量盘点、依赖关系分析和迁移优先级排序。
4. 按准备、基础层、模块/页面迁移、收尾的顺序推进,每次迁移一个可验证单元。
5. 每个迁移单元按检查清单验证功能等价、视觉一致、类型安全、可访问性、i18n、资源和样式边界。
## 迁移策略选择
| 策略 | 适用情况 | 优点 | 风险 |
| --------------------------- | ------------------------------------ | ---------------------------- | ---------------------------- |
| **渐进式(Strangler Fig)** | 大型项目、需持续交付、团队熟悉度不足 | 风险可控、可分批上线、可回滚 | 新旧并存期长、需维护两套代码 |
| **一次性重写** | 中小型项目、业务稳定、有充足时间窗口 | 目标架构清晰、无历史包袱 | 周期长、上线压力大、回滚困难 |
**推荐**:优先考虑渐进式,除非项目规模小且业务简单。
## 概念映射
### jQuery → React
| 遗留模式 | React 对应 |
| ------------------------------------------ | -------------------------------------- |
| `$(selector).html(content)` | 声明式 JSX + state 驱动渲染 |
| `$(document).on('click', '.btn', handler)` | `onClick` + 事件委托由 React 处理 |
| `$.ajax()` / `$.get()` | 项目请求层、`fetch` / `axios`,可按需接 TanStack Query 或 SWR |
| 全局变量 / 命名空间存储状态 | 局部 state、Context 或项目既有 store,可按需使用 Zustand/Redux |
| `$(el).show()` / `$(el).hide()` | 条件渲染 `{visible && <Component />}` |
| 手动 DOM 操作 `append` / `remove` | 数据驱动,通过 setState 触发重渲染 |
| 模板字符串拼接 HTML | JSX 组件 + props |
| 多页面 + 服务端路由 | React Router 客户端路由 |
### jQuery → Vue 3
| 遗留模式 | Vue 3 对应 |
| ------------------------------------------ | -------------------------------------------------- |
| `$(selector).html(content)` | 模板 + `ref` / `reactive` 驱动渲染 |
| `$(document).on('click', '.btn', handler)` | `@click` + 事件修饰符 |
| `$.ajax()` / `$.get()` | 项目请求层、`fetch` / `axios`,可按需接 VueUse、Nuxt `useFetch` 或 TanStack Query Vue adapter |
| 全局变量 / 命名空间存储状态 | `ref` / `reactive` / Pinia |
| `$(el).show()` / `$(el).hide()` | `v-show` / `v-if` |
| 手动 DOM 操作 | 数据驱动,通过响应式更新视图 |
| 模板字符串拼接 HTML | 单文件组件 `<template>` + props |
| 多页面 + 服务端路由 | Vue Router 客户端路由 |
### 通用映射
| 遗留概念 | 现代对应 |
| --------------------------------- | ------------------------------------------ |
| 页面级 JS 入口(每页一个 script) | 路由/页面入口 + 懒加载模块,或保留 MPA 入口并现代化打包 |
| 公共 JS 模块(utils、ajax 封装) | `services/`、`utils/`、类型化 API 层 |
| 内联样式 / 页面级 CSS | 目标项目样式体系,如 CSS Modules、Tailwind、全局样式分层或组件库样式 |
| 服务端模板变量 | 通过 API 获取、SSR/loader 注入,或保留服务端模板边界并类型化数据 |
| 表单提交 + 整页刷新 | 表单库 + 客户端校验 + API 调用 |
## 迁移前分析
在动手迁移前,必须完成以下分析并输出**迁移分析报告**:
1. **存量盘点**
- 页面数量、功能模块数量
- 依赖的 jQuery 插件及替代方案(如 DataTables → TanStack Table)
- 现有 API 调用方式、是否有统一封装
- 是否有服务端模板(JSP/Thymeleaf/EJS 等)需要保留、局部替换或改为纯前端渲染
- 目标栈是 React/Vue/Next/Nuxt、现代 MPA,还是只做局部 TypeScript/构建/测试现代化
2. **依赖关系**
- 页面间共享的 JS/CSS 模块
- 跨页面复用的业务逻辑
- 与后端的接口契约(是否需调整)
3. **迁移优先级**
- 按业务价值、复杂度、耦合度排序
- 优先迁移独立模块、低耦合页面
- 识别可复用的工具函数、常量、类型定义
## 分阶段迁移流程
### 阶段 0:准备
- 搭建或识别目标项目骨架:React/Vue/Next/Nuxt、现代 MPA,或现有项目内的渐进式 TypeScript/构建入口
- 配置 ESLint、Prettier、测试框架
- 建立 `services/request.ts` 统一请求层,与现有 API 兼容
- 将遗留项目中的 `utils`、`constants` 逐步迁移并补充类型
### 阶段 1:基础层
- 迁移并类型化 API 调用(`$.ajax` → `axios`/`fetch`)
- 迁移工具函数(日期、格式化、校验等)
- 迁移常量、枚举、类型定义
- 建立目标导航/页面入口骨架;未迁移页面可继续走旧路由、重定向、iframe 或微前端嵌入
### 阶段 2:按模块/页面迁移
- 每次迁移一个完整功能或页面
- 从简单到复杂:静态页 → 列表页 → 表单页 → 复杂交互页
- 迁移时提取可复用组件,遵循目标 React 或 Vue 项目的目录结构
- 每完成一个模块,补充单元测试和 E2E 关键路径
### 阶段 3:收尾
- 按迁移策略移除或冻结旧代码入口;若保留 MPA,则收敛旧入口并完成现代化边界
- 配置 404、错误边界、全局错误处理
- 性能优化(懒加载、代码分割、缓存策略)
- 文档更新、部署流程调整
## 重构实施要求
迁移时需遵循以下实施约束,确保视觉与交互一致、代码更简洁易维护。
### 图片与图标
- 直接使用原项目的图片资源路径,不重新托管或替换
- 可使用 SVG 图片(`<img src="*.svg" />` 或 CSS `background-image`);图标组件或可访问交互确需内联 SVG 时,应遵循目标项目图标规范并说明理由。
- 若原项目使用了 iconfont 或 IcoMoon 图标,重构时优先继续使用,保持图标体系一致;替换为其他图标方案前需评估视觉一致性、包体和维护成本。
- 图标优先使用原项目已有的图标文件(iconfont / IcoMoon / 已有 SVG),必要时可引入 SVG 文件作为独立资源
### 国际化(i18n)
- 新栈代码(React / Vue 等)中的用户可见文案须走项目 i18n,不在新代码里硬编码中/英文案
- 遗留 HTML/JS 中**不要新增**用户可见硬编码文案,除非纯静态且仓库尚无可用 i18n 接入点;改动文案前先查 locales 是否已有条目,并同步主要语言文件
- key 按页面/模块/语义组织,复用既有 key;仅当旧 key 为对外契约时才做映射过渡,详见项目规则中的 **国际化 (i18n)**(`templates/shared/rules/fec-i18n.md` 内「遗留代码与迁移场景」)
### 样式
- 布局样式对齐原项目视觉效果,但**只参考原项目效果,不照搬其 CSS**
- 优先使用 **flex 弹性布局**,避免 `float`、复杂 `position`、冗余嵌套
- 避免不合理写法:如 `!important` 滥用、过深选择器、重复定义
- 组件中优先避免内联样式(`style={{ ... }}` / `style="..."`);确需使用运行时动态值、第三方组件 API 或 CSS 变量桥接时,应保持局部、可解释,并优先放入目标项目样式体系。
### 目标
- **视觉和交互**:与原项目一致,用户无感知差异
- **代码质量**:更简洁、易维护,符合目标框架规范
- **业务功能**:与原项目保持一致,**不得缺失功能**;迁移前后行为等价
## 迁移检查清单
每个迁移单元完成后,确认:
- [ ] 业务逻辑与旧实现一致,无功能遗漏,功能完整等价
- [ ] 类型定义完整,无 `any` 滥用
- [ ] API 调用使用统一 request 层,错误处理完整
- [ ] 表单校验、loading、空状态、错误状态已实现
- [ ] 可访问性:表单有 label、交互可键盘操作
- [ ] 无 XSS 风险(用户输入已转义或使用安全 API)
- [ ] 关键路径有测试覆盖
- [ ] 符合目标栈的项目规范(React / Vue / Next / Nuxt / MPA 现代化等)
- [ ] 图片使用原项目资源;图标体系优先沿用原项目或目标项目规范,例外已说明
- [ ] 样式参考原项目效果但不照搬 CSS,优先使用目标项目样式体系,内联样式例外已说明
- [ ] 视觉与交互与原项目一致,代码更简洁易维护
- [ ] 新代码路径文案已 i18n;遗留层未扩大硬编码;locales 检索与多语言同步已完成(参见 i18n 规则迁移补充清单)
## Constraints
- 迁移前必须先输出迁移分析报告,明确策略、优先级和风险
- 不要在一次迁移中同时改架构、改 UI、改接口
- 优先保证功能等价,再考虑优化和现代化
- 迁移过程中保持旧系统可运行,避免大爆炸式上线
- 遇到 jQuery 插件无现成替代时,可暂时用 iframe 或微前端方式嵌入,待后续替换
- **目标栈**:先识别 React/Vue/Next/Nuxt、现代 MPA 或局部现代化目标,不默认强制改成 SPA。
- **图片与图标**:使用原项目图片资源,图标体系优先沿用原项目或目标项目规范;内联 SVG 例外需有可访问性、组件化或维护理由。
- **样式**:参考原项目效果不照搬 CSS,优先使用目标项目样式体系;内联样式例外需局部、可解释。
- **目标**:视觉与交互一致、代码更简洁易维护,业务功能不得缺失
## 详细参考
撰写迁移分析或迁移计划报告时,加载 [references/migration-report-template.md](references/migration-report-template.md)。
## Expected Output
- 迁移分析报告保存为 `reports/migration-plan-YYYY-MM-DD-HHmmss.md`,包含策略选择、存量盘点、依赖关系、分阶段步骤、风险与回滚方案
- 迁移后的业务功能与原项目完全等价,无功能缺失
- 视觉与交互与原项目一致,用户无感知差异
- 类型定义完整,无 `any` 滥用,API 调用统一且类型安全
- 图片使用原项目资源,样式进入目标项目样式体系,图标和内联样式例外有明确理由
- 新代码文案已 i18n,关键路径有测试覆盖