vue3 如何通过defer来优化减少白屏时间

Posted 10后程序员劝退师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue3 如何通过defer来优化减少白屏时间相关的知识,希望对你有一定的参考价值。

如果首屏加载的内容组件比较厚重或者数量大,那么第一次加载也会停顿很久。

可以通过控制台的Performence来观察render和loading的大致时间

优化的思路: 想让首屏页面的组件或者比较需要提前让用户看到的内容模块 优先放在第一帧来加载

加载时机:如果当前帧数时间大于 该模块的设定指定加载帧数时间,就让模块去加载

案例:目前通过大组件的案例来实践

<template>
    <div class="container">
        <div v-for="n in 100" :key="n">            //这里通过重复的大组件来实现效果 
            <heavyComp v-if="defer(n)"></heavyComp>  //当 defer 返回 true 代表组件加载的时机
        </div>
    </div>
</template>

<script setup>
import heavyComp from \'@/components/heavyComp.vue\'
import useDefer from \'@/utils/useDefer\'
const defer = useDefer(100)
</script>

<style lang="scss" scoped>
.container
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-gap: 1em;


</style>

创建一个useDefer 的hook函数

import  onUnmounted, ref, getCurrentInstance  from "vue"

export function useDefer(maxCount = 100)
    const frameCount = ref(0) //定义一个计数器变量,用于控制 defer 动画的次数,当为 0
    const instance = getCurrentInstance() //获取当前实例对象,可以是 vm 对象或自定义实例。这个对象包含了一些方法,用于控制动画。 (请参见该实例的方法) 创建 defer 动画时,将 frameCount.value 加 1 并将其写入到动画定时器中,每当该变量的值大于等于 1 时,将重新开始定时器,以便在定时器中计数。
    let rafId;
    function updateFrameCount() 
        rafId = requestAnimationFrame(() =>       //requestAnimationFrame来设置当前已经渲染到哪一帧了
            frameCount.value++
            if(frameCount.value >= maxCount)
                cancelAnimationFrame(rafId)
                return;
            
            updateFrameCount()
        )
    
    updateFrameCount();

    onUnmounted(() => 
        cancelAnimationFrame(rafId)
    , instance)

    return function defer(n)
        return frameCount.value >= n
    

 

面试题(35) vue 如何优化首页的加载速度?vue 首页白屏是什么问题引起的?如何解决呢?

白屏原因:


VUE首页加载过慢,其原因是因为它是一个单页应用,需要将所有需要的资源都下载到浏览器端并解析,所以当网速差的时候会产生一定程度的白屏


考虑解决办法

  • 1.使用首屏SSR + 跳转SPA方式来优化

  • 2.改单页应用为多页应用,需要修改webpack的entry

  • 3.改成多页以后使用应该使用prefetch的就使用

  • 4.处理加载的时间片,合理安排加载顺序,尽量不要有大面积空隙

  • 5.CDN资源还是很重要的,最好分开,也能减少一些不必要的资源损耗

  • 6.使用Quicklink,在网速好的时候 可以帮助你预加载页面资源

  • 7.骨架屏这种的用户体验的东西一定要上,最好借助stream先将这部分输出给浏览器解析

  • 8.合理使用web worker优化一些计算

  • 9.缓存一定要使用,但是请注意合理使用



以上是关于vue3 如何通过defer来优化减少白屏时间的主要内容,如果未能解决你的问题,请参考以下文章

前端优化-如何计算白屏和首屏时间

vue3 解决各场景 loading过度 ,避免白屏尴尬!

面试题(35) vue 如何优化首页的加载速度?vue 首页白屏是什么问题引起的?如何解决呢?

前端性能优化知识点汇总

小记vue项目打包优化

新项目理清思路