2023-03-20 【总结:常见性能优化(一)】对于vue项目你有哪些常见的优化的方案?—— 在Vue代码层面对Vue项目进行优化

本文总结了Vue项目中的代码层面优化技巧,包括v-if与v-show的适配、computed与watch的选择、v-for的key策略、数据劫持优化、事件销毁、懒加载、路由懒加载、按需引入插件、服务器渲染(SSR)及其优缺点,旨在提升Vue项目的性能和首屏加载速度。
摘要由CSDN通过智能技术生成

零.前言

Vue框架通过数据双向绑定和虚拟DOM技术,可以让开发者无需考虑大量的DOM操作,
但是Vue项目中仍可以对项目进行首屏优化,webpack编译配置优化等问题
大致可以分为三个层面的优化:

  • vue代码层面
  • wrbpack配置层面
  • 基础的web技术层面

一.在Vue代码层面对Vue项目进行优化

1.分场景使用v-if和v-show
面试题:v-if和v-show的区别?

两者都可以控制DOM元素的显示和隐藏,
区别是v-if是通过创建和销毁节点来控制渲染的,而v-show是在css层面控制节点的display值来使节点显示和隐藏的

使用场景

v-if适用于运行时很少改变条件,不需要频繁切换条件的场景
v-show适用于需要频繁切换条件的场景

2.分场景使用computed和watch
面试题:computed和watch的区别?

computed是计算属性,依赖其他的属性值,
computed的值有缓存.只有它依赖的属性值发生改变时,下一次获取computed的值才会重新计算其值

而watch是监听属性,每当监听的数据变化时都会执行回调进行后续操作
watch没有缓存

使用场景

computed适用于需要进行数值计算且依赖于其他数据的场景,这样可以利用其缓存特性,避免每次获取值时都要重新计算
watch适用于需要在数据变化时执行异步或者开销较大的操作的场景,watch可以做到computed无法做到的操作,即执行异步操作,并在获取异步操作的结果前设置中间态,限制我们执行该操作的频率

3.为v-for添加数组的item作为key值,并避免同时使用v-if
面试题:v-for为什么要添加key?

v-for中添加key可以让每个循环出来的DOM添加唯一标识,从而高效地更新虚拟DOM,
可以快速找到节点,减少渲染次数,提高渲染性能

面试题:v-for为什么要使用数组的item作为key而不是index?
1.不加key的时候,每次操作DOM都会重新销毁和生成新DOM,这样会使性能消耗极大,
2.而加的key如果不是唯一标识(比如使用的是index而不是item),

则会导致内部复用错误的组件和DOM
3.添加正确的key后,由于vue的源码是内部数据驱动,通过改变数据来改变视图,
加上key之后,更容易定位到相应的元素,避免遍历DOM造成的性能消耗

在列表数据进行遍历渲染时,需要为每一项 item 设置唯一 key 值,
方便 Vue.js 内部机制精准找到该条列表数据。
当 state 更新时,新的状态值和旧的状态值对比,较快地定位到 diff 。
面试题:v-for和v-if的优先级哪个更高?

v-for 比 v-if 优先级高,如果每一次都需要遍历整个数组,将会影响速度,
尤其是:当仅仅需要渲染很小一部分DOM时,应替换成 computed 属性。
因此,v-for 遍历的时候应避免同时使用 v-if

4.仅仅用于数据展示的组件不让其被vue数据劫持
面试题:vue实现双向数据绑定的原理是什么?

Vue通过数据劫持,结合"订阅者-发布者"模式,通过Object.defineProperty()劫持vue实例的getter和setter,
当数据发生变动时,发布消息给订阅者,触发相应的监听回调来渲染视图

修改数组或者对象但视图层没有同步更新的原因是什么?以及解决方法是什么?
原因

vue实例被创建后,无法检测到对象属性的新增和删除,
只能追踪到数据是否被修改,因为Object.defineProperty()只能劫持对象的属性

解决方法
  • vue2提供给所有示例一个全局方法this.$forceUpdate(),可以让算法重新计算和更新页面
  • vue3实现数据双向绑定是通过 Proxy
优化:通过Object.freeze()来冻结对象,以vue劫持数据,减少组件初始化的时间

组件仅仅用于数据展示,而不需要进行任何改变时,
不需让vue劫持数据,这样可以明显减少组件初始化的时间
方法:Object.freeze冻结一个对象,冻结后的对象将无法被修改

export default {
   
  data
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值