base64
更新日期:
博主声明:base64 是一个月前查的知识点,今日才得空整理,信息被遗忘的差不多了。之所以还要记录,是因为当时的心情依旧是记忆犹新啊,就是“我嘞个擦,原来这是一个2009-2010年间的话题,而我,却是6年后才来带着好奇查阅的。作为FE,简直太不合格了”。
所以,本篇就是来单纯扯淡的,闲聊。因为我还记得一个心情,就是“base64现在应用的也不特别广了,至少在background-image的那个切入点上”,于是,遗忘的也就不再细细补了。今天,想起来多少,就记录多少。
咳咳,依然很想好好学习的同学,可以移步这篇 Data URI&MHTML: 用还是不用?,开头有引用到 Yahoo! 性能专家 Stoyan Stefanov 于 2009.4.10-2010.2.4 期间发表的四篇博客,可以去研读。
来,余下的朋友,咱继续。
什么是 Base64?
简单理解,Base64 就是一堆连续字母,最后有1~2个”=”的代码。此为引用 张鑫旭博客 里的一段话,如此通俗易懂的描述,甚是喜欢。
它能干啥?
base64 可以
- 编码 url:比如迅雷的地址 thunder://QUFodHRwOi8vd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWZaWg==
- 编码图片:比如 img 的 src
- 编码字体文件:比如 Icon Font 【~此处没例子,嗯,就是这么任性~】
|
|
来来来贴标签
对于某样东西的优缺点,其实我不怎么喜欢这么比,感觉实际意义不大。就比如一个东西你没用对,你就找个借口说“啊,它的优点是那个,你说的这个问题啊,是它随之而来的缺点,无法避免。”但是,这次呢,我还是想肤浅的聊一聊,就是想借这些干巴巴的条条框框来瞬间呼唤起自己对 base64 的感观认知。仅此,无它。
这里说说使用 base64 编码替代 CSS 背景图片时,它与传统 HTTP url 的比较。
优点
- 少了 HTTP 请求
base64 不用再请求外部资源了,它会随着下载 HTML 的时候一并下载了 - 避免跨域的问题:因为图片的数据是在本地的
- 避免缓存:无需更新缓存,不用上传文件。不用担心被缓存的问题(eg.url本身没变的时候 诸如相对路径引用的图片资源)
缺点
- 浏览器兼容性问题
用 base64 作为背景图片,低版本浏览器不支持,诸如 ie6-7 【~特别具体到哪个版本,自己去测~】 - 增加了 CSS 的文件大小
貌似可以被 gzip 压缩的,所以还行;又有人说:gzip 对 base64 没有压缩能力 【~喝喝哒,此处没深入调研。都说了,今天是来扯淡的,没骗你吧~】 - 编码解码:增加了工作量
【编码-是指前期的自己上传吧,解码-浏览器这层也是要解的吧】
适用场景
对于可以减少 HTTP 请求的这点,理论是相同,但落脚点到实战上,有两篇博客的意见却是不同的。
一个说:被频繁大量使用的小图片,建议用 base64。因为总体来看,是省了好多个 HTTP 请求
另一个说:被频繁大量使用的小图片,不建议用 base64。因为那么多页面在请求,浪费了浏览器的缓存…
高能预警:下方言论,仅供参考
所以,唯一能确定的一个场景就是:要 repeat 做背景的小图片,诸如 1*1px 3*3px 的
因为:图片很小、且不适合做成雪碧图的(要横竖 repeat 嘛)
总之就是:一次 HTTP 请求的开销都太大都不值得的时候,就是与不缓存、与数据尺寸可能大等相比,依然是HTTP请求不划算的时候
核心就是:图片要小要小。因为一旦大了,可读性…就差的不言而喻了,一长串串编码你能认得出它是啥图么?
再补充些适用场景:
- 图片,在服务器端用程序动态生成,每个用户显示的都不同时
- 图片,体积小,单独占用一个 HTTP 会话不值得(有人推荐 >30KB 图像就不用 Base64 了)
- 访问受限,当访问外部资源麻烦or受限时(就是绕开跨域嘛)
不适用场景:
- 数据大:数据体积可能会是比原数据体积大1/3,Data URL形式的图片比二进制格式的图片体积大
- 不会被浏览器缓存:Data URL 形式的图片,不会被浏览器缓存。尤其是这个图片被整站用到的时候…不缓存就不好了
顺便提下:
图片的 base64 编码是前端优化性能的一个点(雪碧图也是前端优化性能的一个点)
base64 编码工具
上面叨叨了那么多,怎么能得到 base64 编码呢?
- 网上有很多在线的 base64 生成工具 【~自己去查~】
- 工具 cssgaga
- HTML5 文件本地预览 FileReader
- Canvas 的 canvas.toDataURL(),canvas获取图像的rgba数据之后
图像 -> 二进制PNG数据 -> ASCII的base64编码
心得
果然,网上的碎片化信息,是不系统,而且不权威。有时候,同一个点,会看到两篇文章说的有出入。想要权威的,那就去读官方文档,当真心有必要弄懂这里时。
要我说:在 background-image:url() 这里,base64 的用途现在不大了吧…这就是我开头提到的那第二个心情。
- 用小图片做背景+重复的,这种做法现在已经很少了吧。
- CSS3 的边框、阴影、渐变、滤镜等已经能满足大部分 UI 需求了
- 至于低版本浏览器…现在啊,直接忽略就行。UI 要求那么高干啥,功能能用就可以了
不过,我对 data:image/gif; 等这种格式还挺好奇的。
data:image/gif;base64,xxx…xxx
data:img/jpg;base64,xxx…xxx
data:font/woff;charset=utf-8;base64,xxx…xxx
参考及其它
内有 Yahoo! 专家的四篇链接
http://www.99css.com/492/
【~可以追溯地远点,了解下base64是为了解决什么问题而产生的,这有助于理解我们到底应该怎么使用它~】
标签:图片、性能 (+ CSS IE IE6-7)
Data URI
http://www.webhek.com/data-url
https://en.wikipedia.org/wiki/Data_URI_scheme
张鑫旭:
http://www.zhangxinxu.com/wordpress/2012/04/base64-url-image-图片-页面性能优化/
【前端攻略】:玩转图片Base64编码
http://www.cnblogs.com/coco1s/p/4375774.html
https://segmentfault.com/q/1010000000456088
图片在线转换为 Base64,移动开发、HTML5开发、必备的 DataURI 工具
支持 PNG、GIF、JPG、BMP、TIF、PSD、ICO 等格式
sprites:同时修改图片+css有时候也挺麻烦的呢…
?? 场景:
目前用的较多的:chrome 扩展的 Content CSS
因为不能直接引用扩展内部的图片文件,所以就编码存在 CSS 里
?? 场景:
图片足够小 + 不能被能成雪碧图 + 整个网站复用性很高 + 基本不会被更新
???
CSS文件的优点就是:重用 //此处的重用…貌似是 background-url的处理?
貌似 css inline 的是可以被缓存的