【前端】加载的图片太多或者太大优化方案(上)

摘要:
然而,在HTTP 1.0/HTTP 1.1协议中,我们经常遇到这样的问题:加载的图像太多或太大,导致页面加载完成缓慢:太大的图像导致请求时间过长。本文将总结针对过多或过大图像的几种优化解决方案解决方案1:当图像过多时,图像服务器是一个独立的服务器,针对图像读取和写入操作进行了优化。运行网站的服务器称为应用服务器。)此外浏览器在同一时间对同一域名下的资源的并发请求的数量是有限的,

摘要

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

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

一.当图片太多时

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

对于这个方案对于经验尚浅的我来说是考虑不多的,通过跟leader沟通,了解到这一点,此方案是架构师在架构过程中必须要考虑到的.

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

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

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

【前端】加载的图片太多或者太大优化方案(上)第1张

图一(来源于网络)

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

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

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

【前端】加载的图片太多或者太大优化方案(上)第2张

图二

方案三:图片懒加载

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

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

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

方案四:css Sprites

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

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

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

【前端】加载的图片太多或者太大优化方案(上)第3张

图三(图片来源于网络)

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

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

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

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

【前端】加载的图片太多或者太大优化方案(上)第4张

图四

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

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

【前端】加载的图片太多或者太大优化方案(上)第5张

免责声明:文章转载自《【前端】加载的图片太多或者太大优化方案(上)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何查看Windows事件日志十三、nginx 强制下载txt等文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

简单方法编写在群晖ds218play上运行的sh

1、安装notepad++(64位) 2、下载并安装插件nppftp(64位) ​ 将下载的NppFTP.dll复制到该文件夹下 ​ 3、设置nppftp并连接服务器 ​ ​ ​ 4、新建sh文件: ​ ​ 5、双击文件名、在左侧编辑 ​ 6、转格式后保存,否则linux下回出错: ​ 在linux下运行sh ​...

免二次请求,selenium直接保存图片元素到本地

Selenium是不少爬虫工程师都会用的一个工具,它对页面元素的属性,文本等的提取都做的不错,但有一个缺点是只能获取到img元素的链接而不是图片二进制(即便在访问时已经加载过了一次图片)。想把指定的img保存到本地,只能使用获取的链接手动下载,不仅多花费了不少时间,而且在某些限制外链的站点还可能遇到下载失败的情况。本文介绍一个直接在selenium中保存图...

浏览器兼容问题的解决方案

对于前端开发良好的浏览器兼容必不可少,总结一下遇到浏览器兼容问题的解决办法。     1、保证浏览器默认css样式一致;     2、书写规范的css,然后在不同的浏览器下测试,针对不同的bug,用适当的方式解决。如:css Hack,     3、使用好的前端架构,通过第三方控件兼容浏览器;     4、多学习、多积累、多google。       一、...

selenium快速获取,检查定位元素的CSS与xpath

     Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础。元素定位主要核心的两种方法是CSS 和XPTH定位,CSS是倚天剑,XPATH是屠龙刀,CSS元素定位上性能优于XPATH,优先使用CSS定位。这两种定位方式组合基本能完全查找到需要定位的元素。       下面介绍几种结合谷歌浏览器在UI自动化脚本编程过程中,...

LINUX SSH 建立密钥对

配置私钥和公钥 先检查一下服务器的ssh配置文件 /etc/ssh/sshd_config RSAAuthentication yes # 启用 RSA 认证 默认为 yes PubkeyAuthentication yes # 启用公钥认证,默认为yes 在客户端执行命令  ssh-keygen -t rsa 生成密钥,会生成一个私钥和一个公钥文件,在提...

javascript 九宫格图片随机打乱位置

  今天就做个九宫格的简易拼图,最让我头疼的就是点击开始打乱图片位置。一开始在百度查看相关博客,走了很多弯路。最后看了众多的例子,自己写了个方法。 1 <script> 2 //打乱图片方法 3 function fun(){ 4 var x = []; 5 var y ; 6...