和Vue2.0 相比,Vue3.0有哪些亮点:

序号 特性 解析
1 Performance 性能上比Vue2.0快1.3-2倍
2 Tree shaking support 按需编译,体积更加轻量化
3 Composition API 组合API,类似 ReactHooks
4 Better TypeScript support 对 Ts 提供了更好的支持
5 Custom Renderer API 暴露了自定义渲染API
6 Fragment,Teleport(Protal),Suspense 更先进的组件

Vue3.0 如何做到更轻量、更快 的呢?

1.diff 算法优化

Vue 2中的虚拟Dom是全量比较
Vue 3新增静态标记(PatchFlag)
在与数据变化后,与上次虚拟DOM节点比较时,只比较带有PatchFlag标记的节点
并且可以从flag信息中得知具体需要比较的内容。

比如,如下代码:

<div><p>李白乘舟将欲行</p><p>忽闻岸上踏歌声</p><p>桃花潭水深千尺</p><p>{{msg}}</p>
</div>

在vue3.0中,会被编译成:(在线编译地址)

import { createVNode as _createVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createBlock as _createBlock } from "vue"export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock("div", null, [_createVNode("p", null, "李白乘舟将欲行"),_createVNode("p", null, "忽闻岸上踏歌声"),_createVNode("p", null, "桃花潭水深千尺"),_createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT类型 flag标记为1 */)]))
}

[附录:标记列表]

  TEXT = 1,// --取值是1---表示具有动态textContent的元素CLASS = 1 << 1,  // --取值是2---表示有动态Class的元素STYLE = 1 << 2,  // --取值是4---表示动态样式(静态如style="color: pink",也会提升至动态)PROPS = 1 << 3,  // --取值是8--- 表示具有非类/样式动态道具的元素。FULL_PROPS = 1 << 4,  // --取值是16---表示带有动态键的道具的元素,与上面三种相斥HYDRATE_EVENTS = 1 << 5,  // --取值是32---表示带有事件监听器的元素STABLE_FRAGMENT = 1 << 6,   // --取值是64---表示其子顺序不变,不会改变自顺序的片段。 KEYED_FRAGMENT = 1 << 7, // --取值是128---表示带有键控或部分键控子元素的片段。UNKEYED_FRAGMENT = 1 << 8, // --取值是256---子节点无key绑定的片段(fragment)NEED_PATCH = 1 << 9,   // --取值是512---表示只需要非属性补丁的元素,例如ref或hooksDYNAMIC_SLOTS = 1 << 10,  // --取值是1024---表示具有动态插槽的元素
2.hoistStatic 静态提升

vue2.0中,在更新时,元素即使没有变化,也会重新创建进行渲染
vue3.0中,不参与更新的元素;会静态提升,只创建一次下次渲染直接复用。
因此在vue3.0中复用更多,创建次数更少,速度更快。

<div><p>李白乘舟将欲行</p><p>忽闻岸上踏歌声</p><p>桃花潭水深千尺</p><p>{{msg}}</p>
</div>

静态提升之前:

export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock("div", null, [_createVNode("p", null, "李白乘舟将欲行"),_createVNode("p", null, "忽闻岸上踏歌声"),_createVNode("p", null, "桃花潭水深千尺"),_createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)]))
}

静态提升之后:

// 注意这里,无需更新的元素只创建一次,后续直接引用
const _hoisted_1 = /*#__PURE__*/_createVNode("p", null, "李白乘舟将欲行", -1 /* HOISTED */)
const _hoisted_2 = /*#__PURE__*/_createVNode("p", null, "忽闻岸上踏歌声", -1 /* HOISTED */)
const _hoisted_3 = /*#__PURE__*/_createVNode("p", null, "桃花潭水深千尺", -1 /* HOISTED */)export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock("div", null, [_hoisted_1, // 直接引用_hoisted_2, // 直接引用_hoisted_3, // 直接引用_createVNode("p", null, _toDisplayString(_ctx.msg), 1 /* TEXT */)]))
}
3.cachehandlers 事件侦听缓存

默认情况下 onClick 被视为动态绑定,因此会追踪它的变化
事件绑定的函数为同一个,因此不追踪它的变化,直接缓存后进行复用

<div><button @click="onClick">点击按钮</button>
</div>

开启缓存前:

export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock("div", null, [_createVNode("button", { onClick: _ctx.onClick }, "点击按钮", 8 /* PROPS */, ["onClick"])]))
}

此时可以看到,编译后会带上一个值为 ‘8’ 的标记,意味着会被追踪

开启缓存后:

export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createBlock("div", null, [_createVNode("button", {onClick: _cache[1] || (_cache[1] = (...args) => (_ctx.onClick && _ctx.onClick(...args)))}, "点击按钮")]))
}

