之前写过一篇“漫谈前端优化”的文章,里面提到过DataUrl,粗鲁的描述了下,感觉不甚详焉,所以这几天也总结了这方面的知识,参考一些资料,补充一篇文章在这里,对这方面的资料来说,也是一种强化记忆应用; 

Data URL给了我们一种很巧妙的将图片“嵌入”到HTML中的方法。跟传统的用img标记将服务器上的图片引用到页面中的方式不一样,在Data URL协议中,图片被转换成base64编码的字符串形式,并存储在URL中,冠以mime-type。本文中,我将介绍如何巧妙的使用Data URL优化网站加载速度和执行效率。

1. Data URL基本原理

图片在网页中的使用方法通常是下面这种利用img标记的形式:

  <img src="data:images/myimg.gif ">

  这种方式中,img标记的src属性指定了一个远程服务器上的资源。当网页加载到浏览器中 时,浏览器会针对每个外部资源都向服务器发送一次拉取资源请求,占用网络资源。大多数的浏览器都有一个并发请求数不能超过4个的限制。这意味着,如果一个 网页里嵌入了过多的外部资源,这些请求会导致整个页面的加载延迟。而使用Data URL技术,图片数据以base64字符串格式嵌入到了页面中,与HTML成为一体,它的形式如下:

 

  从上面的base64字符串中你看不出任何跟图片相关的东西,但下面,我们将传统的img写法和现在的Data URL用法左右对比显示,你就能看出它们是完全一样的效果。但实际上它们是不一样的,它们一个是引用了外部资源,一个是使用了Data URL。

  几乎所有的现代浏览器都支持Data URL格式,包括火狐浏览器,谷歌浏览器,Safari浏览器,opera浏览器。IE8也支持,但有部分限制,IE9完全支持。

2. 为什么Data URL是个好东西

  Data URL能用在很多场合,跟传统的外部资源引用方式相比,它有如下独到的用处:

  • 当访问外部资源很麻烦或受限时(这个比较鸡肋)
  • 当图片是在服务器端用程序动态生成,每个访问用户显示的都不同时(场景较少)
  • 当图片的体积太小,占用一个HTTP会话不是很值得时(雪碧图可以出场了)

  Data URL也有一些不适用的场合

  • Base64编码的数据体积通常是原数据的体积4/3,也就是Data URL形式的图片会比二进制格式的图片体积大1/3
  • Data URL形式的图片不会被浏览器缓存,这意味着每次访问这样页面时都被下载一次。这是一个使用效率方面的问题——尤其当这个图片被整个网站大量使用的时候。

  然而,Data URL这些不利的地方完全可以避免或转化。本文的重点就是要讨论这个问题。

3. 在CSS里使用Data URL

  当第一次看到Data URL的作用和用法时,你也许会很不疑惑,“为什么要麻烦的将图片转换成base64编码字符串,还要嵌入的网页中,将HTML代码弄的混乱不堪,甚至还会有性能上的问题。”

  诚然,无法否认缓存在浏览器性能中的重要作用——如何能将Data URL数据也放入浏览器缓存中呢?答案是:通过CSS样式文件。CSS中的url操作符是用来指定网页元素的背景图片的,而浏览器并不在意URL里写的是什么——只要能通过它获取需要的数据。所以,我们就有了可以将Data URL形式的图片存储在CSS样式表中的可能。而所有浏览器都会积极的缓存CSS文件来提高页面加载效率。

  假设我们的页面里有一个很小的div元素,我们想用一种灰色的斜纹图案做它的背景,这种背景在当今的网站设计者中非常流行。传统的方法是制作一个3×3像素的图片,保存成GIF或PNG格式,然后在CSS的background-image属性中引用它的地址。而Data URL则是一种更高效的替代方法,就像下面这样。

下面是CSS代码:

  1. .striped_box
  2. {
  3. width: 100px;
  4. height: 100px;
  5. background-image: url("data:image/gif;base64,R0lGODlhAwADAIAAAP///8zMzCH5BAAAAAAALAAAAAADAAMAAAIEBHIJBQA7");
  6. border: 1px solid gray;
  7. padding: 10px;
  8. }

