前端图片预加载和懒加载

本文详细介绍了图片预加载和懒加载的概念、实现方法,以及它们在不同场景下的应用,包括提升首屏体验、减少数据传输和优化移动端加载等方面。

前言

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

图片预加载

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

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

以下是一个简单的栗子:

function preloadImages(urls, allImagesLoadedCallback) {
  const imgs = [];
  const loadedCounter = [];
  urls.forEach((url, i) => {
    imgs[i] = new Image();
    // 处理加载计数器
    imgs[i].onload = imgs[i].onerror = () => {
      if (loadedCounter.length === urls.length) {
        allImagesLoadedCallback();
      }
    };
    imgs[i].src = url;
  });
}

preloadImages([
  'https://example.com/image1.png',
  'https://example.com/image2.png',
  'https://example.com/image3.png'
], () => {
  console.log('All images have been preloaded');
});

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

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

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

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

图片懒加载

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

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

参考文档:

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

 一个简单的实例:

const images = document.querySelectorAll('img[data-src]');  
  
const observer = new IntersectionObserver((entries, observer) => {  
    entries.forEach(entry => {  
        if (entry.isIntersecting) {  
            const img = entry.target;  
            const src = img.dataset.src;  
            img.src = src;  
            img.classList.remove('lazy');  
            observer.unobserve(img);  
        }  
    });  
});  
  
images.forEach(image => {  
    observer.observe(image);  
});

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

应用场景

图片预加载应用场景:

  1. 需要快速显示的关键图片:对于一些需要尽快展示的关键图片,如电商网站的产品主图、新闻门户网站的头版头条图片等,可以使用预加载技术,确保这些图片能够快速显示出来,提升首屏体验。
  2. 幻灯片、图片画廊等:在包含幻灯片或图片画廊的页面中,可以预加载相关的一些图片,使得用户切换时,下一张图片已经就绪,可以无延迟显示。
  3. 游戏等富媒体应用:游戏或者富媒体应用往往需要加载大量图片资源,可以在加载界面预加载部分关键资源,缩短真正进入应用的等待时间。
  4. 小型网站或单页面应用:对于页面数量较少、图片资源有限的小型网站或单页面应用,直接预加载所有图片也是可行的,方便后续无延迟加载。

图片懒加载应用场景:

  1. 图文内容丰富的页面:一些包含大量图文内容的页面,如新闻资讯、博客等,初始加载所有图片会拖慢页面速度。此时可使用懒加载,仅加载首屏图片,其他图片滚动到视口时再加载。
  2. 长列表或图库页面电商:详情、图片社交等页面往往包含大量图片列表,如果全部预加载会影响加载性能。使用懒加载可以只加载当前视口内的图片,提高加载速度。
  3. 移动端页面:移动端的网络环境往往不如桌面端稳定,也更加重视首屏加载速度。使用懒加载图片可以减少移动端首屏数据传输量,提升加载体验。
  4. 无限滚动的页面:对于无限滚动加载数据的页面,不可能一次性加载所有图片,此时必须采用懒加载策略。
### 懒加载的实现方式 懒加载的核心思想是延迟加载资源,直到用户真正需要时才进行加载。在前端开发中,最常见的懒加载方式是针对图片资源,但也可以扩展到其他类型的资源,如视频、脚本或模块。 1. **原生实现**: - 使用 `IntersectionObserver` API 是目前最推荐的方式,它可以在不阻塞主线程的情况下检测元素是否进入视口。 - 示例代码如下: ```javascript const images = document.querySelectorAll('img[data-src]'); const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; observer.unobserve(img); } }); }, { rootMargin: '0px 0px 200px 0px' }); // 提前加载视口下方200px的图片 images.forEach(img => observer.observe(img)); ``` 通过设置 `rootMargin`,可以在图片进入视口之前就开始加载,从而提升用户体验[^2]。 2. **框架集成**: - 在 Vue 或 React 等现代前端框架中,懒加载可以通过自定义指令或组件来实现。 - 例如,在 Vue 中,可以使用 `v-lazy` 指令来实现图片懒加载: ```vue <template> <img v-lazy="imageUrl" /> </template> ``` Vue 的 `v-lazy` 指令会自动处理图片的延迟加载,并且可以与 `IntersectionObserver` 结合使用以获得更好的性能表现。 3. **小程序实现**: - 在微信小程序等环境中,懒加载通常通过自定义组件或 API 实现。 - 例如,微信小程序提供了 `wx.createIntersectionObserver` 接口来监听元素是否进入视口,从而触发图片加载。 ### 预加载的实现方式 预加载是指在用户尚未请求某些资源时,提前将这些资源加载到浏览器缓存中。这样可以加快后续页面或组件的加载速度,提升用户体验。 1. **手动预加载**: - 可以使用 JavaScript 创建 `Image` 对象并设置其 `src` 属性来预加载图片。 - 示例代码如下: ```javascript const preloadImage = (url) => { const img = new Image(); img.src = url; }; preloadImage('https://example.com/image.jpg'); ``` 这种方法简单有效,适用于少量资源的预加载。 2. **使用 `<link rel="prefetch">` 或 `<link rel="preload">`**: - `<link rel="prefetch">` 用于预加载未来可能需要的资源,适用于跨页面的资源加载。 - `<link rel="preload">` 用于预加载当前页面所需的资源,确保这些资源尽早加载完成。 - 示例代码如下: ```html <link rel="prefetch" href="https://example.com/next-page.html" /> <link rel="preload" href="https://example.com/important-image.jpg" as="image" /> ``` 这些标签可以帮助浏览器更好地管理资源加载顺序,从而提升页面性能[^3]。 3. **框架库的支持**: - 在 React 中,可以使用 `useEffect` 钩子在组件挂载时预加载资源。 - 在 Vue 中,可以在 `mounted` 生命周期钩子中执行预加载逻辑。 - 此外,一些第三方库(如 `lazysizes`)也提供了预加载功能,能够根据用户的滚动行为智能地预加载即将进入视口的资源。 ### 应用场景 1. **懒加载的应用场景**: - **长页面或无限滚动页面**:对于包含大量图片或内容的页面(如社交媒体、电商平台),懒加载可以显著减少初始加载时间,提升用户体验。 - **移动端优化**:在移动设备上,网络带宽有限,懒加载可以帮助节省流量并加快页面加载速度。 - **低优先级资源**:对于页面中不立即可见的资源(如下方的图片或视频),懒加载可以避免不必要的资源请求。 2. **预加载的应用场景**: - **关键资源**:对于页面中必须立即显示的关键资源(如首屏图片、CSS、JavaScript 文件),预加载可以确保这些资源尽快加载完成。 - **用户即将访问的内容**:在用户可能点击的链接或即将进入的页面中,提前预加载相关资源可以减少后续加载的延迟。 - **静态资源优化**:对于静态资源(如字体、图标、样式表),预加载可以避免这些资源成为页面渲染的瓶颈。 ### 总结 懒加载预加载前端性能优化中两种互补的技术。懒加载通过延迟加载非关键资源,减少了初始加载时间服务器压力;而预加载则通过提前加载关键资源,提升了后续页面或组件的加载速度。开发者应根据具体的业务场景用户行为,灵活选择合适的加载策略,以实现最佳的性能优化效果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JacksonChen_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值