IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue3相比vue2效率提升在哪些方面? -> 正文阅读

[JavaScript知识库]vue3相比vue2效率提升在哪些方面?

vue3相比vue2效率提升在哪些方面?


静态提升

相比vue2,vue3对以下静态节点进行提升:

  1. 元素节点
  2. 没有绑定的动态内容
//vue2的静态节点
render(h){
	//直接render
	h('h1',null,'this is h1')
}

//vue3的静态节点
const hoisted = createdVNode('h1',null,'this is h1')
render(){
	//直接使用被提升的静态节点
}

通过打开vue3工程,可以看到起运行代码中包含着hoisted标记的变量,/*@__PURE__*/则告诉打包工具该函数是非dead code代码,如图:
图片演示
同时我们通过测试也可以发现,vue3里手写vnode可以缩小到如下三个属性,测试发现缺少shapeFlag并不能生效。

render() {
	return {
		"type": "h1",
		"children": "this is h1",
 		"shapeFlag": 9,
	}
 }
 

vue2的vnode和vue3有所区别,主要是某些属性的表述上有所差异,具体用法其实是一样的。

除了静态节点的提升,静态属性也是可以被提升的。

<div class="user">
	{{user.name}}
</div>

const hoisted = {
	class:'user'
}
function render(){
	createVNode('div',hoisted,user.name)
}

图片演示


预字符串化

实际开发中,一个组件实际上大多数东西是静态的,只有少数东西是使用变量。

<template>
	<div>
		<div>1</div>
		<div>2</div>
		<div>3</div>
		<div>4</div>
	</div>
	<div>{{ list }}</div>
</template>

vue2对于模板的处理是解析器parseHTML,通过标记和不断循环生成一个带有type、tag、attrsList、children等属性的对象,所以生成的vnode实际上是一棵包含了静态和动态的巨大树。

vue3对于静态节点会处理成字符串,该优化在ssr下的性能提升尤为明显。值得注意的是,目前vue3只会对连续的静态节点才会预字符串化,经过测试目前版本3.2.31当连续静态标签为5个时可以触发预字符串化。

<template>
  <div class="user">
    <ul>
      <li @click="msg++">add</li>
      <li>{{ msg }}</li>  
      <div>sogo</div>
      <li>hhhh</li>
      <li>hhhh</li>
      <li>
        <ul>
          <li>hhhh</li>
          <li>hhhh</li>
          <li>hhhh</li>
          <li>hhhh</li>
          <li>hhhh</li>
        </ul>
      </li>   
      <div><div>333</div></div>
      <li>{{ msg }}</li>
    </ul>
  </div>
</template>

图片演示


缓存事件处理函数

vue3认为事件的处理一般是不会变化的,所以其对事件处理函数进行缓存。

//vue2
render(ctx){
	return createVNode('button',{
		onClick:function($event){
			ctx.count++
		}
	})
}

//vue3
render(ctx,_cache){
	return createVNode('button',{
		onClick:cache[0] || (cache[0] = ($event) => ctx.count++)
	})
}

从图中的vue3工程可以看到click事件引入缓存处理。
图片演示


Block Tree

在vue2中,新旧树对比,很多时候会对新旧两颗树的相同静态节点进行多次对比。vue3优化了这一处理,其会在block tree的根节点记录该树的动态节点,直接跳过静态节点的对比。所以该处理不用深度遍历和广度遍历,在静态节点更多的情况下,其性能远远领先vue2的diff。

需要注意的是,该处理是基于树稳定的情况下,当该树的某一节点不稳定时,会将其拆为另一个block tree。


PatchFlag

vue2在新旧树对比时,需要对比属性是否变化,内容是否变化等,而vue3会通过patchFlag标记这些节点类型、节点属性、节点内容等,在新旧树对比中只对比某一属性。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:02:04  更:2022-03-17 22:05:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:07:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码