前端懒加载:提升页面性能的关键技术

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: 前端懒加载是一种优化网页加载速度的技术,通过延迟加载非首屏内容,减少初始加载时间,提高用户访问体验和页面性能。

一、引言

在前端开发中,随着网页内容的日益丰富,页面性能成为了一个至关重要的因素。懒加载(Lazy Loading)作为一种优化技术,能够有效地减少页面初始加载时的资源请求数量,提高页面的加载速度,从而提升用户体验。懒加载主要用于延迟加载页面中的非关键资源,如图片、视频、脚本等,直到这些资源真正需要被使用时才进行加载。本文将深入探讨前端懒加载的核心技术,包括懒加载的原理、实现方式、应用场景以及在不同类型资源中的具体应用。

二、懒加载的原理

  1. 视口(Viewport)概念
    • 视口是浏览器中用户可见的区域。懒加载技术依赖于对视口的监测,来判断资源是否进入了用户的可视范围。当一个资源(如图片)的位置进入视口或者接近视口时,浏览器才会发起对该资源的加载请求。
    • 例如,在一个具有大量图片的网页中,位于页面底部的图片在页面初始加载时并不在视口内,懒加载机制会避免这些图片的初始加载,从而节省了初始加载时间。
  2. 事件监听与资源加载触发
    • 懒加载通常通过监听滚动事件(scroll)或其他相关事件(如resize)来监测视口的变化。当用户滚动页面或者改变浏览器窗口大小时,事件处理函数会被触发,该函数会检查页面中的资源是否进入视口。
    • 一旦确定资源进入视口,就会通过修改资源元素(如img标签)的src属性(对于图片)或者执行脚本加载操作(对于JavaScript模块)来加载相应的资源。

三、懒加载的实现方式

(一)纯JavaScript实现

  1. 获取元素位置与视口信息
    • 首先需要获取资源元素(如图片)的位置信息和浏览器视口的大小信息。可以使用getBoundingClientRect()函数来获取元素相对于视口的位置。例如,对于一个img元素:
      const imgElement = document.getElementById('lazy-img');
      const rect = imgElement.getBoundingClientRect();
      
      AI 代码解读
    • 同时,可以通过window.innerWidthwindow.innerHeight获取视口的宽度和高度。
  2. 判断元素是否在视口内
    • 根据获取的元素位置和视口信息,判断元素是否进入视口。一个简单的判断方法是检查元素的顶部位置是否小于视口的底部位置(window.innerHeight)并且元素的底部位置是否大于视口的顶部位置(0)。例如:
      if (rect.top < window.innerHeight && rect.bottom > 0) {
             
      // 元素在视口内,加载图片
      imgElement.src = imgElement.dataset.src;
      }
      
      AI 代码解读
    • 这里假设img元素的真实src属性存储在data - src属性中,在元素进入视口时,将data - src的值赋给src来触发图片的加载。
  3. 添加滚动事件监听
    • 为了实时监测元素是否进入视口,需要添加滚动事件监听。例如:
      window.addEventListener('scroll', function () {
             
      const imgElements = document.querySelectorAll('[data - src]');
      imgElements.forEach(function (imgElement) {
             
         const rect = imgElement.getBoundingClientRect();
         if (rect.top < window.innerHeight && rect.bottom > 0) {
             
             imgElement.src = imgElement.dataset.src;
         }
      });
      });
      
      AI 代码解读
    • 这样,每当用户滚动页面时,都会检查所有带有data - src属性的img元素是否进入视口,并在进入视口时加载相应的图片。

(二)使用懒加载库

  1. 介绍常用懒加载库(以Lozad.js为例)
    • Lozad.js是一个轻量级的懒加载库,它提供了简单而强大的懒加载功能。使用Lozad.js可以大大简化懒加载的实现过程。
  2. Lozad.js的基本使用方法
    • 首先,在HTML文件中引入Lozad.js库:
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lozad.js/1.16.0/lozad.min.js"></script>
      
      AI 代码解读
    • 然后,对于需要懒加载的img元素,设置data - lozad属性:
      <img data - lozad="data - src: your - image - url.jpg">
      
      AI 代码解读
    • 最后,在JavaScript中初始化懒加载:
      const observer = lozad();
      observer.observe();
      
      AI 代码解读
    • Lozad.js会自动监测这些元素是否进入视口,并在适当的时候加载图片。它还支持一些高级功能,如自定义加载动画、加载失败处理等。

四、懒加载的应用场景

(一)图片懒加载

  1. 长页面中的图片
    • 在具有大量图片的长页面(如电商产品列表页、新闻资讯页面等)中,使用懒加载可以显著减少页面初始加载时的资源请求数量。例如,一个电商产品列表页可能有上百张产品图片,通过懒加载,只有用户滚动到相应位置时才会加载产品图片,这样可以加快页面的初始加载速度,提高用户体验。
  2. 图片幻灯片和轮播图
    • 对于图片幻灯片和轮播图,懒加载可以确保只有当前显示或即将显示的图片被加载。例如,在一个具有多个轮播图片的首页轮播组件中,初始时只加载第一张图片,当轮播到下一张图片时,再加载该图片,避免一次性加载所有轮播图片占用过多的资源。

(二)JavaScript模块懒加载

  1. 单页应用(SPA)中的路由组件
    • 在单页应用中,不同的路由对应不同的组件。通过懒加载路由组件,可以减少应用初始加载时的JavaScript代码量。例如,在一个SPA的管理后台应用中,有多个功能模块(如用户管理、订单管理等),每个模块对应的路由组件可以使用懒加载。当用户访问某个功能模块时,才加载相应的JavaScript代码,这样可以提高应用的初始加载速度,并且更好地利用浏览器缓存。
  2. 大型JavaScript库的部分加载
    • 对于一些大型的JavaScript库,可能只需要其中的部分功能。通过懒加载,可以只在需要时加载相应的功能模块。例如,一个包含多种图表类型的可视化库,用户可能在页面上只使用了柱状图,通过懒加载,可以避免加载其他图表类型(如折线图、饼图等)对应的代码,减少资源占用。

五、懒加载的注意事项

  1. SEO影响
    • 对于搜索引擎优化(SEO)来说,懒加载可能会产生一定的影响。搜索引擎爬虫可能无法识别懒加载的内容,因为它们通常不会像用户一样滚动页面来触发资源加载。为了解决这个问题,可以在页面的meta标签或者noscript标签中提供一些关键信息,或者采用服务器端渲染(SSR)技术来确保重要内容能够被搜索引擎识别。
  2. 性能优化的平衡
    • 虽然懒加载可以减少初始加载资源,但过度使用懒加载可能会导致页面在滚动过程中频繁加载资源,从而影响性能。在实际应用中,需要根据页面的具体情况和用户行为模式,合理地选择懒加载的资源和触发加载的时机,以达到最佳的性能优化效果。

六、总结

前端懒加载是一种非常有效的页面性能优化技术,通过延迟加载非关键资源,可以显著提高页面的加载速度和用户体验。无论是通过纯JavaScript实现还是使用懒加载库,开发者都可以根据项目的具体需求灵活运用懒加载技术。在应用懒加载时,需要考虑其对SEO的影响以及性能优化的平衡,确保懒加载技术能够真正发挥其优势,为前端开发中的页面性能提升做出贡献。

目录
打赏
1
7
7
3
209
分享
相关文章
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
207 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
59 14
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
155 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
95 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
2月前
|
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
68 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
126 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
173 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
70 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
56 0
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
474 14

数据库

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等