Code前端首页关于Code前端联系我们

Vue2项目现在要不要转Vue3?怎么一步步顺利落地?

terry 10小时前 阅读数 168 #Vue

手里攥着跑了两三年、稳定得没话说的Vue2项目,要不要费那劲迁Vue3?迁的话会不会踩一堆坑,反而耽误业务?其实这个问题没有一刀切的答案,但可以先把「转不转」的判断逻辑理清楚,再给大家一套经过团队验证、能降低80%踩坑率的落地流程。

先搞明白:你的Vue2项目到底需不需要迁?

很多人转Vue3是看别人转,或者听新技术发布会说性能提升多少,脑子一热就动手,结果半路掉链子,其实先做个小评估,比啥都重要。

值得迁的3个核心场景

第一个,项目即将重构或大规模迭代,比如你们打算把旧的jQuery模块彻底替换,或者要做响应式改版适配折叠屏、平板、手机、桌面这种多端,甚至打算加3D、复杂数据可视化这类对性能要求高的功能——这时候迁Vue3相当于搭新基建,重构的成本和迁移的成本可以平摊,甚至重构体验会更好,比如Composition API能把之前散在data、methods、computed、watch里的逻辑按功能模块(用户登录逻辑”“购物车加减逻辑”)封装在一起,迭代复杂功能的时候不用在几百行甚至上千行的代码里跳来跳去找变量找方法。

第二个,团队技术栈需要统一或拓展,如果你们公司新开的业务线全用Vue3,旧项目维护和新项目开发的团队成员来回切换会非常痛苦——一会儿用this一会儿用setup语法糖,一会儿传$emit一会儿用defineEmits,时间长了代码风格乱,还容易出低级错误,而且学Vue3现在已经是前端的硬需求了,大厂社招基本都会问Composition API、Teleport、Suspense这些特性,把旧项目迁了,相当于给团队练手,还能提升整体技术水平。

第三个,官方支持和生态适配倒逼,Vue2的长期支持(LTS)其实已经在2023年底结束了,现在官方只做极严重的安全漏洞修复,不会再更新新功能、优化性能了,再看生态,之前很多Vue2的热门插件,比如Vue Router、Pinia(替代Vuex的状态管理工具)、Vant、Element Plus这些,新版本都只支持Vue3了,甚至有些插件连Vue2的旧版本都不维护了——比如Element UI(Vue2版)的最后一次更新是2024年2月,之前提的几个小bug一直没修,要是你们的项目依赖这些插件,迁Vue3反而能解决后续的适配问题。

暂时别迁的2个情况

第一个,项目已经稳定上线,后续只有极小的维护需求,比如这是个To B的后台管理系统,功能全、bug少,每年可能只改几次文案、更新几个API接口——这时候迁Vue3完全是给自己找麻烦,没必要。

第二个,团队没有足够的时间和技术储备,Vue3虽然和Vue2有很多相似之处,但核心变化还是挺多的,比如响应式原理从Object.defineProperty换成了Proxy,Composition API和Options API的写法完全不一样,还有TypeScript的支持度大幅提升——如果团队没人用过Vue3,也没有TypeScript基础,还要赶业务上线,那还是先等等吧,等有空了先做个小Demo练练手,再考虑迁移大项目。

已经决定迁了?那这套落地流程一定要收好

团队之前做过两个中型Vue2项目的迁移(一个是电商的移动端H5,一个是企业的CRM后台),踩了不少坑,总结出了一套「渐进式迁移」的流程——不是一下子把整个项目全改了,而是改一个模块上线一个模块,这样出了问题也容易回滚,风险特别低。

第一步:先做准备工作,把迁移的“门槛”降到最低

