Vue 3.0 性能提升主要是通过哪几个方面体现的?

简介: 这篇文章你将了解 Vue 3.0 性能优化的三个方法:• 源码体积优化• 数据劫持优化• 编译优化


网络异常,图片无法展示
|


前言


如果是 Vue 的忠实er,会知道 Vue.js 2.x 已经是足够优秀的前端框架,并且性能也不错,但是在升级的 Vue 3.0 版本中,让这个性能更上一层楼,那 Vue3.0 性能又有了哪些方面的突破了?


Vue 3 与 Vue 2 相比:

  • 在 bundle 包大小方面(tree-shaking 减少了 41% 的体积)
  • 初始渲染速度方面(快了 55%)
  • 更新速度方面(快了 133%)
  • 内存占用方面(减少了 54%)


这篇文章你将了解 Vue 3.0 性能优化的三个方法:

  • 源码体积优化
  • 数据劫持优化
  • 编译优化


1. 源码体积优化


网络异常,图片无法展示
|

tree-shaking,它的原理很简单,tree-shaking 依赖 ES2015 模块语法的静态结构(即 import 和 export),通过编译阶段的静态分析,找到没有引入的模块并打上标记。利用 tree-shaking 技术,如果你在项目中没有引入无关的组件,那么它们对应的代码就不会打包,这样也就间接达到了减少项目引入的 Vue.js 包体积的目的。


Vue3.0 中最直接使用 tree-shaking 技术的一个例子,在 createApp 时会通过 ensureRenderer 创建渲染器对象,但是这里并不是直接创建渲染器对象,而是延时创建渲染器,目的是当用户只依赖响应式包的时候,可以通过 tree-shaking 移除核心渲染逻辑相关的代码。


2. 数据劫持优化


我们先来回忆一下,在 Vue 3.0 之前的数据劫持,Vue.js 1.x 和 Vue.js 2.x 内部都是通过 Object.defineProperty 这个 API 去劫持数据的 getter 和 setter,具体是这样的:


Object.defineProperty(data, 'x',{
  get(){
    // 收集
  },
  set(){
    // 更新
  }
})


核心就是 Object.defineProperty,其实 Vue.js 1.x 和 Vue.js 2.x 不支持 IE 8 及以下也是因为 Object.defineProperty 不支持。数据劫持是 Vue.js 区别于 React 的一大特色,Vue 框架中 DOM 是数据的一种映射,数据发生变化后可以自动更新 DOM,用户只需要专注于数据的修改,没有其余的心智负担。


在 Vue.js 3.0 使用了 Proxy API 做数据劫持,它是这样的:


observed = new Proxy(data, {
  get() {
    // 收集
  },
  set() {
    // 更新
  }
});


为什么替换 Object.defineProperty 到 Proxy


Object.defineProperty 和 Proxy 都可以进行数据的劫持,那为什么还要将 Object.defineProperty 替换为 Proxy 了。原因有两个:

网络异常,图片无法展示
|


Proxy 是如何解决 Object.defineProperty API 的缺陷

网络异常,图片无法展示
|


3. 编译优化


网络异常,图片无法展示
|


通过数据劫持和依赖收集,Vue.js 2.x 的数据更新并触发重新渲染的粒度是组件级的:


<template>
  <div id="content">
    <p class="text">1</p>
    <p class="text">2</p>
    <p class="text">3</p>
    <p class="text">{{message}}</p>
    <p class="text">4</p>
    <p class="text">5</p>
    <p class="text">6</p>
  </div>
</template>

网络异常,图片无法展示
|


虽然这段代码中只有一个动态节点,但在如果 message 发生改变,单个组件内部依然需要遍历该组件的整个 vnode 树,所以这里有很多 diff 和遍历其实都是不需要的,这就会导致 vnode 的性能跟模版大小正相关,跟动态节点的数量无关,当一些组件的整个模版内只有少量动态节点时,这些遍历都是性能的浪费。


Vue.js 3.0 做到了,它通过编译阶段对静态模板的分析,编译生成了 Block tree。Block tree 是一个将模版基于动态节点指令切割的嵌套区块,每个区块内部的节点结构是固定的,而且每个区块只需要以一个 Array 来追踪自身包含的动态节点。


借助 Block tree,Vue.js 将 vnode 更新性能由与模版整体大小相关提升为与动态内容的数量相关,这是一个非常大的性能突破。


网络异常,图片无法展示
|

除此之外,Vue.js 3.0 在编译阶段还包含了对 Slot 的编译优化、事件侦听函数的缓存优化,并且在运行时重写了 diff 算法。


参考


目录
相关文章
|
29天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
129 64
|
29天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
110 60
|
4天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
22 3
|
29天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
33 8
|
28天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
31 1
|
28天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
39 1
|
29天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
1月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
1月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
40 0
|
1月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
58 0

热门文章

最新文章