当前位置: 首页 > news >正文

骨架屏 (懒加载优化)

骨架屏 (懒加载优化)

  • 即便通过 Webpack 的按需加载CDN 静态资源缓存代码分割 等技术来减少首屏的代码体积,首屏加载时的白屏时间(也称为首屏等待时间)仍然可能存在,尤其在网络条件较差或页面内容复杂时,常见的解决方案是使用骨架屏技术,数据加载前的占位动画可以表示内容还在加载中.
  • 在这里插入图片描述
核心概念和实现思路
  • 使用 IntersectionObserver 进行懒加载

    • IntersectionObserver 用来监听目标元素是否进入视区(即视口)。当某个占位元素(如 divsection)进入视口时,才异步加载对应的组件。这种方式可以避免首屏加载时不必要的资源占用,提升页面加载速度。

    • 当组件加载完成后,可以根据需求决定是否需要销毁监听器,比如加载完成即销毁,或者离开视区后销毁。

  • 异步组件加载

    • 在 Vue 中,使用 () => import('component') 来进行异步加载。异步组件的加载是在用户需要时(通常是当组件进入视区时)才会加载,而不是在页面初始加载时。

    • 通过这种懒加载方式,我们可以极大提升首屏加载的性能,因为只有用户能看到的组件会优先加载。

  • 骨架屏

    • 在真实组件加载前,用骨架屏占位,提供一个与真实组件大小相近的占位元素,让用户感知页面在加载中,避免空白页面的出现。骨架屏可以是简单的 HTML 结构,如 <section />,并通过 CSS 渲染出类似加载动画的效果。
  • 内存泄漏防止

    • 在页面或组件销毁时,必须调用 IntersectionObserver.disconnect(),防止继续监听无用的元素,避免内存泄漏。
实现步骤
1. 使用 IntersectionObserver 和骨架屏
  • 通过骨架屏占位符和 IntersectionObserver 实现组件懒加载,先监听占位元素,进入视口时再加载真正的组件。 (注意下面的实现是 v-if,也可以用v-show)

  • 示例代码

  •  <template><div><!-- 占位元素 (骨架屏) --><section ref="observerTarget" class="skeleton-screen"><!-- 真实组件在可视区时才会懒加载 --><component v-if="isVisible" :is="lazyComponent" /></section></div></template>​<script>export default {data() {return {isVisible: false, // 组件是否可见lazyComponent: null // 懒加载的真实组件};},mounted() {this.createObserver();},beforeDestroy() {// 销毁时取消监听,防止内存泄漏if (this.observer) {this.observer.disconnect();}},methods: {createObserver() {const observerOptions = {root: null, // 默认是视口threshold: 0.1 // 目标元素至少可见 10% 时触发};​this.observer = new IntersectionObserver((entries) => {entries.forEach((entry) => {if (entry.isIntersecting) {// 当目标元素进入可视区时,加载真实组件this.loadComponent();// 加载完成后销毁观察器this.observer.disconnect();}});}, observerOptions);​// 观察占位符骨架屏this.observer.observe(this.$refs.observerTarget);},loadComponent() {// 使用异步组件加载实际组件this.lazyComponent = () => import('./LazyLoadedComponent.vue');this.isVisible = true; // 组件可见}}};</script>​<style>.skeleton-screen {width: 100%;height: 200px;background-color: #eee; /* 骨架屏的占位效果 */}</style>
    
  • 要点说明:
    • 骨架屏<section ref="observerTarget" class="skeleton-screen"> 用作骨架屏,占位在实际组件加载之前。
    • IntersectionObserver:通过 IntersectionObserver 监听目标元素,当元素进入视区时加载真实组件并销毁观察器。
    • 异步组件加载this.lazyComponent = () => import('./LazyLoadedComponent.vue'); 在实际需要时才加载组件。
  • 注意点
    • 内存管理:一定要在组件销毁时调用 disconnect() 释放 IntersectionObserver,否则可能导致内存泄漏。
    • 异步组件加载的性能:异步组件加载可以显著减少首屏资源的消耗,但如果过度使用,可能会增加页面的延迟。确保只在必要时使用懒加载。

http://www.mrgr.cn/news/42324.html

相关文章:

  • 1.9 物理层设备
  • 高性能防静电主轴4033 AC-ESD 在线路板切割中的非凡表现
  • Java定时器的使用与实际应用场景
  • 淡水鱼目标检测数据集 31类 2900张 鱼数据集带标注 voc yolo
  • Java中的对象比较:Comparator与Comparable的最佳实践
  • Bootstrap 4 导航栏:构建响应式和现代的网页导航
  • SQL专项练习第一天
  • wpa_cli支持EAP-AKA认证运行设计
  • XHTML 简介
  • java 编译失败 内部 java 编译器错误
  • 螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习06(Docker网络连接)
  • Java | Leetcode Java题解之第454题四数相加II
  • 读数据湖仓06数据集成
  • 疾风气象大模型如何预测气象数据,预测数据怎么获得
  • JavaWeb——Vue组件库Element(5/6):案例:组件实现(概述、Form表单、Table表格、Pagination 分页、效果展示、完整代码)
  • iframe标签是做什么用的
  • 《向量数据库指南》——Mlivus Cloud:优惠大放送,向量数据库新体验
  • Spring框架使用Api接口实现AOP的切面编程、两种方式的程序示例以及Java各数据类型及基本数据类型的默认值/最大值/最小值列表
  • C语言 | Leetcode C语言题解之第455题分发饼干
  • Python练习2