图片优化的价值

为什么要做图片优化?图片优化的收益有多大?

Google官方的最佳实践中关于图片优化有下面这样一段描述:

对于网页来说,在所下载的字节数中,图片往往会占很大比例。因此,优化图片通常可以卓有成效地减少字节数和改进性能:浏览器需要下载的字节数越少,对客户端带宽的争用就越少,浏览器下载内容并在屏幕上呈现内容的速度就越快。

那么图片到底占多大比例?

大家可以看一下http archive这个网站,它统计了世界范围内web资源的加载情况等信息。
2017年11月15日到2018年11月15日,一年内总的 web 资源的平均请求体积:

而关于图片的体积:

图片的体积大概占总资源体积的37%,图片在所有资源中占比是很大的,为此,我们也非常有必要优化图片的性能。

上面说的是全球网站的平均请求体积,下面我们拿我们自己的网上商城的网站看一下。

这是我们自己网站的首屏加载资源统计情况,可以看到图片体积占比更是达到了55.9%之高,这也非常符合电商网站的性质。(上图结果是通过WebPageTest测试得到)

我们发现,图片资源在网站所有资源中占比很大,而且在电商类网站中占比更大。优化图片可以减少客户端下载的字节数,改进网页性能。

图片类型和使用场景

常用的web图片格式有:JPEG/JPG、PNG、WebP、Base64、SVG

JPEG和JPG格式有什么区别?
没有区别,全名、正式扩展名是JPEG。但因DOS、Windows 95等早期系统采用的8.3命名规则只支持最长3字符的扩展名,为了兼容采用了.jpg。也因历史习惯和兼容性考虑,.jpg目前更流行。

JPEG/JPG
特点:有损压缩、体积小、加载快、不支持透明
适用场景:适用于呈现色彩丰富的图片,在我们日常开发中,JPG 图片经常作为大的背景图、轮播图或 Banner 图出现。

PNG
特点:无损压缩、质量高、体积大、支持透明
适用场景:PNG 在处理线条和颜色对比度方面有优势,主要用它来呈现小的 Logo、颜色简单且对比强烈的图片或背景等。

SVG
特点:文本文件、体积小、不失真、兼容性好
适用场景:将 SVG 写入独立文件后引入 HTML

<img src="文件名.svg" alt="">

Base64
特点:文本文件、依赖编码、小图标解决方案
适用场景:小图标,更新频率非常低,作为雪碧图的补充

WebP

WebP 是 Google 专为 Web 开发的一种旨在加快图片加载速度的图片格式,它支持有损压缩和无损压缩。

特点:全能但存在兼容性问题
使用场景:限制我们使用 WebP 的最大问题不是“这个图片是否适合用 WebP 呈现”,而是“浏览器是否允许 WebP”

图片优化方案

减少图片体积

  • 采用WebP格式的图片,能够在不降低图片质量的前提下减小图片的体积。

WebP 的优势是它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。

下左图JPEG(1.6M) 下右图WebP(1.2M)

cloudconvert可以在线转webp,大家可以去试一下。

WebP lossless images are 26% smaller in size compared to PNGs. WebP lossy images are 25-34% smaller than comparable JPEG images at equivalent SSIM quality index.

上文提到WebP虽然有诸多优势,但兼容性问题不得不考虑。在支持WebP的浏览器中优先使用WebP格式,否则采用默认格式。

看一下淘宝网站的做法,在Chrome浏览器下,采用的是WebP格式的图片,在Safari浏览器下,采用的是JPEG格式的图片。
看一下这两张图片的地址:
webp:https://img.alicdn.com/tfs/TB...
JPEG:https://img.alicdn.com/tfs/TB...
可以发现,淘宝是根据是否支持webp,动态设置(字符串截断)图片url的。

如何判断当前浏览器是否支持WebP?
可以参考谷歌网站的做法。

