为了减少对服务器的请求量,我将一些图片(PNG & SVG)直接作为BASE64嵌入到CSS中。(这是构建过程中自动完成的)
示例:
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAFWHRTb2Z0d2FyZQBBZG etc...);
这是一个好的实践方法吗?有什么避免使用它的理由吗?是否有一些主要的浏览器不支持data url?
附加问题: 对于CSS和JS来说这样做有意义吗?
为了减少对服务器的请求量,我将一些图片(PNG & SVG)直接作为BASE64嵌入到CSS中。(这是构建过程中自动完成的)
示例:
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAFWHRTb2Z0d2FyZQBBZG etc...);
这是一个好的实践方法吗?有什么避免使用它的理由吗?是否有一些主要的浏览器不支持data url?
附加问题: 对于CSS和JS来说这样做有意义吗?
data:
图像几乎肯定会对服务器资源造成巨大的压力!传统上,压缩图像需要很高的CPU计算量,而且几乎没有缩小的空间。这不是一个好的实践。一些浏览器不支持数据URI(例如IE 6和7),或者支持受限(例如IE8的32KB)。
参见维基百科上Data URI的完整缺点详述:
缺点
- Data URIs与包含它们的文档(如CSS或HTML文件)没有单独缓存,因此每次重新下载包含文档时都会下载数据。
- 每次更改内容都必须重新编码和重新嵌入。
- Internet Explorer在7版本之前(约2011年1月市场占有率约为15%)不支持。
- Internet Explorer8将数据URI限制为最大长度为32 KB。
- 数据被包括为简单流,许多处理环境(如Web浏览器)可能不支持使用容器(如multipart/alternative或message/rfc822)来提供更复杂的元数据、数据压缩或内容协商。
- Base64编码的数据URI比其二进制等效物大1/3。(然而,如果HTTP服务器使用gzip压缩响应,则这种开销可减少至2-3%)
- Data URIs使得安全软件更难过滤内容。
我更倾向于使用CSS Sprites来合并图片并减少请求。我从未尝试过base64技术,但它显然在IE6和IE7中不起作用。这也意味着如果任何图像发生变化,则必须重新交付整个文件,除非您当然有多个CSS文件。
我不清楚一般最佳实践,但如果可以的话,我个人不希望看到那种情况。 :)
Web浏览器和服务器都内置了很多缓存功能,所以我认为你最好的选择就是让你的服务器告诉客户端缓存图像文件。除非页面上有大量非常小的图像,否则我认为多次请求的开销并不是很大。通常浏览器会使用同一个连接来请求许多文件,因此不会建立新的网络连接,所以除非HTTP头的流量与图像文件的大小相比非常显著,否则不必太担心多次请求。
您认为目前向服务器发送过多请求的原因是什么?
我建议将其用于非常常用的小图像,例如 Web 应用程序的常见图标。
当然,必须考虑到旧浏览器的支持问题。此外,最好使用框架的功能自动将图像作为数据 URL 内联,例如 GWT 的 ClientBundle,或者至少使用 CSS 类而不是直接将其添加到元素的样式中。
更多信息请参见:http://davidbcalhoun.com/2011/when-to-base64-encode-images-and-when-not-to/