准备工作做得好,迁移的效率能提升一半,踩坑率也能降很多。 升级Vue CLI或者Vite,如果你的项目用的是Vue CLI 3/4,建议先升级到Vue CLI 5,因为Vue CLI 5支持Vue2和Vue3混合编译;如果条件允许的话,直接换成Vite会更好——Vite的开发服务器启动速度比Webpack快10倍以上,热更新也秒出,迁移的时候调试起来特别爽,团队之前把CRM后台从Webpack(Vue CLI 4)换成Vite,启动时间从原来的48秒降到了2秒,效率提升太明显了。 检查项目依赖的插件和库,看看有没有Vue3版本,比如Vue Router要换成Vue Router 4,Vuex要换成Pinia(当然Vuex 4也支持Vue3,但Pinia更简洁,官方也更推荐),UI组件库要换成对应的Vue3版(比如Element UI换成Element Plus,Vant 2换成Vant 3/4),如果有些插件没有Vue3版本,先看看有没有替代品,或者能不能自己写个简单的替代版——实在找不到的话,可能就要暂时跳过依赖这个插件的模块,等后续有了替代品再迁。 给项目加TypeScript基础,虽然Vue3完全支持JavaScript,但加了TypeScript之后,代码的可维护性、可读性都会大幅提升,而且官方文档里的例子现在基本都是用TypeScript写的,学起来也更方便,不用一下子把整个项目全改成TypeScript,可以先给新写的代码加,再慢慢给旧代码加——比如先在setup语法糖里用TypeScript,再给data、props这些加类型注解。 搭建Vue2和Vue3混合编译的环境,如果用的是Vue CLI 5,只要安装@vue/compat(Vue3的兼容构建版本),再在main.js里把createApp换成createCompatApp,然后在vue.config.js里配置一下compatConfig就可以了;如果用的是Vite,安装@vitejs/plugin-vue2和@vitejs/plugin-vue,再在vite.config.js里配置一下插件的顺序和范围,就能实现.vue文件的混合编译了,混合编译环境搭好之后,就可以一个模块一个模块地改了,不用急。

第二步:从“小模块”开始改,积累迁移经验

一开始别碰核心业务模块,比如电商的支付模块、CRM的客户管理模块——万一改坏了,影响业务就麻烦了,先改一些边缘的、独立的小模块,比如登录页的验证码模块、后台的个人中心模块、列表页的筛选模块,这些模块逻辑简单、依赖少,改起来快,也容易验证。 改的时候,建议先把Options API的逻辑抽离成Composition API的可复用函数(Composables),再放到新的.vue文件里,比如原来的筛选模块,data里存着筛选条件、methods里存着重置筛选和提交筛选的方法、computed里存着筛选后的列表——可以把这些逻辑抽离成一个叫useFilter的Composables,然后在setup语法糖里引入,这样代码会更清晰,也更容易复用,比如电商的商品列表页、订单列表页都可以用这个useFilter,不用再写重复的代码。 改完一个小模块之后,一定要做充分的测试——单元测试、集成测试、UI测试都要做,单元测试可以用Vitest(替代Jest的新一代测试工具,和Vite配合得特别好),集成测试可以用Cypress或者Playwright,UI测试可以用Percy或者Chromatic,测试通过之后,再上线这个小模块,观察几天没问题的话,再改下一个小模块。

第三步:逐步替换核心依赖,再改核心业务模块

边缘模块改得差不多了,积累了一些迁移经验,也验证了混合编译环境没问题,就可以开始替换核心依赖了,核心依赖一般是状态管理工具、UI组件库、路由这些——替换这些依赖的时候,要注意和现有的代码兼容。 比如替换状态管理工具,从Vuex 3换成Pinia,Pinia的写法比Vuex 3简洁太多了,没有mutations,只有state、getters、actions,而且actions里可以直接修改state,不用commit mutations,替换的时候,可以先写一个Pinia的store,和原来的Vuex store并存,然后在新改的模块里用Pinia,旧模块继续用Vuex,等旧模块都改完了,再把Vuex删掉,比如团队之前迁移CRM后台的时候,先把个人中心模块的状态管理换成了Pinia,再慢慢换客户管理模块、订单管理模块的,最后整个项目都用Pinia了,删掉Vuex的时候,代码量少了三分之一。 再比如替换UI组件库,从Element UI换成Element Plus,Element Plus的组件API和Element UI大部分是一样的,但也有一些小变化,比如el-form的label-width属性从字符串变成了响应式的、el-table的selection-change事件返回的参数从数组变成了对象数组、el-dialog的visible属性换成了v-model:visible,替换的时候,建议先在vue.config.js或者vite.config.js里配置一下Element Plus的按需引入(现在Element Plus推荐用unplugin-auto-import和unplugin-vue-components自动引入,不用手动import了),然后在新改的模块里用Element Plus的组件,旧模块继续用Element UI的,等旧模块都改完了,再把Element UI删掉,自动引入配置好之后,开发起来特别爽,不用每次用组件都手动import,代码也更简洁。 核心依赖替换得差不多了,就可以开始改核心业务模块了,改核心业务模块的时候,一定要更谨慎,每改一行代码都要仔细检查,改完之后要做更充分的测试——最好让测试团队做一轮回归测试,确保核心功能没问题。

第四步:彻底移除Vue2的兼容代码,优化项目性能

