懒加载图片以获取最佳性能的最佳方案

标签: 懒加载 图片 性能 | 发表时间:2020-09-03 15:15 | 作者:Jimmy
出处:https://juejin.im/frontend

图片懒加载是一个很受欢迎的优化站点的方法,因为它很容易实现,并且能明显提升性能。使用 惰性加载,我们可以异步加载图片,这意味着可以只加载浏览器视口内的图片。 大约一年前,图像和 iframe的原生惰性加载特性已发布,但是仅针对 谷歌和其他主流浏览器。该功能的重点是使浏览器可以控制何时请求图像或 iframe资源,这使得开发工作更加容易。在此前,唯一的选择是使用 JavaScript插件来监视视口更改并动态加载资源。现在,浏览器也可以原生支持(懒加载)。

在写此文时候(原文在 dev.to上是2020年8月31日发布),大约 73% of currently used browsers支持这个特性,这还不赖。但是,我们不想让 27%的潜在用户无法访问和使用网站的图片资源。

所以,这就很有趣了,值得思考:

  • 对于支持原生懒加载特性的浏览器,我们想直接使用它

  • 对于不支持原生懒加载特性的浏览器,我们使用 JS插件

  • 根据浏览器对原生懒加载特性支持与否,考虑是否引入 JS插件

  • 必须同时支持 imgsource元素

loading 属性

loading属性有三个值。

  • auto - 默认值。和不设置 loading属性效果一样。

  • eager - 立即加载资源。

  • lazy - 一旦资源在视口就加载它

尽管上面的取值有特定的使用案例,但是,我们通常希望对折叠以上(视口)的资源使用 eager,对折叠以下的资源使用 lazy

现代的方法

我们需要编写一个脚本,该脚本将在 HTML文档后运行。我们使用了 Jekyll,并将脚本作为 HTML的部分添加在 body的末尾。这是运行 JavaScript函数以避免渲染阻塞的最有效方法。

标记图片

我们希望 JavaScript函数基于浏览器原生支持的特性来开启图像加载过程。为此,我们将图像的路径添加到 data-src而不是 src。但是我们不应该将 src留空,因此我们将使用 1 x 1px透明图像占位符。我们对 img元素标记如下所示:

   <img 
  src="/path/to/placeholder/image.png"
  data-src="/path/to/full/image.jpg"
  alt="Image description"
  class="lazyload"
  loading="lazy"
/>
复制代码

⚠️ class="lazyload"是给懒加载后备插件使用的。我使用了此特定类名的插件 lazysizes

另外,我们想支持 picture元素,它包含多个 source元素并且 img元素作为后备元素。

   <picture>
  <source data-srcset="path/to/image.webp" type="image/webp" />
  <source data-srcset="path/to/image.jpg" />
  <img loading="lazy" 
    class="lazyload"
    src="path/to/placeholder/image.png"
    data-src="path/to/image.jpg"
    alt="Image description"
  />
picture>
复制代码

特性检测

我们需要检测用户的浏览器是否支持原生的懒加载。幸运的是,我们可以直接使用 JavaScript去做这件事。

   if ("loading" in HTMLImageElement.prototype) {
  /* Native lazy loading is supported */
 } else {
  /*  Native lazy loading is not supported */
 }
复制代码

最终JavaScript代码

对于 原生懒加载,我们只需要对 img分配 data-src值给 src值,对 source分配 data-srcset值给 srcset值,剩下的事情就交给浏览器了。

对于 不支持该特性的浏览器,我们只需要加载相关的 JavaScript插件,可选的,如果没有自动化集成的,那么就运行该插件。我习惯使用 lazysizes,但是任何懒加载插件都会生效,前提是保证元素的标记要正确(比如类名,data元素等)。

于是,最终的 JavaScript的代码会看起来长这样:

   
复制代码

本文截取 Best way to lazy load images for maximum performance部分翻译,进行学习和总结。懒加载在商城站点和运营活动的场景使用更加频繁,当然,图片还要进行最优压缩、切割和CDN处理等。更多博文内容详见 Jimmy Blog

相关 [懒加载 图片 性能] 推荐:

懒加载图片以获取最佳性能的最佳方案

