web性能优化之延迟加载图片和<inframe>

这篇文章同样来自 Google 的 web.dev 平台,紧接上一篇 JavaScript 代码拆分的内容。这次的核心主题是 "如何延迟加载(Lazy Loading)图片和 <iframe> 元素,以优化网页的初始加载速度和交互性能"

简单来说,它讲解了如何避免让用户在刚打开网页时,就去下载那些"在屏幕外面、还没被看到"的重度资源。

以下是这篇文章的详细核心内容拆解:

1. 核心痛点:为什么图片和 <iframe> 需要延迟加载?

  • 图片占用带宽 :图片通常是网页中体积最大的资源。如果一开始就下载所有图片,会和网页中更关键的资源(如 CSS、核心 JS)争抢网络带宽,从而拖慢 LCP(最大内容绘制) 指标。
  • <iframe> 拖慢性能<iframe>(如嵌入的 YouTube 视频、社交媒体帖子、聊天插件)本质上是一个完整的、独立的网页,包含大量的子资源(尤其是大量的 JavaScript)。它们会极大地消耗 CPU,阻塞主线程,导致网页卡顿,恶化 INP(与下次绘制的互动时间) 指标。

2. 原生延迟加载:loading="lazy"

现代浏览器已经原生支持了延迟加载属性,不需要额外编写 JavaScript 代码

  • 使用方法 :直接在 <img><iframe> 标签上添加 loading="lazy"
  • 工作原理:浏览器会自动判断,只有当该元素快要滚动到用户的可视区域(视口)时,才会开始下载它。
  • 致命误区(不要滥用)千万不要对首屏(初始视口内)的图片使用 loading="lazy" !特别是网页最上方的横幅大图(LCP 候选对象)。如果加了,图片必须等待浏览器解析完所有 CSS 并完成布局后才会下载,这会严重推迟图片的显示时间,导致首屏变慢。

3. 高级优化技巧:"外墙"模式(Facades)

对于极其沉重的第三方嵌入内容(如 YouTube 视频播放器、在线客服聊天弹窗),即使用了 loading="lazy",一旦用户滚动到附近,它依然会瞬间下载几百 KB 甚至上 MB 的脚本,造成卡顿。

文章推荐了外墙模式(Facade)

  • 做法:先用一个轻量级的"静态图片"或"假按钮"伪装成视频播放器或聊天窗口。
  • 触发 :只有当用户真正去点击这个图片(想看视频)或者把鼠标悬停在上面时,前端才通过 JavaScript 动态把这个假元素替换成真正的 <iframe>
  • 好处 :如果用户不看视频、不用聊天功能,这些重度脚本永远不会被下载,节省了海量带宽。

4. 传统/特殊场景方案:JavaScript 延迟加载库

原生的 loading="lazy" 只对 <img><iframe> 有效。如果你需要延迟加载以下内容,则需要借助 JS 库(如 lazysizesyall.js):

  • CSS 背景图片(background-image
  • <video> 视频元素(例如用来替代 GIF 的无音轨、自动循环播放的微视频)

这些库通常利用浏览器的 Intersection Observer API(交叉观察器) 来捕获元素何时进入视口,并在进入视口时动态将 data-src 替换为真正的 src 来触发下载。

总结

这篇文章是一篇多媒体与第三方组件的性能优化指南 。它的核心思想是: "按需索取" 。 通过浏览器原生的 loading="lazy"、外墙模式(Facades)以及 JS 交叉观察器,让屏幕外的图片、视频和第三方插件在需要时才加载,从而让网页在首屏启动时轻装上阵,跑得更快。

相关推荐
帅次2 小时前
Android 高级工程师面试:Java 多线程与并发 近1年高频追问 22 题
android·java·面试
maxmaxma2 小时前
Konva 从入门到实践 - day1
前端
火星校尉2 小时前
一场数据基建与消费场景的跨界实验
java·前端·数据库·python·php
W是笔名2 小时前
python_let`s try it 6___BMI计算器
java·前端·python
risc1234562 小时前
Lucene80DocValuesConsumer 五种类型源码阅读顺序
java·服务器·前端
小米渣的逆袭2 小时前
Chrome Extension Script World(ISOLATED / MAIN)原理与适用场景
前端·javascript·chrome
微信开发api-视频号协议2 小时前
Codex++安全边界探秘:从模型能力到风险防御
前端·安全·微信·企业微信
想你依然心痛3 小时前
AtomCode 在前端开发中的实战体验:React + TypeScript 项目开发实录
前端·react.js·typescript
疯狂的魔鬼3 小时前
精确计算容器剩余视口高度:useAutoContainerFullHeight 的工程实践
前端·css·typescript