vue白屏优化(defer)

简介: 说到VUE项目优化,老生常谈的一个话题,就是首页白屏问题,当然造成白屏的原因有很多,我们要根据不同的情况灵活的进行处理,在这呢我单单指出其中一种使用场景,以及其中一种优化手段,这种优化手段比较冷门,相信很多同学都不一定知道,但是超级好用!!!这种经典的优化方案,只是vue优化里的冰山一角,希望大家一起学习,共同进步。

VUE使用defer优化白屏



前言

说到VUE项目优化,老生常谈的一个话题,就是首页白屏问题,当然造成白屏的原因有很多,我们要根据不同的情况灵活的进行处理,在这呢我单单指出其中一种使用场景,以及其中一种优化手段,这种优化手段比较冷门,相信很多同学都不一定知道,但是超级好用!!!


一、场景复现?

    我这里导入了一个组件,组件里加载了一千张小图标,循环了20次,每循环一次,重新渲染一次组件,页面加载的时候很明显会出现一个白屏时间。这种页面有很多元素,特别是大屏展示一类元素密集的页面总加载时间就会更长。

<template>
  <div class="hell"  v-for="index of 20">
    <HelloWorld
      :key="index"
      class="hell"
    />
  </div>
</template>
运行以上代码会发现页面有长时间的白屏,然后在一次性的把页面显示出来,使用谷歌浏览器的调试工具集进行录制进行性能分析得到以下分析结果,从图里可以看到总耗时四秒多,其中三秒时间都在进行js的执行,这样的页面对于用户而言,是完全无法接受的,那么如何进行优化呢。

在这里插入图片描述

二、主要思路

让组件一部分一部分按批次渲染

    既然一起渲染浏览器压力太大了,那就想办法分摊压力,先渲染其中一部分,保证让用户能够看得到,然后再持续渲染剩下的部分,虽然总的时间不会有太大变化,甚至还有可能会增加,但是对于用户的感知而言,从用户打开页面到第一次看见页面视图这一段时间是大幅度的缩减了。

三、具体代码

代码如下(示例):

<template>
  <div class="hell"  v-for="index of 20">
    <HelloWorld v-if='defer(n)'
      :key="index"
      class="hell"
    />
  </div>
</template>
    页面渲染时间线被分成了很多小时间段,每16毫秒渲染一次,defer(n)表达的是目前渲染的帧数有没有超过n,比方说n传的20,表达的意思就是当渲染帧到达第一帧的时候defer(n)返回false,第二帧第三帧都是,直到到达第20帧的时候返回true,由于使用的v-if这个时候这个组件就会渲染显示出来。

函数封装

export function defer(maxFrameCount = 1000) {
    const frameCount = ref(0);
    const refreshFrameCount = () => {
        requestAnimationFrame(() => {
            frameCount.value++;//计数帧数加一
            if (frameCount.value < maxFrameCount) {
                refreshFrameCount();//只要没到最大帧数就一直持续调用函数
            }
        });
    };
    refreshFrameCount();
    return function (showInframeCoount) {
        return frameCount.value >= showInframeCoount;//判断当前渲染帧数又是否大于自定义n
    }
}

虽然总体时间变化不大,但是从页面加载到用户第一次看到页面的时间大大缩短,再次分析可以看见渲染过程变成了一块一块一帧一帧渲染,避免了页面长时间白屏卡顿,每一次渲染,用户都能看到渲染结果,有点类似react的fiber,骑士都是同样的道理。
请添加图片描述

总结

这种经典的优化方案,只是vue优化里的冰山一角,希望大家一起学习,共同进步

目录
相关文章
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
28天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
28天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
28天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
23 1
|
25天前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
27 1
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
25天前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能