从0开始学习JavaScript--JavaScript 懒加载和预加载

懒加载和预加载是前端性能优化中的两大利器,它们可以显著改善页面加载速度和用户体验。本文将深入探讨懒加载和预加载的核心概念、实现方式以及在实际应用中的丰富示例。

懒加载(Lazy Loading)的基本概念

懒加载是指在页面初次加载时,只加载当前视窗内可见区域的内容,而延迟加载其他部分,直到用户滚动页面或触发特定事件时再加载。这种方式有效减少初始页面加载时间,提高用户体验。

1. 图片懒加载

图片懒加载是懒加载的经典应用之一。通过将图片的 src 属性设置为占位符或空字符串,再通过 JavaScript 动态设置真实图片地址,实现图片在需要时才加载的效果。

<img data-src="lazy-image.jpg" alt="Lazy-loaded Image" class="lazy-image">
document.addEventListener('DOMContentLoaded', function() {
  const lazyImages = document.querySelectorAll('.lazy-image');

  const lazyLoad = function() {
    lazyImages.forEach(image => {
      if (image.getBoundingClientRect().top < window.innerHeight && !image.src) {
        image.src = image.dataset.src;
      }
    });
  };

  document.addEventListener('scroll', lazyLoad);
  window.addEventListener('resize', lazyLoad);
});

2. 懒加载框架

懒加载框架如 Intersection Observer 提供了更灵活的方式来监测元素是否进入视窗。

document.addEventListener('DOMContentLoaded', function() {
  const lazyImages = document.querySelectorAll('.lazy-image');

  const lazyLoad = function(entries) {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const image = entry.target;
        image.src = image.dataset.src;
        observer.unobserve(image);
      }
    });
  };

  const observer = new IntersectionObserver(lazyLoad, { rootMargin: '0px 0px 200px 0px' });

  lazyImages.forEach(image => observer.observe(image));
});

预加载(Preloading)的基本概念

预加载是指在用户实际需要资源之前提前加载这些资源,以缩短用户等待时间。这种方式适用于预测用户行为,提前加载可能会用到的资源。

1. 图片预加载

图片预加载可以通过创建 Image 对象,并设置 src 属性来实现。这样在用户需要查看图片时,已经在缓存中加载完成,提升用户体验。

const image = new Image();
image.src = 'preloaded-image.jpg';

2. 预加载整个页面

预加载整个页面的所有资源,包括样式表、脚本和图片,以确保在用户进行导航时,所需的资源已经在缓存中。

<link rel="preload" href="styles.css" as="style">
<link rel="preload" href="script.js" as="script">
<link rel="preload" href="preloaded-image.jpg" as="image">

懒加载和预加载的综合应用

实际应用中,懒加载和预加载常常结合使用,以最大程度地提高页面性能。例如,在一个包含很多图片的页面中,可以使用懒加载确保仅加载当前可见区域的图片,同时使用预加载提前加载下一屏可能需要的图片。

<img data-src="lazy-image1.jpg" alt="Lazy-loaded Image 1" class="lazy-image">
<img data-src="lazy-image2.jpg" alt="Lazy-loaded Image 2" class="lazy-image">
<!-- more lazy images -->

<link rel="preload" href="next-page-image1.jpg" as="image">
<link rel="preload" href="next-page-image2.jpg" as="image">
<!-- more preloaded images -->

<script>
  // Lazy loading logic
  // ...

  // Preloading logic
  const preloadedImages = ['next-page-image1.jpg', 'next-page-image2.jpg'];
  preloadedImages.forEach(src => {
    const image = new Image();
    image.src = src;
  });
</script>

懒加载和预加载的高级应用

1. 图片懒加载的渐进式加载

渐进式加载是一种更高级的图片加载技术,它允许图片在加载时按照分辨率逐步清晰显示,提升用户感知体验。

<img
  data-src="image-500.jpg"
  data-srcset="image-500.jpg 500w,
               image-800.jpg 800w,
               image-1200.jpg 1200w"
  sizes="(max-width: 500px) 100vw, (max-width: 800px) 80vw, 1200px"
  alt="Progressive Lazy-loaded Image"
  class="lazy-image"
