前端图片预加载和懒加载

前言

在说到对图片资源进行优化时,那就不得不提到图片预加载和图片懒加载,可能很多朋友都了解这两者,但是一直没有很清晰的概念,以及什么时候用,用在什么场景下,今天就来详细的了解一下吧!

图片预加载

图片预加载是指在页面加载时,提前加载页面中需要使用的图片资源,将它们缓存在浏览器中。

这样当用户需要查看这些图片时,就可以直接从缓存中获取,减少等待时间,提升用户体验

以下是一个简单的栗子:


   
   
  1. function preloadImages( urls, allImagesLoadedCallback) {
  2. const imgs = [];
  3. const loadedCounter = [];
  4. urls. forEach( (url, i) => {
  5. imgs[i] = new Image();
  6. // 处理加载计数器
  7. imgs[i]. onload = imgs[i]. onerror = () => {
  8. if (loadedCounter. length === urls. length) {
  9. allImagesLoadedCallback();
  10. }
  11. };
  12. imgs[i]. src = url;
  13. });
  14. }
  15. preloadImages([
  16. 'https://example.com/image1.png',
  17. 'https://example.com/image2.png',
  18. 'https://example.com/image3.png'
  19. ], () => {
  20. console. log( 'All images have been preloaded');
  21. });

预加载图片:通过 JS 创建 Image 对象,设置其 src 属性为要预加载的图片URL,浏览器会自动下载这些图片资源并缓存在本地。

从缓存获取图片:当页面需要展示这些预加载的图片时,浏览器可以直接从本地磁盘缓存中读取图片数据,不需要再次向服务器发起请求下载图片。

从缓存中获取图片数据比从远程服务器下载要快得多,因为:

  • 无需再次建立网络连接
  • 无需等待服务器响应
  • 无需传输数据的延迟

图片懒加载

图片懒加载是一种在页面滚动到图片位置时才加载图片的技术。这样可以减少页面初始加载时的数据量,加快页面加载速度。当用户滚动到图片位置时,再动态加载并显示图片。

使用Intersection Observer API:这是一个原生浏览器API,用于异步观察目标元素与其祖先元素或顶级文档视口的交叉状态。当目标元素进入视口时,可以触发回调函数来加载图片。

参考文档:

IntersectionObserver - Web API 接口参考 | MDN (mozilla.org)

 一个简单的实例:


   
   
  1. const images = document. querySelectorAll( 'img[data-src]');
  2. const observer = new IntersectionObserver( (entries, observer) => {
  3. entries. forEach( entry => {
  4. if (entry. isIntersecting) {
  5. const img = entry. target;
  6. const src = img. dataset. src;
  7. img. src = src;
  8. img. classList. remove( 'lazy');
  9. observer. unobserve(img);
  10. }
  11. });
  12. });
  13. images. forEach( image => {
  14. observer. observe(image);
  15. });

我们为所有带有data-src属性的图片元素设置了一个Intersection Observer。当图片进入视口时,我们从data-src属性中获取实际的图片URL,并将其设置为图片的src属性,从而触发图片的加载。

应用场景

图片预加载应用场景:
  1. 需要快速显示的关键图片:对于一些需要尽快展示的关键图片,如电商网站的产品主图、新闻门户网站的头版头条图片等,可以使用预加载技术,确保这些图片能够快速显示出来,提升首屏体验。
  2. 幻灯片、图片画廊等:在包含幻灯片或图片画廊的页面中,可以预加载相关的一些图片,使得用户切换时,下一张图片已经就绪,可以无延迟显示。
  3. 游戏等富媒体应用:游戏或者富媒体应用往往需要加载大量图片资源,可以在加载界面预加载部分关键资源,缩短真正进入应用的等待时间。
  4. 小型网站或单页面应用:对于页面数量较少、图片资源有限的小型网站或单页面应用,直接预加载所有图片也是可行的,方便后续无延迟加载。
图片懒加载应用场景:
  1. 图文内容丰富的页面:一些包含大量图文内容的页面,如新闻资讯、博客等,初始加载所有图片会拖慢页面速度。此时可使用懒加载,仅加载首屏图片,其他图片滚动到视口时再加载。
  2. 长列表或图库页面电商:详情、图片社交等页面往往包含大量图片列表,如果全部预加载会影响加载性能。使用懒加载可以只加载当前视口内的图片,提高加载速度。
  3. 移动端页面:移动端的网络环境往往不如桌面端稳定,也更加重视首屏加载速度。使用懒加载图片可以减少移动端首屏数据传输量,提升加载体验。
  4. 无限滚动的页面:对于无限滚动加载数据的页面,不可能一次性加载所有图片,此时必须采用懒加载策略。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端图片懒加载(Image Lazy Loading)和路由懒加载(Route Lazy Loading)是两种不同的优化技术,用于提高用户体验和网站性能。 1. **图片懒加载**: - 图片懒加载是一种延迟加载策略,当用户滚动到图片所在位置时才加载图片,而不是在页面加载初期就全部加载。这有助于减少初始页面加载时间,尤其是在内容较多或图片数量较大的情况下。 - 常见实现方式包括使用Intersection Observer API(Intersection Observer API是一个浏览器原生API,用于检测元素是否进入视口),或者利用HTML的`<img>`标签的`srcset`和`loading`属性,如`loading="lazy"`。 - 相关问题: 1. 如何使用Intersection Observer API实现懒加载? 2. `srcset`和`loading="lazy"`如何协同工作? 3. 图片懒加载对SEO有影响吗? 2. **路由懒加载**: - 路由懒加载是针对单页应用(SPA)的一种优化,只在用户导航到特定路由时才加载该路由对应的组件或模块,而不是一开始就下载所有可能的页面内容。 - 这通常在服务器端渲染(SSR)、动态导入(Dynamic Import)或路由加载(Preloading)时使用,比如React的`import()`函数或Vue的`require()`。 - 相关问题: 1. 如何在Vue中实现路由懒加载? 2. SSR和路由懒加载有什么区别? 3. 使用动态导入时如何处理异步依赖? 两者都是前端性能优化的重要手段,可以帮助提高网页的加载速度和用户交互体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值