我正在查看一个greasemonkey用户脚本的源代码,并注意到他们的css中有以下内容:

.even { background: #fff url(data:image/gif;base64,R0lGODlhBgASALMAAOfn5+rq6uvr6+zs7O7u7vHx8fPz8/b29vj4+P39/f///wAAAAAAAAAAAAAAAAAAACwAAAAABgASAAAIMAAVCBxIsKDBgwgTDkzAsKGAhxARSJx4oKJFAxgzFtjIkYDHjwNCigxAsiSAkygDAgA7) repeat-x bottom}

我可以理解greasemonkey脚本想要在源代码中捆绑任何东西,而不是将其托管在服务器上,这是足够明显的。但由于我以前没有见过这种技术,我考虑了它的使用,它似乎很有吸引力,原因有很多:

它将减少页面加载中的HTTP请求数量,从而提高性能 如果没有CDN,那么它将减少通过与图像一起发送的cookie产生的流量 CSS文件可以被缓存 CSS文件可以被gzip压缩

考虑到IE6(例如)在缓存背景图像方面存在问题,这似乎不是最糟糕的主意……

那么,这是一个好还是坏的做法,为什么不使用它,你会使用什么工具来base64编码图像?

更新-测试结果

用图像测试:http://fragged.org/dev/map-shot.jpg - 133.6Kb 测试网址:http://fragged.org/dev/base64.html 专用CSS文件: http://fragged.org/dev/base64.css 178.1 kb GZIP编码服务器端 结果大小发送到客户端(YSLOW 元件测试):59.3Kb 保存发送到客户端浏览器的数据:74.3Kb

很好,但我想对于较小的图像来说,它就不那么有用了。

更新:Bryan McQuade,谷歌的软件工程师,致力于PageSpeed,在2013年ChromeDevSummit上表示,CSS中的data:uris被认为是一种渲染阻塞反模式,用于交付关键/最小的CSS,在他的演讲#perfmatters: Instant mobile web apps中。请访问http://developer.chrome.com/devsummit/sessions,并记住这是实际的幻灯片


当前回答

我尝试创建一个在线概念的CSS/HTML分析工具:

http://www.motobit.com/util/base64/css-images-to-base64.asp

它可以:

下载并解析HTML/CSS文件,提取href/src/url元素 检测URL上的压缩(gzip)和大小数据 比较原始数据大小,base64数据大小和gzip的base64数据大小 将URL(图像,字体,css,…)转换为base64数据URI方案。 统计数据uri可以保留的请求数

欢迎提出意见和建议。

安东尼

其他回答

这个答案已经过时,不应该再用了。

1) 2017年移动设备的平均延迟要快得多。https://opensignal.com/reports/2016/02/usa/state-of-the-mobile-network

2) HTTP2多路复用 https://http2.github.io/faq/#why-is-http2-multiplexed

移动站点绝对应该考虑使用“数据uri”。蜂窝网络上的HTTP访问每个请求/响应都有更高的延迟。因此,在某些情况下,将图像作为数据放入CSS或HTML模板中对移动web应用程序是有益的。你应该根据具体情况来衡量使用情况——我并不是提倡在移动web应用中处处使用数据uri。

请注意,移动浏览器对可以缓存的文件的总大小有限制。iOS 3.2的限制相当低(每个文件25K),但新版本的Mobile Safari的限制越来越大(100K)。因此,在包含数据uri时,一定要注意文件的总大小。

http://www.yuiblog.com/blog/2010/06/28/mobile-browser-cache-limits/

在我的例子中,它允许我应用CSS样式表,而不用担心复制相关的图像,因为它们已经嵌入其中。

Base64在gzip后增加了大约10%的图像大小,但当涉及到移动时,这超过了它的好处。由于响应式网页设计是一个整体趋势,所以强烈推荐。

W3C也推荐这种方法用于移动设备,如果你在rails中使用资产管道,这是压缩css时的默认特性

http://www.w3.org/TR/mwabp/#bp-conserve-css-images

据我调查,

使用: 1. 当你使用svg精灵。 2. 当你的图像是一个较小的大小(最大200mb)。

不要使用: 1. 当你是更大的图像。 2. 作为svg的图标。因为他们已经很好,压缩后gzipped。

我尝试创建一个在线概念的CSS/HTML分析工具:

http://www.motobit.com/util/base64/css-images-to-base64.asp

它可以:

下载并解析HTML/CSS文件,提取href/src/url元素 检测URL上的压缩(gzip)和大小数据 比较原始数据大小,base64数据大小和gzip的base64数据大小 将URL(图像,字体,css,…)转换为base64数据URI方案。 统计数据uri可以保留的请求数

欢迎提出意见和建议。

安东尼