摘要

web性能的终极目标是减少资源到客户端的延迟,但是我们在HTTP1.0/HTTP1.1协议中经常会遇到加载的图片太多或者太大导致页面加载完成慢的问题:图片太多导致向服务器请求的次数太多,图片太大导致每次请求的时间过长.

本篇将针对图片太多或者太大总结几种优化方案.

一.当图片太多时

方案一:将图片服务和应用服务分离(从架构师的角度思考)

了解到这一点,此方案是架构师在架构过程中必须要考虑到的.

对于服务器来说,图片始终是最消耗系统资源的,如果将图片服务和应用服务放在同一服务器的话,应用服务器很容易会因为图片的高I/O负载而崩溃,所以当网站存在大量的图片读写操作时,建议使用图片服务器.

(注:图片服务器是专门为图片读写操作优化的独立服务器,运行网站的服务器称为应用服务器)

另外浏览器在同一时间对同一域名下的资源的并发请求数目是有限制的,一般在2-6之间,超过限制数目的请求就会被阻塞.一些主流浏览器对 HTTP1.1 和 HTTP 1.0 的最大并发连接数目,可以参考如下图一:

图一(来源于网络)

把图片服务器与应用服务器分开,图片服务器采用独立域名 ,css、js和图片就可以并发请求了

方案二:简单粗暴的压缩方案

我们可以借助一些第三方软件来进行压缩,比如https://tinypng.com/,压缩后分辨率不变,肉眼看不失真

图二

方案三:图片懒加载

像淘宝或者京东这样的APP页面上有很多图片,当我们滑到下一屏时下一屏的图片才会加载,这就采用了图片懒加载的方式.

图片懒加载,简单来说就是在页面渲染过程中,图片不会一次性全部加载,会在需要的时候加载,比如当滚动条滚动到某一个位置时触发事件加载图片,如下代码:

通过js将img标签的data-src属性赋值给src属性

方案四:css Sprites

当网站或者APP有大量小icon,如果上传到图片服务器比如CDN, 要加载所有这些小icon将增加大量请求,而CDN是按流量收费的,这无疑将增加很多成本.

CSS Sprites 技术早已不新鲜,就是将这些小icon合并成一张图片,只需要加载一次,每次通过background-position来控制显示icon,这样就可以节约大量请求,节约成本.

此方案是将网站上的一些小logo拼合成一个大图,如图

图三(图片来源于网络)

不过这也有一定的缺点:在长期开发多人合作的项目中,会不好维护这些sprites,每次对icon做修改,都得相应的改动css里background-position的值,相当繁琐.

方案五:将图片压缩成base64格式来节约请求

将图片压缩成base64,随html或者css一起下载到浏览器,不需要额外的请求,这样就节约了请求.

我们知道图片在传输过程中是流传输,如果将图片转换成base64,实际上是变大了,并且浏览器在decode  base64编码的图片时需要耗费很多时间的,所以如果我们选择此种方案的话,最好选择一些小图片,不然得不偿失,在webpack中可以设置最大多少byte的图片压缩成base64

图四

针对decode base64编码的图片比较慢的问题,我们可以选择使用canvas来加速.当向canvas发出绘画命令时,浏览器直接将指令发到图形加速器而不需要开发者更多的干预,硬件图形加速器则以难以执行的运算速度实时绘画和渲染图形.因此,我们可以使用canvas来渲染base64编码后的图片

