我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue3 与 vue2 优点对比汇总

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue3 与 vue2 优点对比汇总

​​​​​​摘要:

Vue3新版本的理念成型于 2018 年末,当时的 Vue 2 已经有两岁半了。比起通用软件的生命周期来这好像也没那么久,Vue3在2020年正式推出,在源码和API都有较大变化,性能得到了显著的提升,比Vue2.x快1.2~2倍。

Vue3新版本的理念成型于 2018 年末,当时的 Vue 2 已经有两岁半了。比起通用软件的生命周期来这好像也没那么久,Vue3在2020年正式推出,在源码和API都有较大变化,性能得到了显著的提升,比Vue2.x快1.2~2倍。

其中,一些比较重要的优点有:

diff算法的优化:hoistStatic 静态提升;cacheHandlers事件侦听器缓存;ssr渲染;更好的Ts支持;Compostion API: 组合API/注入API;更先进的组件;自定义渲染API;按需编译,体积比vue2.x更小;支持多根节点组件等。

下面我们就来具体说说vue3 的优点:

优点1:diff算法的优化

vue2中的虚拟dom是全量的对比(每个节点不论写死的还是动态的都会一层一层比较,这就浪费了大部分事件在对比静态节点上)

vue3新增了静态标记(patchflag)与上次虚拟节点对比时,只对比带有patch flag的节点(动态数据所在的节点);可通过flag信息得知当前节点要对比的具体内容。

例如:下面的模板包含一个div,div内包含三个段落,其中前两个段落是静态固定不变的,而第三个段落的内容绑定的msg属性,当msg改变的时候,Vue会生成新的虚拟DOM然后和旧的进行对比。


<div>
 <p>云驻共创</p>
 <p>如何评价 vue3</p>
 <p>{{msg}}</p>
</div>

当视图更新时,只对动态节点部分进行diff运算,减少了资源的损耗。Patchflag是个枚举,取值为1代表这个元素的文本是动态绑定的,取值为2代表元素的class是动态绑定的。

优点2:hoistStatic 静态提升

vue2无论元素是否参与更新,每次都会重新创建然后再渲染。vue3对于不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用即可。例如:下面我们利用Vue 3 Template Explorer,来直观的感受一下:


<div>
    <div>共创1</div>
    <div>共创2</div>
    <div>{{name}}</div>
</div>

静态提升之前


export function render(...) {
    return (
        _openBlock(),
        _createBlock('div', null, [
            _createVNode('div', null, '共创1'),
            _createVNode('div', null, '共创2'),
            _createVNode(
                'div',
                null,
                _toDisplayString(_ctx.name),
                1 
            ),
        ])
    )
}

静态提升之后


const _hoisted_1 =  _createVNode(
    'div',
    null,
    '共创1',
    -1 
)
const _hoisted_2 =  _createVNode(
    'div',
    null,
    '共创2',
    -1 
)

export function render(...) {
    return (
        _openBlock(),
        _createBlock('div', null, [
            _hoisted_1,
            _hoisted_2,
            _createVNode(
                'div',
                null,
                _toDisplayString(_ctx.name),
                1 
            ),
        ])
    )
}

从以上代码中我们可以看出,_hoisted_1_hoisted_2两个方法被提升到了渲染函数 render 之外,也就是我们说的静态提升。通过静态提升可以避免每次渲染的时候都要重新创建这些对象,从而大大提高了渲染效率。

优点3:cacheHandlers 事件侦听器缓存

vue2.x中,绑定事件每次触发都要重新生成全新的function去更新,cacheHandlers 是Vue3中提供的事件缓存对象,当 cacheHandlers 开启,会自动生成一个内联函数,同时生成一个静态节点。当事件再次触发时,只需从缓存中调用即可,无需再次更新。

默认情况下onClick会被视为动态绑定,所以每次都会追踪它的变化,但是同一个函数没必要追踪变化,直接缓存起来复用即可。