/>
document.addEventListener('DOMContentLoaded', function() {
  const lazyImages = document.querySelectorAll('.lazy-image');

  const lazyLoad = function(entries) {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const image = entry.target;
        image.srcset = image.dataset.srcset;
        image.src = image.dataset.src;
        observer.unobserve(image);
      }
    });
  };

  const observer = new IntersectionObserver(lazyLoad, { rootMargin: '0px 0px 200px 0px' });

  lazyImages.forEach(image => observer.observe(image));
});

2. 动态资源加载

在某些情况下,页面上的资源可能是动态生成的,这时可以使用动态加载的方式,根据用户行为或特定条件加载所需资源。

const button = document.getElementById('load-button');

button.addEventListener('click', function() {
  // 动态加载脚本
  const script = document.createElement('script');
  script.src = 'dynamic-script.js';
  document.body.appendChild(script);

  // 动态加载样式表
  const link = document.createElement('link');
  link.rel = 'stylesheet';
  link.href = 'dynamic-style.css';
  document.head.appendChild(link);

  // 动态加载图片
  const image = new Image();
  image.src = 'dynamic-image.jpg';
  document.body.appendChild(image);
});

3. 预加载字体

在某些项目中,使用了特定的字体,为了避免在用户浏览时才加载字体而导致 FOUC(Flash Of Unstyled Content),可以使用预加载字体。

<link rel="preload" href="custom-font.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<style>
  body {
    font-family: 'CustomFont', sans-serif;
  }
</style>

懒加载和预加载的性能优化

  1. 资源合并: 将多个小图片合并成雪碧图,或将多个小样式表和脚本合并成一个文件,减少请求次数。
  2. 资源压缩: 对图片、样式表、脚本等进行压缩,减小文件大小,提高加载速度。
  3. CDN 加速: 使用内容分发网络(CDN)来加速资源的加载,将资源分布到全球各地的节点,提高访问速度。

总结

懒加载和预加载是前端性能优化的关键策略之一,通过巧妙地加载资源,提高了页面加载速度和用户体验。本文深入研究了懒加载和预加载的高级应用,包括图片懒加载的渐进式加载、动态资源加载、预加载字体等方面。

在实际应用中,需要根据项目的具体情况选择适当的加载策略,并结合其他性能优化手段,如资源合并、资源压缩、CDN 加速等,以达到最佳的性能效果。

希望本文可以让大家在前端项目中更加全面地应用懒加载和预加载提供了有益的指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/207031.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用OpenCV转换图像并创建视频,实现Ken Burns特效

一、Ken Burns特效 当使用OpenCV时,最常使用的是图像,但是我们也可以多个图像创建动画,通过引入时间轴更容易可视化。 Ken Burns特效这是一种以电影制片人肯伯恩斯 (Ken Burns) 命名的平移和缩放技术,Ken Burns 效果不是在屏幕上显示大型静态照片,而是裁剪细节,然后平移图…

03-IDEA集成Git,初始化本地库,添加远程仓库,提交,拉取,推送,分支的快捷操作

IDEA集成Git 创建Git忽略文件 不同的IDE开发工具有不同的特点文件,这些文件与项目的实际功能无关且不参与服务器上的部署运行, 把它们忽略掉能够屏蔽之间的差异 局部忽略配置文件: 在本地仓库的根目录即项目根目录下直接创建.gitignore文件, 以文件后缀或目录名的方式忽略指定…

6、单片机与AT24C02的通讯(IIC)实验(STM32F407)

