🪜 引言:当年选 Vue 2 没错,现在升级 Vue 3 也没错
2022 年初,我们基于 Vue 2 + Ant Design Vue 1.x,搭建了一个拥有十多个子系统的超大型前端平台。它支撑着多个业务域协同运行,曾由 10+ 位前端开发者并行开发,如今进入稳定期,仅由 3 人核心小组进行维护。
这不是小项目,也不是"说重构就能重构"的系统。
如今,面对 Vue 2 生命周期即将结束、组件库停止维护、技术生态变迁,我们站在了系统发展的关键拐点。
我们意识到:
升级不是为了追技术潮流,而是系统演化的自然必经之路。
🧱 第一问:Vue 2 为什么曾经是"对的选择"?
回到 2021 年底、2022 年初:
- Vue 3 刚发布一年多,生态尚未成熟,主流组件库兼容性差
- Ant Design Vue 2.x 仍处于 beta 阶段,许多功能不稳定
- 团队经验主要集中在 Vue 2 + Options API
- 项目目标明确:尽快落地、稳定上线、交付业务价值
📌 选择 Vue 2,是一种理性的、对交付负责的决策。
它给了我们:
- 高速开发能力
- 稳定的组件生态
- 熟悉的技术栈与团队协作模式
我们成功上线并运行至今,证明这条路径曾经正确。
🧯 第二问:为什么现在必须面对升级?
到了 2025 年中,我们的问题不再是"Vue 2 好不好用",而是:
系统是否还能长期维持可扩展性?还能适配未来的业务复杂度?
❗ 风险正在聚集:
项 | 问题 | 风险 |
---|---|---|
Vue 2 生命周期 | 2025年底社区停止支持 | 安全补丁和新浏览器兼容性消失 |
Ant Design Vue 1.x | 已停止更新 | 未来无法适配新版浏览器 / 设计需求 |
组件逻辑 | Mixin、全局注册、低复用 | 维护难、多人协作复杂 |
状态管理 | Vuex 模块混杂,难以拆分 | 无法模块化维护、不可测试 |
人才适配 | 新人都学 Vue 3 + Composition API | 团队传承断层、成本上升 |
这不再是"写不写得出来"的问题,而是"还能不能写下去"的问题。
🧭 我们的选择:逐步演进,而非推倒重来
我们清楚:大系统不能一次性升级。所以我们制定了三步升级战略:
🚆 路线一:主系统冻结,确保稳定
- Vue 2 主系统依然运行,锁版本
- 所有 bug fix 和业务改动都控制在低风险范围内
✈️ 路线二:新系统全部 Vue 3 起步
- 使用 Vite + Vue 3 + Ant Design Vue 2.x 构建新模板
- 新增子系统、新功能全部基于此模板实现
- 封装 BaseForm、BaseTable 等中间组件,隔离差异
🔁 路线三:逐步迁移、渐进融合
- 抽象权限系统、请求封装、国际化等共通逻辑为 composable
- 旧系统逐步引用 Vue 3 实现的模块
- 等组件库/架构稳定后,再评估主系统重构窗口
🧠 架构不是重写代码,而是保障系统活下去的方式
我们重新思考了整个系统的结构:
模块 | 旧做法(Vue 2) | 升级目标(Vue 3) |
---|---|---|
UI 组件 | 直接引用 Ant Design Vue 1.x 组件 | 封装 Base* 系列中间组件,未来可切换 Element Plus 等 |
表单模型 | mixin + v-model + 表单项手写 | 使用 Composition API + useForm 封装 |
路由权限 | 全局钩子中判断角色跳转 | composable 统一路由守卫策略 |
状态管理 | 全局 Vuex 模块多耦合 | Pinia 模块化状态管理,支持类型约束 |
构建工具 | vue-cli + webpack | Vite + TS + 自动导入、热更新更快 |
📌 技术栈是骨架,架构是血脉;我们做的不是"升级框架",而是"更新血液系统"。
📦 技术债不能不还,但我们可以按期还
我们做了一份技术债还款计划表(技术性 + 沟通性):
模块 | 当前状态 | 还款方式 | 优先级 |
---|---|---|---|
UI 组件 | 使用 AntD 1.x,API 固化 | 抽象中间层,封装 Base 组件 | ✅ 高 |
状态管理 | Vuex 全局混用 | 分阶段迁移 Pinia 模块 | ✅ 高 |
页面结构 | Options API 为主 | Composition API 局部试点 | ⚠️ 中 |
样式体系 | Less + 变量混用 | 逐步引入 token、CSS vars | ⚠️ 中 |
API 层 | axios 零散封装 | 重构为 useRequest composable | ⚠️ 中 |
💬 最难的不是技术,而是沟通
是的,业务团队可能不理解我们为什么"又要升级" 。但我们不能等出问题再去抢修。
我们在沟通中这样表达:
"系统现在是稳定的,但未来 1~2 年将无法使用新生态,甚至面临安全和开发人员断层问题。我们现在不是追新技术,而是在给系统留一条未来可持续的通道。"
"升级是投资,不是开销;我们现在的规划,是为了确保你们未来的需求依然有人接得住。"
✨ 技术人的命运:不是永远写新框架,而是不断去适配未来的逻辑
有时我们确实很累:
- 学了 Vue 2,Vue 3 就来了
- 用好了 Vuex,Pinia 推广了
- 配好了 webpack,Vite 起飞了
但我们也逐渐理解:
技术不是赌博,而是决策与代价的平衡。
成熟的系统靠妥协,未来的系统靠进化。
✅ 总结
- Vue 2 的选择没有错,它帮我们上线、落地、支撑业务;
- Vue 3 的迁移也不是错,它是这个系统"想活得更久"的表现;
- 技术人不是"追新党",而是"让旧系统也能走进新生态"的桥梁;
而你如果正在经历类似转型,记住:
系统演进不是推倒重来,而是逐步重塑;
技术人最重要的,不是知道一切新技术,而是知道什么时候、用什么方式引入它。