- - 掘金前端
图片懒加载是一个很受欢迎的优化站点的方法,因为它很容易实现,并且能明显提升性能. 使用 惰性加载,我们可以异步加载图片,这意味着可以只加载浏览器视口内的图片. 大约一年前,图像和 iframe的原生惰性加载特性已发布,但是仅针对 谷歌和其他主流浏览器. 该功能的重点是使浏览器可以控制何时请求图像或 iframe资源,这使得开发工作更加容易.

Web性能优化之图片优化

- - 极客521 | 极客521
HTTP Archieve有个统计,图片内容已经占到了互联网内容总量的62%,也就是说超过一半的流量和时间都用来下载图片. 从性能优化的角度看,图片也绝对是优化的热点和重点之一,Google PageSpeed或者Yahoo的14条性能优化规则无不把图片优化作为重要的优化手段,本文覆盖了Web图片优化的方方面面,从基本的图片格式选择、到尚未被广泛支持的响应式图片均有所提及.

网站性能优化之CSS无图片技术

- - 微博UDC
在不使用CSS Image(通过CSS的引入的背景图片,不包括img标签内的图片)情况下生成类似图片效果的技术;换句话的意思就是在使用纯CSS生成类似图片效果的技术. 首先我们通过yslow的statistics查看新浪微博最新版首页的文件,得到Stylesheet File(CSS文件)大小为206.8K, CSS Image大小为623.8K.

Android工具库xUtils1.9.8发布-orm性能优化,图片加载优化...

- - 开源中国社区最新新闻
感谢关注xUitls的网友最近一段时间给予的热心反馈,xUtils近期做了很多细节优化之后,功能和api已经稳定.         1.9.8主要更新内容:.         * orm模块添加列类型转换接口,支持自定义类型字段作为列映射;.         * bitmap模块优化默认参数,取消默认动画,加载更快速.

调研分享:图片文件在各文件系统上的访问性能对比

- Epile - 搜索研发部官方博客
  在某产品线的图片服务器,存放了亿级别的图片文件,每个文件的大小在0.5k-100k之间,其中1K以下的文件数量在50%左右,1-4K文件数量在40%左右,4K以上10%,大量的文件存储对文件系统的性能要求非常高,特对目前业界常用系统性能在图片服务的表现进行调研.   因线上flash卡故障率非常高,所以在寻找替代方案,磁盘是否可以满足线上系统需求.

Yahoo!网站性能最佳体验的34条黄金守则——图片、Coockie与移动应用

- - 蓝飞技术部落格
我们在前面的几节中分别讲了提高网站性能中 内容、 服务器、 JavaScript和CSS等方面的内容. 除此之外,图片和Coockie也是我们网站中几乎不可缺少组成部分,此外随着移动设备的流行,对于移动应用的优化也十分重要. 对于页面内容使用无coockie域名. 优化CSS Spirite.

Android性能优化之实现双缓存的图片异步加载工具(LruCache+SoftReference) - 拿来即用

- - CSDN博客推荐文章
之前在郭大神的博客看到使用LruCache算法实现图片缓存的.这里仿效他的思路,自己也写了一个. 并加入ConcurrentHashMap>去实现二级缓存,因为ConcurrentHashMap是多个锁的线程安全,支持高并发.很适合这种频繁访问读取内存的操作..

分享图片

- 糖果 - 变态辣椒的时政漫画

javascript图片切换

- Haipeng - 博客园-首页原创精华区
闲来无事,练习js,参照网上的一些源码写了一个图片切换程序,刚来博客园,不懂怎么发布js程序,懂的朋友可以留言告之. 1.图片切换效果有以下几种:随机切换   4格纵向百叶窗  16格横向百叶窗  由里至外逐渐放大   中间向左右两边逐渐放大   中间向上下两边逐渐放大   由上至下落幕   由左至右   由左上至右下   由右下至左上              8格纵向百叶窗    8格纵向百叶窗2   8格万花筒  24格万花筒  4格滑行左上至右下  4格滑行左上至右下  4格滑行落幕   4格滑行延伸.

图片会说话

- aeaanli - YesKafei Daily
任天堂Wii 手柄 Classic Controller Pro. wii| T-Freestyle NW 单板滑雪模拟器. Wii 不再孤独,微软发布身体感应游戏机 Xbox 360 Kinect. Wii 这样的外设你想拥有嘛. 织梦DedeCms魅友吧手机图片模板分享 | 织梦(Dedecms)管理员之家 (@dedeadmin).