例如:下面我们同样是通过Vue 3 Template Explorer,来看一下事件监听器缓存的作用:


<div>
    <div @click="todo">做点有趣的事</div>
</div>

该段 html 经过编译后变成我们下面的结构(未开启事件监听缓存):


export function render(...) {
    return (_openBlock(),_createBlock('div', null, [
            _createVNode('div',{ onClick: _ctx.todo}, '做点有趣的事', 8 ,
                ['onClick']),
        ])
    )
}

当我们开启事件监听器缓存后:


export function render(...) {
    return (_openBlock(),_createBlock('div', null, [
            _createVNode('div',{
                    onClick:    //开启监听后
                        _cache[1] || (_cache[1] = (...args) =>_ctx.todo(...args)),
                },'做点有趣的事'),
        ])
    )
}

我们可以对比开启事件监听缓存前后的代码,转换之后的代码, 大家可能还看不懂, 但是不要紧,我们只需要观察有没有静态标记即可,在Vue3的diff算法中, 只有有静态标记的才会进行比较, 才会进行追踪。

优点4:ssr渲染

Vue2 中也是有 SSR 渲染的,但是 Vue3 中的 SSR 渲染相对于 Vue2 来说,性能方面也有对应的提升。

当存在大量静态内容时,这些内容会被当作纯字符串推进一个 buffer 里面,即使存在动态的绑定,会通过模版插值潜入进去。这样会比通过虚拟 dmo 来渲染的快上很多。

当静态内容大到一个量级的时候,会用_createStaticVNode 方法在客户端去生成一个 static node,这些静态 node,会被直接 innerHtml,就不需要再创建对象,然后根据对象渲染。

优点5:更好的Ts支持

vue2不适合使用ts,原因在于vue2Option API风格。options是个简单对象,而ts是一种类型系统、面向对象的语法。两者有点不匹配。

在vue2结合ts的具体实践中,要用 vue-class-component 强化 vue 组件,让 Script 支持 TypeScript 装饰器,用 vue-property-decorator 来增加更多结合 Vue 特性的装饰器,最终搞的ts的组件写法和js的组件写法差别挺大。

在vue3中,量身打造了defineComponent函数,使组件在ts下,更好的利用参数类型推断 。Composition API 代码风格中,比较有代表性的api就是 ref 和 reactive,也很好的支持了类型声明。


