我正在查看一个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,并记住这是实际的幻灯片
这个答案已经过时,不应该再用了。
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文件被缓存。
为了让生活更简单,因为我的文件编辑器不能原生处理这个问题,我为笔记本电脑/桌面编辑工作制作了几个简单的脚本,在这里分享,以防它们对其他人有用。我一直坚持使用php,因为它直接处理这些事情,非常好。
在Windows 8.1下使用——
C:\Users\`your user name`\AppData\Roaming\Microsoft\Windows\SendTo
... ,作为管理员,您可以在您的路径中建立批处理文件的快捷方式。
该批处理文件将调用一个php (cli)脚本。
然后,您可以在文件资源管理器中右键单击图像,并发送到批处理文件。
Ok管理员请求,并等待黑色命令shell窗口关闭。
然后只需简单地从剪贴板粘贴到你的文本编辑器的结果…
<img src="|">
or
`background-image : url("|")`
以下应该适用于其他操作系统。
批处理文件…
rem @echo 0ff
rem Puts 64 encoded version of a file on clipboard
php c:\utils\php\make64Encode.php %1
在你的路径中有php.exe,它会调用php (cli)脚本…
<?php
function putClipboard($text){
// Windows 8.1 workaround ...
file_put_contents("output.txt", $text);
exec(" clip < output.txt");
}
// somewhat based on http://perishablepress.com/php-encode-decode-data-urls/
// convert image to dataURL
$img_source = $argv[1]; // image path/name
$img_binary = fread(fopen($img_source, "r"), filesize($img_source));
$img_string = base64_encode($img_binary);
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$dataType = finfo_file($finfo, $img_source);
$build = "data:" . $dataType . ";base64," . $img_string;
putClipboard(trim($build));
?>