此时,已经没有了标记,不会再被追踪

4.ssr渲染

当有大量静态的内容时候,这些内容会被当做纯字符串推进一个buffer里面,即使存在动态的绑定,会通过模板插值嵌入进去。这样会比通过虚拟dmo来渲染的快上很多很多。
当静态内容大到一定量级时候,会用_ createStaticVNode方法在客户端去生成一个static node,这些静态node,会被直接innerHtml,就不需要创建对象,然后根据对象渲染。

Vue3.0系列(一): VUE3.0的新特性相关推荐

  1. MySQL 8.0 在关系数据库方面有这些新特性

    作者 | 捏造的信仰 原文 | https://segmentfault.com/a/1190000013803247 本文介绍几个 8.0 在关系数据库方面的主要新特性. 你可能已经知道 MySQL ...

  2. accept 返回0_从0开始理解Vite的主要新特性(一)

    此文已同步到公众号[因卓诶]以及因卓诶博客: 从0开始理解Vite的主要新特性(一) - 因卓诶-爱分享爱原创的技术博客 ~ 个人博客​www.yinzhuoei.com vite这个工具确实尤大在微 ...

  3. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

  4. Kafka 2.8.0 正式发布,增加了哪些新特性?

    导读:目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Storm.Sp ...

  5. Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)

    Redis6引入新的RESP3协议,并以此为基础加入了客户端缓存的新特性,在此特性下,大大提高了应用程序的响应速度,并降低了数据库的压力,本篇就带大家来看一下Redis6的新特性:客户端缓存. 目录 ...

  6. CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍

    一.MySQL 8.0新特性: 1.默认字符集由latin1变为utf8mb4 2.MyISAM系统表全部换成InnoDB表 3.自增主键AUTO_INCREMENT的值支持持久化 4.InnoDB表 ...

  7. 重磅!阿里云MongoDB 5.0发布,速来围观新特性

    简介:2021年9月29日下午,阿里云数据库与MongoDB共同发布了阿里云MongoDB 5.0.MongoDB于2021年7月中发布最新5.0版本,阿里云MongoDB率先跟进官方最新版本能力,快 ...

  8. php7.0 yield,PHP7中生成器的新特性 yield-from amp;amp; return-values

    生成器委托 简单地翻译官方文档的描述: PHP7中,通过生成器委托(yield from),可以将其他生成器.可迭代的对象.数组委托给外层生成器.外层的生成器会先顺序 yield 委托出来的值,然后继 ...

  9. C#8.0的两个有趣的新特性以及gRPC

    最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...

最新文章

  1. 如何配置三层交换机创建VLAN 2
  2. inet_ntop php,inet_ntop()
  3. Apache Ignite——集合分布式缓存、计算、存储的分布式框架
  4. python各种类型日期转换大全
  5. 面向对象编程语言中的接口(Interface)
  6. Spring详解(八)------事务管理
  7. 纽约时报》:乔布斯和苹果的“保密文化”
  8. 实用教程丨官方下载Oracle各版本安装软件及补丁包
  9. wscript.exe无法打开vbs_如何恶搞朋友的电脑?超简单的vbs代码
  10. bzoj1500: [NOI2005]维修数列
  11. 钱盾率先提出的“全流程屏障”究竟是怎样的一种能力?
  12. html标记语言 --超链接
  13. 【Django 2021年最新版教程28】前端模板中 时间日期星期格式化
  14. 涂抹oracle源代码,涂抹Oracle:三思笔记之一步一步学ORACLE
  15. c#登陆qq空间无视JS加密
  16. SQL练习(less-3)字符型注入 union联合查询
  17. 水果店开业朋友圈,水果店开业朋友圈宣传
  18. 英华特在创业板提交注册:拟募资约5亿元,股权结构较为分散
  19. 互联网虚拟大脑的结构全景图
  20. win10使用FFmpeg录屏/录音

热门文章

  1. 电脑知识:笔记本电脑边充电边用,对电池有损害吗?
  2. 大专java方向校招面试找工作知识点技术栈以及实习感受分享-简历分享
  3. 计算机软考科目众多 我们该如何选择考试科目?
  4. 【艾琪出品】《计算机应用基础》【试题汇总1】
  5. WHU 1572 Cyy and Fzz(AC自动机+dp)
  6. 戴尔Precision工作站 为元宇宙打造稳定高效创作基石
  7. python中使用matplotlib.pyplot画函数图像
  8. 3D 小游戏《欢乐贪吃龙》关键技术盘点 | Cocos 技术派第13期
  9. 服务器 与 工作站
  10. 查看Eclipse32位还是64位,查看JDK是32位还是64位