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

现在学Vue3晚不晚?个人项目公司重构要不要上?对比Vue2的优势能落地多少?

terry 14小时前 阅读数 177 #Vue
文章标签 Vue3Vue3落地

Vue3已经发布3年多了,官方去年还正式把Vue2的长期支持结束时间从原定的2023年12月延长到了2024年12月——不过这更像是给超大型遗留项目留的最后缓冲期,社区里Vue2生态的更新早就基本停滞了:新出的组件库要么只做Vue3版,要么Vue2版停在几个月前的小修复,再也加不了新功能,那这三个问题应该是最近半年无论是刚入门前端、还是在公司纠结技术栈的老开发者,心里最常冒出来的问号,今天就逐个聊透。

第一个问号:现在学Vue3晚不晚?对不同阶段的人有不一样的答案

刚入门的同学真的别慌,现在学Vue3不仅不晚,反而是最好的时机,为什么这么说?Vue3的核心语法和开发思路已经完全稳定了,没有刚发布时的API反复横跳,不管是跟着免费的B站教程、付费的专栏,还是啃官方文档,学的都是未来几年甚至十年都会用到的主流写法,生态已经成熟到“闭着眼睛用”的程度:之前困扰Vue3很久的Vant3/Vant4适配问题、Pinia替代Vuex后的状态管理学习成本问题、还有SSR方案从Nuxt2到Nuxt3的过渡问题,现在都解决得差不多了,新入门直接从Pinia、Nuxt3、Element Plus/Vant4开始学,一步到位用最先进的工具链,不用再补Vue2那一堆“过渡性质的坑”,从就业市场来看,现在几乎所有的前端岗位JD里,都把“熟悉Vue3/Composition API”作为硬性要求,哪怕是招实习生,也会优先问有没有写过Vue3的demo,反而“只会Vue2”成了减分项,甚至很多中小型公司已经直接停收Vue2简历了。

那如果是已经工作3-5年的Vue2老开发者呢?其实也不算晚,但得加快脚步,别等Nuxt2彻底停更、团队强制重构的时候再临时抱佛脚,很多老开发者可能会觉得“我Vue2用得这么熟,Composition API有什么用,逻辑复用我用mixin也能做”——这种想法真的会限制自己的职业发展,先不说mixin的“黑盒问题”“命名冲突问题”“重名数据来源追踪难问题”这些官方都吐槽烂了的缺点,现在的前端项目越来越复杂,比如要做一个包含图表、表单验证、用户登录状态管理、多语言切换的后台管理系统,用Vue2的mixin或者extends,可能最后代码散在五六个文件里,改个小功能都要翻半天;但用Vue3的Composition API,你可以把“登录逻辑”“图表初始化和销毁逻辑”“表单实时验证逻辑”都封装成独立的composable函数,哪个组件需要直接import进来,变量和函数的来源清清楚楚,改起来也方便。

第二个问号:个人项目公司重构要不要上?得先算清楚“成本账”和“收益账”

先聊个人项目吧——个人项目必须上Vue3,不用纠结,个人项目本来就是用来练手、展示技术能力的,写在简历上的Vue2项目,除非是那种特别有创意、功能特别复杂的,不然很难从一堆简历里跳出来;但如果是用Vue3 + Pinia + Vite + TypeScript写的项目,面试官一眼就能看到你的技术栈是最新的,加分项拉满,而且个人项目的规模一般都不大,重构成本很低:如果是刚开坑的,直接用Vue CLI或者Vite的Vue3模板初始化就行;如果是写了一半的Vue2项目,也可以用官方的Vue2迁移助手工具(@vue/compat)慢慢改,不用一次性全部推翻重来。

然后是公司的遗留项目——这个得仔细算清楚账,不能一刀切,首先要分清楚项目的“生命周期”:如果是那种已经上线3年以上、功能基本稳定、只有偶尔的小bug修复或者小功能迭代的“养老型项目”,而且团队里所有人都只会Vue2,那暂时不用重构,可以先把开发环境升级到Webpack 5(提升一下打包速度),把一些用得不顺手的第三方库换成Vue2版的最后稳定版就行;但如果是那种正在快速迭代、每天都有新功能加、团队里有一半以上的人已经会Vue3的“成长型项目”,或者是那种准备做移动端适配、做SSR、做性能优化的“潜力型项目”,那越早重构越好

