技术是决策与代价的平衡 —— 超大系统从 Vue 2 向 Vue 3 演进的思考

🪜 引言:当年选 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 的迁移也不是错,它是这个系统"想活得更久"的表现;
  • 技术人不是"追新党",而是"让旧系统也能走进新生态"的桥梁;

而你如果正在经历类似转型,记住:

系统演进不是推倒重来,而是逐步重塑;

技术人最重要的,不是知道一切新技术,而是知道什么时候、用什么方式引入它。

相关推荐
拾光拾趣录3 分钟前
链表合并:双指针与递归
前端·javascript·算法
@大迁世界7 分钟前
前端:优秀架构的坟墓
前端·架构
拼图20911 分钟前
element-plus——图标推荐
javascript·vue.js·elementui
期待のcode19 分钟前
图片上传实现
java·前端·javascript·数据库·servlet·交互
?ccc?29 分钟前
Kubernetes 架构原理与集群环境部署
容器·架构·kubernetes
hbrown1 小时前
Flask+LayUI开发手记(十一):选项集合的数据库扩展类
前端·数据库·python·layui
猫头虎1 小时前
什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景?
前端·python·scrapy·arcgis·npm·beautifulsoup·pip
迷曳1 小时前
27、鸿蒙Harmony Next开发:ArkTS并发(Promise和async/await和多线程并发TaskPool和Worker的使用)
前端·华为·多线程·harmonyos
安心不心安2 小时前
React hooks——useReducer
前端·javascript·react.js
像风一样自由20202 小时前
原生前端JavaScript/CSS与现代框架(Vue、React)的联系与区别(详细版)
前端·javascript·css