import { defineComponent, ref } from 'vue'
const Component = defineComponent({
    props: {
        success: { type: String },
        student: {
          type: Object as PropType<Student>,
          required: true
       }
    },
    setup() {
      const year = ref(2020)
      const month = ref<string | number>('9')
      month.value = 9 // OK
     const result = year.value.split('') 
 }

优点6:Compostion API: 组合API/注入API

传统的网页是html/css/javascript(结构/样式/逻辑)分离。vue通过组件化的方式,将联系紧密的结构/样式/逻辑放在一起,有利于代码的维护。compostionapi更进一步,着力于JS(逻辑)部分,将逻辑相关的代码放在一起,这样更有利于代码的维护。

在vue2的组件内使用的是Option API风格(data/methods/mounted)来组织的代码,这样会让逻辑分散,举个例子就是我们完成一个计数器功能,要在data里声明变量,在methods定义响应函数,在mounted里初始化变量,如果在一个功能比较多、代码量比较大的组件里,你要维护这样一个功能,就需要在data/methods/mounted反复的切换到对应位置,然后进行代码的更改。

而在vue3中,使用setup函数。如下所示跟count相关的逻辑,都放到counter.js文件里,跟todo相关的逻辑放到todos.js里。


import useCounter from './counter'
import useTodo from './todos'

setup(){
let { val, todos, addTodo } = useTodo()
let {count,add} = useCounter() 
return {
val, todos, addTodo,
count,add,
}

优点7:更先进的组件

vue2是不允许这样写的,组件必须有一个跟节点,现在可以这样写,vue将为我们创建一个虚拟的Fragment节点。


<template>
<div>华为云享专家</div>
<div>全栈领域博主</div>
</template>

Suspended-component完全渲染之前,备用内容会被显示出来。如果是异步组件,Suspense可以等待组件被下载,或者在设置函数中执行一些异步操作。

优点8:自定义渲染API

vue2.x项目架构对于weex(移动端跨平台方案)和myvue(小程序上使用)等渲染到不同平台不太友好,vue3.0推出了自定义渲染API解决了该问题。下面我们先看vue2和vue3的入口写法有哪些不同。

vue2:


import Vue from 'vue'
import App from './App.vue'
new Vue({ => h(App)}).$mount('#app')

vue3:


const { createApp } from 'vue'
import App from "./class="lazy" data-src/App"
createApp(App).mount(('#app')

vue官方实现的 createApp 会给我们的 template 映射生成 html 代码,但是要是你不想渲染生成到 html ,而是要渲染生成到 canvas 之类的不是html的代码的时候,那就需要用到 Custom Renderer API 来定义自己的 render 渲染生成函数了。


import { createApp } from "./runtime-render";
import App from "./class="lazy" data-src/App"; // 根组件
createApp(App).mount('#app');

使用自定义渲染API,如weexmyvue这类方案的问题就得到了完美解决。只需重写createApp即可。

优点9:按需编译,体积比vue2.x更小

框架的大小也会影响其性能。这是 Web 应用程序的唯一关注点,因为需要即时下载资源,在浏览器解析必要的JavaScript 之前该应用程序是不可交互的。对于单页应用程序尤其如此。尽管 Vue 一直是相对轻量级的(Vue 2 的运行时大小压缩为 23 KB)。

在 Vue 3 中,通过将大多数全局 API 和内部帮助程序移至 ES 模块导出来,实现了这一目标。这使现代的打包工具可以静态分析模块依赖性并删除未使用的导出相关的代码。模板编译器还会生成友好的 Tree-shaking 代码,在模板中实际使用了该功能时才导入该功能的帮助程序。

框架的某些部分永远不会 Tree-shaking,因为它们对于任何类型的应用都是必不可少的。我们将这些必不可少的部分的度量标准称为基准尺寸。尽管增加了许多新功能,但 Vue 3 的基准大小压缩后约为 10 KB,还不到 Vue 2 的一半。

优点10:支持多根节点组件

Vue3 一个模板不再限制有多个根节点,(多个根节点上的 Attribute 继承) 需要显式定义 attribute 应该分布在哪里。否则控制台会给出警告提示。

在 Vue 3 中,组件现在正式支持多根节点组件,即片段!

在 2.x 中,不支持多根组件,当用户意外创建多根组件时会发出警告,因此,为了修复此错误,许多组件被包装在一个中。如下


<template>
  <div>
    <header>...</header>
    <main>...</main>
    <footer>...</footer>
  </div>
</template>

在 3.x 中,组件现在可以有多个根节点!但是,这确实要求开发者明确定义属性应该分布在哪里。


<template>
  <header>...</header>
  <main v-bind="$attrs">...</main>
  <footer>...</footer>
</template>

总结:

  • Vue是国内最火的前端框架之一。性能提升,运行速度是vue2的1.2-2倍。
  • 体积更小,按需编译体积vue2要更小。
  • 类型推断,更好的支持ts这个也是趋势。
  • 高级给予,暴露了更底层的API和提供更先进的内置组件。
  • 组合API,能够更好的组织逻辑,封装逻辑,复用逻辑

到此这篇关于vue3 对比 vue2 有什么优点的文章就介绍到这了,更多相关vue3 对比 vue2 的优点内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue3 与 vue2 优点对比汇总

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

golang函数的优点与缺点对比

go 函数的优点包括:提高代码可重用性、模块化、封装性、可测试性和并发性;缺点包括:代码重复、命名冲突、性能开销、复杂性和调试困难。通过计算矩形面积的示例展示了函数的优点,包括提高代码可重用性、模块化和可测试性。Go 函数的优点与缺点Go
golang函数的优点与缺点对比
2024-04-19

C++deque与vector对比的优缺点

这篇文章主要介绍了C++中deque与vector相比的优势与劣势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-01-04

C++ 函数与宏的区别和优缺点对比

函数是运行时执行的代码块,可返回结果;宏是预处理时展开的常量或代码片段,不可返回结果。函数易读、可重用、代码可读性高,但效率低;宏编译开销小、性能优,但代码可读性差、难以调试。C++ 函数与宏的区别和优缺点对比函数与宏概述函数:代码块,
C++ 函数与宏的区别和优缺点对比
2024-04-11

对象存储服务与图片服务器的优缺点对比

今天再次与人探讨到网站图片存放话题,于是乎想起了经典的图片存放的虚拟应用程序。也就是IIS发布时候的“添加虚拟目录”功能。此功能如今在图片共享用途上已经逐步被对象存储服务所替代。这个功能在传统架构里,虚拟目录功能能够实现多个网站共享同一个“
2023-06-05

Go语言与Java在开发效率方面的比较:优缺点对比

Go语言和Java在开发效率上的不同:优势与劣势概述Go语言和Java都是广受欢迎的编程语言,它们都有自己的优点和缺点。在开发效率方面,Go语言和Java也有着不同的表现。Go语言的优势简单易学:Go语言的语法简单易懂,学习曲线较低。
Go语言与Java在开发效率方面的比较:优缺点对比
2024-01-31

自建服务器与阿里云优缺点对比分析

在信息化时代,服务器已经成为企业或个人进行数据存储、数据处理、信息交互的重要工具。自建服务器与阿里云作为两种常见的服务器形式,各有其独特的优点和缺点。本文将对自建服务器与阿里云进行详细的优缺点对比分析,以帮助读者更好地选择适合自己的服务器形式。自建服务器:自建服务器是指由个人或企业自行购买和维护的服务器。自建服务
自建服务器与阿里云优缺点对比分析
2023-11-22

PHP PDO与其他数据库扩展对比:优缺点分析

本文对PHP PDO与其他数据库扩展进行了优缺点对比,分析了PDO的优势和劣势,并通过演示代码展示了PDO的使用方法。
PHP PDO与其他数据库扩展对比:优缺点分析
2024-02-13

VUE Nuxt.js中间件与其他框架的对比:优缺点分析

本文将对VUE Nuxt.js中间件与其他框架的对比进行分析,以帮助您更好地了解中间件的优缺点,并根据自己的需求选择合适的框架。 VUE Nuxt.js、中间件、对比分析、优缺点 概述 中间件是一种在应用程序中处理请求和响应的软件组件,它可以执行各种操作,例如:身份验证、授权、日志记录、错误处理等。VUE Nuxt.js是一个基于VUE.js的通用框架,它提供了许多内置的中间件,以及支持使用第三方中间件。
VUE Nuxt.js中间件与其他框架的对比:优缺点分析
2024-02-04

Java Git与其他版本控制工具的对比:优缺点大揭秘

Java Git与其他版本控制工具的优缺点对比,帮助您选择适合自己的版本控制工具。
Java Git与其他版本控制工具的对比:优缺点大揭秘
2024-02-22

开源系统监控工具Nagios、Zabbix和Open-Falcon的功能特性汇总及优缺点比较的示例分析

开源系统监控工具Nagios、Zabbix和Open-Falcon的功能特性汇总及优缺点比较的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Nagios
2023-06-05

VUE Nuxt.js 过渡效果与其他框架的对比:了解不同框架的优缺点

VUE Nuxt.js过渡效果与其他框架的对比,为用户提供流畅的用户体验。
VUE Nuxt.js 过渡效果与其他框架的对比:了解不同框架的优缺点
2024-02-10

编程热搜

目录