接下来算成本账和收益账:重构成本主要包括“技术学习成本”“代码重构时间成本”“测试成本”,收益主要包括“开发效率提升”“打包和运行性能提升”“维护成本降低”“招聘新人更容易”,怎么算才合理?可以先找一个模块做“试点重构”:比如找后台管理系统里的“商品管理”模块,用Vue3 + Composition API + Pinia重写一遍,对比一下原来Vue2版的开发时间、打包体积、运行速度、还有新成员上手这个模块的时间,如果试点的收益明显大于成本,那就可以慢慢推广到整个项目;如果试点的收益不明显,甚至成本很高,那可以先等等,或者只做一些局部的优化。

另外还要注意重构的“节奏”:不要一次性把整个项目的代码都改成Vue3的,那样风险太大,万一出了什么大bug,整个项目都会停摆,可以用官方的@vue/compat构建模式,先把项目改成“兼容模式”——兼容模式下,Vue2的代码和Vue3的代码可以混合运行,你可以先把一些经常改动的、逻辑复杂的模块改成Vue3的,然后再慢慢改其他模块,最后等所有模块都改完了,再把兼容模式关掉,切换到纯Vue3模式。

第三个问号:对比Vue2的优势能落地多少?别只看官方文档,要结合实际开发场景说

官方文档里列了Vue3的一堆优势:比如虚拟DOM重写、Tree-Shaking优化、Composition API、TypeScript原生支持、Teleport、Suspense、自定义渲染器API——但很多老开发者看了这些优势之后,会觉得“这些东西听起来很厉害,但实际开发中好像用不上”,今天就挑几个实际开发中用得最多、收益最明显的优势,结合具体场景说。

第一个是Tree-Shaking优化和打包体积缩小,Vue2的核心代码是“全量打包”的——不管你用不用Vuex、不用Vue-router、不用transition组件,打包的时候都会把这些代码全部打包进去,导致一个空的Vue2项目,打包后的体积就有30-40KB;但Vue3的核心代码是“按需引入”的,配合ES6的import语法和Tree-Shaking工具,如果你只用Vue3的核心渲染功能,打包后的体积只有10-15KB,比Vue2缩小了一半还多,这个优势在移动端项目里特别明显:移动端用户的网络环境可能不稳定,页面加载速度慢一秒,用户流失率就会增加很多,Vue3的打包体积缩小,能直接提升页面的加载速度,降低用户流失率,比如之前我帮朋友做过一个校园二手交易的小程序,原来用的是Vue2 + uni-app,打包后的主包体积有2.1MB,差点超过微信小程序的主包2MB限制;后来改成了Vue3 + uni-app,主包体积直接降到了1.6MB,不仅没超限制,页面加载速度还快了1-2秒,朋友说最近的用户留存率提升了10%左右。

第二个是Composition API带来的逻辑复用和可维护性提升,刚才提到过mixin的一堆问题,现在用具体的例子对比一下:比如要做一个“实时获取窗口宽高”的功能,用Vue2的mixin,代码是这样的:

// windowSizeMixin.js
export default {
  data() {
    return {
      windowWidth: window.innerWidth,
      windowHeight: window.innerHeight
    }
  },
  mounted() {
    window.addEventListener('resize', this.handleResize)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.handleResize)
  },
  methods: {
    handleResize() {
      this.windowWidth = window.innerWidth
      this.windowHeight = window.innerHeight
    }
  }
}
// 使用mixin的组件A
import windowSizeMixin from './windowSizeMixin.js'
export default {
  mixins: [windowSizeMixin],
  data() {
    return {
      // 哦豁,这里如果不小心也定义了windowWidth或者windowHeight,会直接覆盖mixin里的
      // 而且如果后面又加了一个mixin B,里面也有handleResize,两个方法会合并,但只会执行最后一个
      componentAData: 'xxx'
    }
  }
}

但用Vue3的Composition API封装成composable函数,代码是这样的:

// useWindowSize.js
import { ref, onMounted, onUnmounted } from 'vue'
export default function useWindowSize() {
  const windowWidth = ref(window.innerWidth)
  const windowHeight = ref(window.innerHeight)
  function handleResize() {
    windowWidth.value = window.innerWidth
    windowHeight.value = window.innerHeight
  }
  onMounted(() => {
    window.addEventListener('resize', handleResize)
  })
  onUnmounted(() => {
    window.removeEventListener('resize', handleResize)
  })
  // 明确返回组件需要的变量和函数
  return {
    windowWidth,
    windowHeight
  }
}
// 使用composable的组件A
import useWindowSize from './useWindowSize.js'
import { ref } from 'vue'
export default {
  setup() {
    // 命名完全由自己控制,不会冲突,而且来源清清楚楚
    const { windowWidth, windowHeight } = useWindowSize()
    const componentAData = ref('xxx')
    // 如果需要另一个“实时获取鼠标位置”的composable,直接import进来就行
    // const { mouseX, mouseY } = useMousePosition()
    return {
      windowWidth,
      windowHeight,
      componentAData
    }
  }
}

对比一下就能看出来,composable函数的优势太明显了:没有命名冲突、变量和函数的来源清清楚楚、逻辑完全独立、可以随意组合,这个优势在大型项目里特别有用:比如之前我在的公司有一个电商后台管理系统,用Vue2写的时候,状态管理用的是Vuex,还有五六个mixin,代码散在七八个文件里,新成员上手至少要一周;后来改成了Vue3 + Pinia,把原来的mixin都封装成了composable函数,新成员上手只要2-3天,而且改bug的效率也提升了很多。

第三个是TypeScript原生支持,Vue2虽然也支持TypeScript,但支持得很勉强:要用Class API或者vue-property-decorator库,代码写起来很啰嗦,而且类型提示也不完整;但Vue3是用TypeScript重写的,原生支持TypeScript,不管是用Composition API还是Options API,类型提示都非常完整,这个优势在多人协作的大型项目里特别有用:比如之前我在的公司有一个电商后台管理系统,用Vue2 + JavaScript写的时候,经常会出现“变量名拼错”“函数传参类型不对”“组件props类型不对”这些低级bug,每次测试都要花很多时间找这些bug;后来改成了Vue3 + TypeScript,这些低级bug在开发的时候就能被编辑器检测出来,测试的工作量减少了一半还多,代码的质量也提升了很多。

第四个是Teleport组件,Teleport组件是Vue3新增的一个非常实用的组件,它可以把组件的DOM元素挂载到任意的DOM节点上,而不是只能挂载到父组件的DOM节点下,这个优势在做“弹窗”“下拉菜单”“悬浮提示”这些组件的时候特别有用:比如之前用Vue2做弹窗的时候,经常会出现“弹窗被父组件的overflow: hidden属性遮住”的问题,解决办法要么是把overflow: hidden去掉,要么是把弹窗挂载到body节点下,但挂载到body节点下要写很多复杂的原生JavaScript代码,而且很容易出现内存泄漏;但用Vue3的Teleport组件,只需要加一行代码就能解决问题:

<template>
  <div class="parent" style="overflow: hidden; width: 200px; height: 200px;">
    <!-- 把弹窗挂载到body节点下 -->
    <Teleport to="body">
      <div class="modal">我是弹窗</div>
    </Teleport>
  </div>
</template>

是不是超级简单?

除了上面这四个优势,Vue3还有很多其他实用的优势,比如Suspense组件(可以优雅地处理异步组件的加载状态)、自定义渲染器API(可以用Vue3的语法写小程序、写桌面应用、甚至写游戏)、虚拟DOM重写(提升了组件的渲染速度)——这些优势在实际开发中也都能用到,只是用的频率没有上面四个高而已。

现在学Vue3不仅不晚,反而是最好的时机;个人项目必须上Vue3,公司的成长型项目和潜力型项目也要尽快上Vue3;Vue3对比Vue2的优势能完全落地,而且能带来非常明显的收益,如果你还在纠结,别犹豫了,赶紧开始学Vue3吧!

版权声明

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

热门