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

Vue3比Vue2到底强在哪?普通开发者选哪个好?

terry 38分钟前 阅读数 5 #Vue

身边最近半年有不少朋友问起Vue3和Vue2的事儿,要么是项目要重构拿不定主意,要么是刚学前端不知道该先捡哪个入门,其实这俩框架本质都是帮我们快速搞前端的,不用纠结“谁淘汰谁”——毕竟现在还有大量老项目在跑Vue2,维护需求不会消失,但从发展趋势和开发体验来说,Vue3确实是更推荐的方向,今天咱们就掰开揉碎了聊,从底层原理、写代码的手感、性能优化这些实实在在的地方说区别,最后再给个清晰的选择建议。

底层架构:从Object.defineProperty到Proxy,变化从根上开始

聊Vue的区别,绕不开响应式系统的升级,这是最核心的变化,也是后面所有优化的基础。

Vue2的响应式系统:有局限的“拦截器”

Vue2用的是ES5的Object.defineProperty,给data里的每个属性加上getter和setter,这样当你修改属性值或者读取属性值的时候,Vue就能知道,然后更新页面,但这个方法有几个天生的bug:

  • 只能监听已有属性的变化,如果你突然给一个对象加了新属性,或者删了旧属性,Vue根本感知不到,页面不会自动更新,之前开发Vue2的时候,是不是经常遇到加个obj.newKey不行,得用$set、$delete的情况?这就是Object.defineProperty的锅。
  • 监听数组的时候太笨,它不能直接监听数组索引的修改,也不能监听数组长度的变化,只能拦截push、pop、shift、unshift、splice、sort、reverse这7个方法,改了索引或者直接赋值arr.length还得再手动处理一下,不然页面又不动了。
  • 初始化的时候开销大,Object.defineProperty需要递归遍历整个data对象,给每个属性加拦截器,不管这个属性会不会用到,如果data里有个超级大的嵌套对象,刚打开页面的时候可能会有点小卡,尤其是手机端。

    Vue3的响应式系统:全能的“代理”

    Vue3彻底换了ES6的Proxy,给整个data对象(或者数组、Map、Set这些)做了个“代理层”,不管你是访问、修改、新增、删除属性,还是改数组索引、改数组长度,甚至是操作Map、Set,Proxy都能第一时间拦截到,然后告诉Vue更新页面。 这带来的好处太明显了:$set、$delete直接被淘汰了,你想怎么加属性删属性都没问题;不管什么类型的数据都能完美监听,不用再担心数组踩坑;初始化的时候不用递归所有属性了,只有当你真正用到某个属性的时候,Vue才会去做深层的监听,这叫“懒代理”,页面打开的速度会快很多。

组合式API vs 选项式API:代码组织更灵活,复用性直接拉满

除了响应式系统,API的变化应该是大家写代码的时候最直观的感受了,Vue2只有选项式API,Vue3虽然保留了选项式,但主推的是组合式API。

Vue2的选项式API:清晰但容易割裂

什么是选项式?就是把代码按照data、methods、computed、watch、mounted这些不同的功能块分开写,新手一看就知道哪块是数据,哪块是方法,哪块是生命周期,入门门槛特别低。 但等你写稍微复杂一点的组件,比如一个商品详情页,既有商品信息展示,又有购物车操作,还有收藏、评论功能,问题就来了:同一个功能的代码会被拆到好几个地方——比如购物车的数量数据在data,加购的方法在methods,监听数量变化的逻辑在watch,加购后的动画可能在mounted或者watchEffect,找代码的时候得上下翻半天,改起来也容易漏;而且如果多个组件有类似的功能,比如收藏,你想复用代码怎么办?Vue2里要么用mixins,要么用HOC(高阶组件),要么用作用域插槽,但mixins会有命名冲突的问题,作用域插槽写起来又麻烦,复用性真的一般。

Vue3的组合式API:按需组合,高内聚低耦合

组合式API的核心就是setup函数(或者现在更流行的