IIC简介 I2C(IIC,Inter&#xff0d;Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线&#xff0c;可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送&#xff0c;高速IIC总线一般可达…

力扣6.N字形变换

题目描述 思路 模拟轨迹&#xff0c;每当行数i到最顶&#xff08;0&#xff09;&#xff0c;或者最底&#xff08;numRows&#xff09;的时候&#xff0c;就会反方向走。 用flag来标记方向&#xff0c;在题解里看到&#xff0c;真的很巧妙5555&#xff01; 代码 class Solu…

【计算机组成原理】指令系统

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理计算机组成原理中 指令系统的知识点和值得注意的地方 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以…

Python-docx 深入word源码 自定义页码页脚以动态显示总页数和当前页数

代码和效果图 先上能够正常显示页码页脚的Python代码和效果图&#xff0c;之后再解释原理和思路 from docx import Document from docx.shared import Pt from docx.oxml import OxmlElement from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn…

mysql区分大小写吗

mysql在windows下默认是不区分大小写的&#xff0c;在linux下默认是区分大小写的。 所以&#xff0c;为了避免出问题&#xff0c;许多公司的数据库编程规范中明确规定&#xff1a;库名、表名、列名、索引名一律小写&#xff0c;不同单词之间以下划线分割&#xff0c;且控制在3…

深入探究Photoshop图像修复与润饰技巧

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在Photoshop中&#xff0c;图像修复和润饰是强…

用HeidiSQL在MySQL中新建用户

用HeidiSQL登录到MySQL数据库&#xff0c;注意登录的时候要使用有权限的用户&#xff1a; 选择工具-》用户管理&#xff1a; 点击左上角的“添加”&#xff1a; 输入用户名、密码&#xff0c;并且分配权限&#xff1a; 点击右边的“添加对象”&#xff1a; 可以根据自己…

【WebSocket】通信协议基于 node 的简单实践和心跳机制和断线重连的实现

前后端 WebSocket 连接 阮一峰大佬 WebSocket 技术博客 H5 中提供的 WebSocket 协议是基于 TCP 的全双工传输协议。它属于应用层协议&#xff0c;并复用 HTTP 的握手通道。它只需要一次握手就可以创建持久性的连接。 那么什么是全双工呢&#xff1f; 全双工是计算机网络中的…

台灯显色指数多少好?最适合学生的护眼台灯推荐

世界卫生组织最新研究报告显示&#xff0c;2020年全球近视患者约为25亿&#xff0c;其中中国近视人数达6亿&#xff0c;青少年近视率已高居世界第一&#xff0c;且呈现出发病年龄小、发病率高、近视度数深的特点。一款好用的护眼台灯&#xff0c;可以有效的预防近视&#xff0c…

JTAG下载配置

JTAG除了用FT232HL外&#xff0c;还有没有经济一点的方案? 功能验证完以后。投板不用再需要焊接FT232HL这个器件了。可以通过SD卡升级到FLASH或者EMMC。开发一个板子可以不用EMMC且不用SD卡且不用串口。直接就设计上去&#xff0c;如果批量的就不再焊接。 这个USB口是JTAG&a…

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日&#xff0c;第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕&#xff0c;本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会&#xff08;筹&#xff09;主办&#xff0c…

Linux:docker的数据管理(6)

数据管理操作*方便查看容器内产生的数据 *多容器间实现数据共享 两种管理方式数据卷 数据卷容器 1.数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中&#xff0c;可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻可见&#xff0c;并且更新数…

Apache Flink(四):Flink 其他实时计算框架对比

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

用高性价比CRM系统,轻松管理复杂的销售流程

对于中小企业来说&#xff0c;选型CRM系统的重点便是性价比。中小企业预算有限&#xff0c;要在满足需求的前提下选择符合预算的CRM系统。那么&#xff0c;有没有性价比高的CRM系统&#xff1f;Zoho CRM就很不错哦。 Zoho CRM是一款SaaS云端CRM客户管理系统&#xff0c;多次荣…

4D雷达目标检测跟踪算法设计

1.算法流程 4D雷达点云跟踪处理沿用3D毫米波雷达的处理流程&#xff0c;如下图&#xff1a; 从接收到点云开始&#xff0c;先对点云做标定、坐标转换、噪点剔除、动静分离&#xff0c;再分别对动态目标和静态目标做聚类&#xff0c;然后根据聚类结果做目标的特征分析和检测等&a…

Vue3-数据交互请求工具设计

1.安装axios pnpm add axios 2.利用axios.create创建一个自定义的axios来使用 参考官网&#xff1a;axios中文文档|axios中文网 | axios 在src/utils文件夹下新建request.js&#xff0c;封装axios模块 import axios from axios const baseURL const instance axios.creat…

2023.11.12 阿里云产品全线故障

阿里云 11.12 故障原因曝光&#xff1a;访问密钥服务 (Access Key) 异常 (baidu.com) 故障原因竟然是因为生成白名单代码逻辑缺陷。

TP4056是一款单节锂离子电池恒流/恒压线性充电器IC

TP4056 1A 锂电池充电器 概述: TP4056 是一款单节锂离子电池恒流 / 恒压线性充电器 , 采用底部带散热片的ESOP-8L封装以及简单的外部应用电路&#xff0c;非常适合便携式设备应用,适合USB电源和适配器电源工作,内部采用防倒充电路&#xff0c;不需要外部隔离二极管。热反馈可对…