在我们的HTML里放入下面的代码:

  1. <div class="striped_box lazy ">
  2. 这是一个有条纹的方块
  3. </div>

实际输出一个带边框的小方块:

  

  在这个例子中,Data URL的使用是完全符合场景的。它避免了让这个小小的背景图片独自产生一次HTTP请求,而且,这个小图片还能同CSS文件一起被浏览器缓存起来,重复使 用,不会每次使用时都加载一次。只要这个图片不是很大,而且不是在CSS文件里反复使用,就可以以Data URL方法呈现图片降低页面的加载时间,改善用户的浏览体验

4. 将图片转换成Data URL格式的方法

用Data URL来展示图片的例子以及它的好处我们说完了,下面我们转入下一个问题,如何将图片转换成Base64编码的字符串。其实网上有很多工具都可以使用,下面列举了几个。其中一个是在线工具,一个Mac OS X桌面应用。

Data URL总结

  IE6/7是不支持Data URL技术的,不幸的是在中国还有很多用户在使用这种古老的浏览器。希望各方面包括官方和民间都多做努力工作,让现代浏览器(谷歌浏览器,火狐浏览器,IE11+)尽快的占领市场,这是我们Web程序员最大的愿望。

  最近Data URI似乎热了起来,特别是从淘宝UED上发了一篇《 Data URI小试 —— 在旺旺点灯(JS)上的应用 》后,陆续出现这方面的文章。看到不少人提到Data URL时都只是提到了优点,我也好奇了一把,借这机会更全面了解了下。

  说到Data URI的优点,自然少不了“减少链接数”,把图片转为Base64编码,以减少图片的链接数。我们先想当然一下,同样一张图片,如果不用发起一个下载请求,打开速度是会更快的。但是,有几个问题需要关注下:

  • 图片始终是要下载的,那么下载一张图片的速度快还是下载一堆编码快?
  • 浏览器对图片的显示,处理效率哪个更快?
  • 图片的缓存问题

  原文测试,使用Data URL方式的Demo在渲染时会比不使用 多消耗53%左右的CPU资源,内存多出4倍左右,耗时平均高出24.6倍 。由此可见,使用Data URl方式还是需要更多的考量,在可接受的范围内适量使用。

最新文章

  1. Git Push 避免用户名和密码方法
  2. .NET面试题解析(00)-开篇来谈谈面试 &amp; 系列文章索引
  3. Qt 5.7 版本+2013VS环境配置
  4. Ubuntu 16.04 Mxnet CPU 版本安装
  5. ASP.NET MVC 4.0 学习5-ActionResult
  6. C#关键字列表
  7. Make Things Move -- Javascript html5版(一)文件目录结构和工具方法准备
  8. Nginx架构解析
  9. 软件工程作业 - word count
  10. crontab每隔1天执行【转】
  11. js的点滴2
  12. shell中的函数 shell中的数组 告警系统需求分析
  13. EXCEL 将网络图片地址插入为锁定的图片单元格宏
  14. (转载)java list排序
  15. linux sh 读取文件内容,if判读语句,变量var打印
  16. 深度学习Momentum(动量方法)
  17. CCSUOJ评测系统——第四次scrum冲刺
  18. 在java代码中用xslt处理xml文件
  19. 20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告
  20. Linux入门-第六周

热门文章

  1. Xamarin开发Android笔记:拍照或相册选取图片角度问题
  2. .Net Core开源通讯组件 SmartRoute(服务即集群)
  3. windows 配置 apache + php
  4. [渣译文] SignalR 2.0 系列:SignalR的服务器广播
  5. Hadoop开发第4期---分布式安装
  6. MapReduce实例浅析
  7. 【面试必备】CSS盒模型的点点滴滴
  8. kafka的一些认识
  9. 解决SQLSERVER数据库表被琐死!
  10. 使用后台服务数据更新UI