具体代码如下: (代码出处:  http://www.jianshu.com/p/ea7c0ee8aa64)

较好组合:小图片用的iconfont,大图片用了第三方比如七牛,然后懒加载

原作者:瓦斯程序媛
链接:https://www.jianshu.com/p/637cba4079ae

转载于:https://www.cnblogs.com/zytrue/p/8567795.html

加载的图片太多或太大如何优化相关推荐

  1. android 加载大长图,android加载长图片的方法

    1.很多应用都有加载一张长图片,用户可以上下拉动图片. 自己没有好的想法,那只好百度咯.结果都说用webview来实现,好吧那就只好先试一下了. 2.自己写了简单的html,然后webview加载.图 ...

  2. 深度解析——图片加载到内存中的大小计算内存优化

    本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布 最近封装了个高斯模糊组件,正好将图片相关的理论基础也梳理了下,所以,这次就来讲讲,在 Android 中,怎么计算一张图片在 ...

  3. vue 加载image图片不显示解决

    vue 加载image图片不显示解决------------写了个vue的demo(自己做一个表格,可以横向增加列也可以纵向增加行)想给demo加图片怎么都出不来,,,,,查图片太大?加载位置不对?配 ...

  4. 图片预加载与图片懒加载

    图片预加载与图片懒加载 图片预加载 图片预加载主要是针对非icon类图片. 加载快,有良好的用户体验. 提前加载图片,当用户需要查看时可直接从本地缓存中渲染.可能因为图片很大,浏览器显示出它会用很长的 ...

  5. 微信H5资源预加载(图片、字体)

    一.背景 微信活动H5页面的特点之一就是资源多(图.字体.音频等),动不动就几十兆.庞大的资源量很可能导致页面不流畅.如下图,因为背景图还没加载完,进入第二页时会有一瞬间"白屏". ...

  6. 前端加载超大图片(100M以上)实现秒开解决方案

    前言 前端加载超大图片时,一般可以采取以下措施实现加速: 图片压缩:将图片进行压缩可以大幅减小图片的大小,从而缩短加载时间.压缩图片时需要注意保持图片质量,以免影响图片显示效果. 图片分割:将超大图片 ...

  7. 关于 android 加载 res 图片 out of memory 问题 解决 同样适用于 sd卡图片

    2019独角兽企业重金招聘Python工程师标准>>> 发现android 加载res图片如果过多也会崩溃 android 也是使用 Bitmap  bm = BitmapFacto ...

  8. vue3:加载本地图片等静态资源

    背景 在我们用 vue2 + webpack 的时候,加载图片资源是这样用的: <img :src="require('@/assets/test.png')" /> ...

  9. img实现图片加载前默认图片,加载时替换真实图片,加载失败时替换加载失败图片

    文章目录 前言 一.加载前 二.加载成功 三.加载失败 总结 前言 开发过程中,我们希望图片在加载失败的时候会替换成加载失败的图片,同时为了更好的体验,加载前最好也要有一张占位图片,即实现加载前显示一 ...

最新文章

  1. python有道自动翻译_Python 调用有道翻译接口实现翻译
  2. 读取位置 0x00000001 时发生访问冲突
  3. 网络资源备份 杨萃先书
  4. Spring中Bean的配置方式之通过全类名(反射)
  5. ⭐register_chrdev、register_chrdev_region以及alloc_chrdev_region之间的区别
  6. 《javaScript100例|02》超级经典一套鼠标控制左右滚动图片带自动翻滚
  7. lucene中对不同的域使用不同的分析器
  8. 手动添加mysql服务
  9. 线性代数【5】矩阵和矩阵运算
  10. 购物车中 商品的选中状态之后的一些业务逻辑操作
  11. Android学习之路五:Dialog和Toast
  12. 什么是P问题、NP问题和NPC问题
  13. 手机dpi修改工具_手机dpi修改器
  14. 路畅畅云固件升级教程_【图】E-Link功能/智能语音 路畅畅云+车载导航评测_汽配中国网...
  15. 大白菜u盘制作工具教程
  16. java poi Excel加密文件导出和下载
  17. async、await其实是generator和promise的语法糖
  18. smbd cpu高 linux,Samba smbd vfs.c访问限制绕过漏洞(CVE-2015-5252)
  19. matlab 2015 积分,Matlab中如何求解积分?
  20. win11系统输入法增加小鹤双排

热门文章

  1. 迪文触摸串口屏 实例应用(1)——安装编译和下载
  2. 《我编程,我快乐(3~5章)》读书笔记
  3. c语言输出斐波那契程序,C语言打印斐波那契数列
  4. maven自带clean_Maven生命周期(示例代码)
  5. 博弈论-斐波那契博弈
  6. 全志平台SPI接口LCD屏驱动(GC9300,GC9306,ST7789,HX8357C)
  7. TN3399将固态硬盘设置成根目录
  8. 火狐浏览器开发者工具的一些使用方法
  9. Java去掉C2A0等不可见字符
  10. 简单的一键分享(1)