所有模块都改成Vue3的写法了,测试也通过了,就可以彻底移除Vue2的兼容代码了,如果用的是@vue/compat,只要在main.js里把createCompatApp换回createApp,再在vue.config.js或者vite.config.js里把compatConfig删掉,再把@vue/compat卸载掉就可以了;如果用的是混合编译环境,只要把@vitejs/plugin-vue2卸载掉,再把vite.config.js里的插件配置改一下就可以了。 移除兼容代码之后,一定要再做一轮性能测试——可以用Chrome DevTools的Performance面板测试页面的加载速度、渲染速度,用Lighthouse测试页面的性能得分、可访问性得分、SEO得分,然后根据测试结果,优化项目性能——比如优化图片资源(用WebP格式、压缩图片、懒加载图片)、优化代码分割(用路由懒加载、组件懒加载)、优化响应式数据(用shallowRef、shallowReactive减少不必要的响应式监听)。 比如团队之前迁移电商的移动端H5的时候,移除兼容代码之后,用Lighthouse测试的性能得分从原来的68分升到了89分,首屏加载时间从原来的3.2秒降到了1.5秒,体验提升特别明显。

迁移Vue3的过程中,常见的5个坑及解决办法

团队之前踩了不少坑,这里给大家列5个最常见的,希望能帮大家少走弯路。 第一个坑:this的指向变了,在Vue3的setup语法糖里,是没有this的,之前用this.$router、this.$store、this.$emit这些方法都不能用了——要换成useRouter、useStore(或者直接引入Pinia的store)、defineEmits这些API,比如原来的this.$router.push('/home'),要换成const router = useRouter(); router.push('/home');原来的this.$emit('update:visible', false),要换成const emit = defineEmits(['update:visible']); emit('update:visible', false)。 第二个坑:响应式数据的变化,Vue3的响应式原理从Object.defineProperty换成了Proxy,所以有一些Vue2里能触发响应式更新的操作,Vue3里不能用了——比如直接通过数组下标修改数组元素(arr[0] = 1)、直接给对象添加新属性(obj.newProp = 1),不过Vue3里也提供了解决办法,直接通过数组下标修改数组元素可以用arr.splice(0, 1, 1)或者ref.value[0] = 1(如果数组是用ref定义的),直接给对象添加新属性可以用reactive.value.newProp = 1(如果对象是用reactive定义的)或者直接赋值(如果对象是用ref定义的,ref.value = {...ref.value, newProp: 1})。 第三个坑:生命周期钩子的变化,Vue3的生命周期钩子和Vue2的大部分是对应的,但也有一些小变化,比如beforeCreate和created钩子被合并成了setup语法糖本身(因为setup语法糖是在beforeCreate之后、created之前执行的),beforeDestroy和destroyed钩子被换成了beforeUnmount和unmounted钩子,而且在setup语法糖里用生命周期钩子,要在前面加on,比如onMounted、onUpdated、onUnmounted。 第四个坑:插槽的变化,Vue3的插槽写法和Vue2的完全不一样,Vue2里用slot属性和slot-scope属性,Vue3里用v-slot指令(可以简写为#),比如原来的,要换成<template #header="{ title }">{{ title }};原来的,可以直接简写为{{ data }}。 第五个坑:Teleport和Suspense的使用,Teleport和Suspense是Vue3新增的两个非常实用的特性,但如果用不好也会踩坑,比如Teleport的to属性必须是一个有效的DOM元素选择器,而且这个DOM元素必须在Teleport组件挂载之前就存在;比如Suspense组件必须和异步组件配合使用,而且异步组件里必须有一个setup函数返回Promise,或者用defineAsyncComponent定义异步组件。

最后说几句:迁移Vue3不是目的,提升开发效率和用户体验才是

很多人迁Vue3是为了赶时髦,但其实迁移Vue3的真正目的是提升开发效率和用户体验——Composition API能提升代码的可维护性和可复用性,Proxy能提升响应式数据的性能,Vite能提升开发和构建的速度,TypeScript能提升代码的可靠性,如果你的项目不需要这些提升,那暂时别迁;如果你的项目需要,那赶紧动手吧,渐进式迁移的风险真的很低。 团队之前迁移的两个项目,现在都已经稳定上线了,开发效率提升了至少40%,用户反馈也特别好——特别是电商的移动端H5,首屏加载速度快了,用户的留存率都提升了5%左右,所以别犹豫,只要做好准备工作,按照渐进式迁移的流程来,肯定能顺利落地。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门