// check_webp_feature:
//   'feature' can be one of 'lossy', 'lossless', 'alpha' or 'animation'.
//   'callback(feature, result)' will be passed back the detection result (in an asynchronous way!)
function check_webp_feature(feature, callback) {var kTestImages = {lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"};var img = new Image();img.onload = function () {var result = (img.width > 0) && (img.height > 0);callback(feature, result);};img.onerror = function () {callback(feature, false);};img.src = "data:image/webp;base64," + kTestImages[feature];
}

原理:对每一种格式的webp(有损,无损,alpha通道,动态)生成一个很小像素的图片,在浏览器中渲染,如果没有问题,就代表支持webp。

也可以让服务器端来判断返回什么格式的图片,服务器根据 HTTP 请求头部的 Accept 字段来决定返回什么格式的图片。当 Accept 字段包含 image/webp 时,就返回 WebP 格式的图片,否则返回原图。

  • SVGO

利用SVGO压缩svg文件的大小,下面这张SVG原图80kb,利用SVGO压缩后是23kb。

缓存

谷歌最佳实践中指出:

对于静态素材资源或不常变化的素材资源,我们建议至少缓存 1 周,至多缓存 1 年。

如何使用缓存,有一张经典的图可以参考。

图片懒加载

懒加载的原理是:将图片的url赋值给img的data-url(可自定义)属性,监听滚动事件,当图片进入可视区域时,将data-url的值赋值给img的url属性,这时才真正发出图片的http请求。具体实现可以参考实现图片懒加载

响应式图片

一种可以在不同的屏幕尺寸和分辨率的设备上都能良好工作以及其他特性的图片

艺术方向:当你想为不同布局提供不同剪裁的图片——比如在桌面布局上显示完整的、横向图片,而在手机布局上显示一张剪裁过的、突出重点的纵向图片,可以用 <picture> 元素来实现。

分辨率切换:当你想要为窄屏提供更小的图片时,因为小屏幕不需要像桌面端显示那么大的图片;以及你想为高/低分辨率屏幕提供不同分辨率的图片时,都可以通过 vector graphics (SVG images)、 srcset 以及 sizes 属性来实现。

分辨率切换:不同的尺寸

<img srcset="elva-fairy-320w.jpg 320w,elva-fairy-480w.jpg 480w,elva-fairy-800w.jpg 800w"sizes="(max-width: 320px) 280px,(max-width: 480px) 440px,800px"src="elva-fairy-800w.jpg" alt="Elva dressed as a fairy">

分辨率切换: 相同的尺寸, 不同的分辨率

<img srcset="elva-fairy-320w.jpg,elva-fairy-480w.jpg 1.5x,elva-fairy-640w.jpg 2x"src="elva-fairy-640w.jpg" alt="Elva dressed as a fairy">

艺术方向

<picture><source media="(max-width: 799px)" srcset="elva-480w-close-portrait.jpg"><source media="(min-width: 800px)" srcset="elva-800w.jpg"><img src="elva-800w.jpg" alt="Chris standing up holding his daughter Elva">
</picture>

其他

  • 利用雪碧图减少http请求
  • base64编码内联小图片
  • CDN加速

结语

性能优化需要了解其背后的原理,然后在项目中去实践,才能真正掌握。

参考文献

https://juejin.im/book/5b9365...
https://developers.google.com...
https://developers.google.com...

ps://httparchive.org/reports/page-weight#bytesTotal

前端性能优化之图片优化相关推荐

  1. 前端性能优化(图片优化)

    从输入URL到页面加载完成的过程:首先通过DNS(域名解析)把URL解析为对应的IP地址,然后与该IP地址确定的服务器建立起TCP网络连接.随后向服务器发送HTTP请求,服务器处理完HTTP请求后把目 ...

  2. Web 性能优化: 图片优化让网站大小减少 62%

    摘要: 压缩各种格式的图片. 原文:Web 性能优化: 图片优化让网站大小减少 62% 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是 Web 性能优化的第二篇,上一篇在下面看点 ...

  3. 前端每周清单第 34 期:Vue 现状盘点与 3.0 展望,React 代码迁移与优化,图片优化详论

    新闻热点 国内国外,前端最新动态 Microsoft 宣发面向 iOS 与 Android 平台的 Microsoft Edge:为了保证 Windows 用户各平台使用体验的一致性,Microsof ...

  4. 前端每周清单第 34 期:Vue 现状盘点与 3.0 展望,React 代码迁移与优化,图片优化详论... 1

    前端每周清单第 34 期:Vue 现状盘点与 3.0 展望,React 代码迁移与优化,图片优化详论 作者:王下邀月熊 编辑:徐川 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解 ...

  5. 网站SEO优化之图片优化方法

    网站SEO优化之图片优化方法 网站中图片的优化是很多站长都比较容易忽略的细节,我们知道,对于搜索引擎目前的技术来讲,是无法识别图片的内容信息的,但为了提升用户体验,我们在进行文章或者网站布局时,必须进 ...

  6. 前端每周清单第 34 期:Vue 现状盘点与 3.0 展望,React 代码迁移与优化,图片优化详论...

    作者:王下邀月熊 编辑:徐川 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点:分为新闻热点.开发教程.工程实践.深度阅读.开源项目.巅峰人生等栏目.欢迎关注[前端之巅 ...

  7. 前端优化-网页图片优化

    前端在工作中,一定会经常涉及到图片,甚至很多人认为前端就是切图的,还有人说前端是用div+css布局的,如果从事了这项工作,你一定不这么认为,相信大家都知道前端绝对不是用PS切片工具把网页切成小图片这 ...

  8. Android App 性能优化之图片优化

    接下来说明一下关于其他内存问题.图片问题,作为一个优秀的Android开发者,在图片的类型选择,图片显示前的处理都是要好好考虑的,因为不同类型图片在Android中的显示代价是不同的,使用不同显示方式 ...

  9. Android:最全面详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

    前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情.真正的大师永远怀有一颗学徒的心. 一.概述 在Android中,性能优化是细分领域中最难且也是知识面涉及最深和最广的方向之一. 更快 ...

最新文章

  1. C++ char 与uchar区别
  2. RTMP协议中的Chunk Stream ID (CID)的作用
  3. IO流(文件的读写)---本文的正确性有待您验证。
  4. 智能合约的48个应用场景介绍
  5. 大数据如何预测上市公司的业绩?
  6. 服务器端密钥库文件,使用密钥库文件为SOAP运行客户端WS
  7. android仿支付宝弹窗,【转】MUI自定义底部弹窗自带遮罩层仿支付宝支付弹窗
  8. javascript String 对象
  9. 有道词典Mac版崩溃信息
  10. TIOBE 11月编程语言排行榜: Haskell 要进前20了?
  11. 51NOD-1027 大数乘法【大数】
  12. Hyperledger Fabric教程(2)-- byfn.sh分析-生成身份证书
  13. php读取excel文件_如何用PHP读取excel文件内容、获取单元格数据
  14. ibm3650m2服务器java_通过IBM 3650 M2服务器的ServerGuide工具配置RAID图文教程
  15. vue实现在线客服功能(附完整代码)
  16. 给大龄程序员的4种竞争力策略
  17. iOS 直播流程概述
  18. 2019南京大学计算机考研录取名单,2019南京大学计算机考研录取名单啥时出来
  19. 为什么80%的企业会选择云产品?
  20. 利用手机作为渗透工具的一些思路

热门文章

  1. JedisSentinelPool 连接 master
  2. crontable定时执行Python脚本
  3. android 联系人 --- 读取usim卡的邮箱
  4. 安鸾CMS系列之Wordpress02
  5. Matlab中cov函数
  6. 2019算法面经汇总
  7. python删除网页弹出对话框_python selenium-webdriver 处理JS弹出对话框
  8. 基于EfficientNetB0的车辆品牌识别
  9. 【Unity Shader】Unity中阴影走样的解决方案
  10. Unity热更新技术学习——AssetsBundle详解