Data URL简介及Data URL的利弊

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

 

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

1. Data URL基本原理

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

  <img src="images/myimg.gif ">  程序员

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

 

 

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

  几乎全部的现代浏览器都支持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方式仍是须要更多的考量,在可接受的范围内适量使用。

      原文地址:data url简介及data url利弊

相关文章
相关标签/搜索