Html 使用数据内联图像的最佳实践:-URL?
我有一个简单的rails应用程序,它使用Html 使用数据内联图像的最佳实践:-URL?,html,image,Html,Image,我有一个简单的rails应用程序,它使用canvasContext.toDataURL()存储HTML5站点中用户创建的图像。有一个索引操作,显示缩略图列表,还有一个显示每个图像的显示操作,显示图像 我在后端非常懒惰,我只存储base64编码的数据:image/png;base64,…原始图像的字符串和缩略图,也在客户端生成。图像使用URI包含在页面中 现在,由于在v9之前的IE中不完全支持这一点,我将不得不实现某种解决方法,可能是使用data-属性包含生成图像的URL,然后在页面加载后使用jQ
canvasContext.toDataURL()
存储HTML5站点中用户创建的图像。有一个索引操作,显示缩略图列表,还有一个显示每个图像的显示操作,显示图像
我在后端非常懒惰,我只存储base64编码的数据:image/png;base64,…
原始图像的字符串和缩略图,也在客户端生成。图像使用
URI包含在页面中
现在,由于在v9之前的IE中不完全支持这一点,我将不得不实现某种解决方法,可能是使用data-
属性包含生成图像的URL,然后在页面加载后使用jQuery替换源属性
这就提出了一个问题:使用data:
URL将相当大的图像内联到HTML中是否是一种好的做法
是否有任何建议或最佳做法?这些图像可能高达500kib,并且每个图像只使用一次。包含图像的页面在创建后不会更改,因此它应该可以很好地缓存,包括图像。包含缩略图(大约60 KiB)的索引页使用分页,因此该页几乎不可缓存。您可以假设HTML页面将在生产过程中被压缩或压缩。这不是一个好主意。我会使用普通的、单独的图像资源 通过使用内联图像
- 您破坏了静态图像的所有可缓存性—对于内联图像,每当HTML页面更改时,所有图像数据都必须重新加载
- 压缩/压缩将花费更长的时间,并产生次优结果(因为图像数据更难压缩,效率更低)
- 互联网的其余部分是面向作为独立资源的HTML文档和图像的:预取器、缓存系统、代理
- 然后你就有了浏览器兼容性,正如你所指出的,这对于老版本的浏览器来说是糟糕透顶的
- 最佳做法是:不要
无论如何,您都需要一个解决方案,它将完全复制基本功能,因此您只需要在另一个地方测试可能出现的问题和更多的案例
您说图像应该是非常可缓存的,但您发送图像的方式不允许您包含有关缓存的信息。但是,使用更常见的通过单独的HTTP请求发送图像的方法,您可以发送expires和max age请求,以指示图像在一年内不会更改。如果你非常确信图像不会改变,你也可以设置一个上次修改的标签和一个电子标签(你甚至不需要任何逻辑来决定etag,只需发送“IMMUTABLE”作为标签)并通过发送一个304来响应每个条件GET,甚至不需要检查(因为同样,只有当你非常自信的时候,你才会这么做,否则你仍然可以对304进行更常规的检查)
如果图像只被使用一次,那么让创建图像的东西为图像提供服务,并根据查询中的某些识别功能(只是您正在执行的特定功能)写入图像,然后将其写入到浏览器的流中。在应用程序中,您仍然可以在自己的位置执行此操作
即使使用gzip,您也无法在流大小上击败它。我的建议是?不要这样做 使用后端库可以更容易地修改真实文件,所以不要这样做。 如果您想在页面中使用base64,可以使用HTML5轻松实现
var xhr = new XMLHttpRequest();
xhr.open('GET', 'images/myimage.png', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e){
if(this.status == 200){
var bb = new WebKitBlobBuilder(); // Or MozBlobBuilder, MSBlobBuilder, etc.
bb.append(this.response);
var reader = new FileReader();
reader.readAsDataURL(bb.getBlob('image/png'));
reader.onloadend = function(e){
$("#myimage").attr("src", reader.result);
};
}
};
xhr.send();
包含图像的整个页面在创建后不会更改,我在问题中对此进行了澄清。@amiuhle我支持我的回答。如果您不需要IE的另一个实现,则可能会有争议,但您仍然必须以这种方式完成所有工作,那么您还使用
数据:
?t会获得什么好处没关系,我只是想澄清一下。就像我说的,我在发现IE问题之前就实施了这个。谢谢你的回答。包括图像的整个页面在创建后不会改变,我在我的问题中澄清了这一点。@amiuhle这仍然不是一个很好的主意-压缩在服务器上会更重…为什么o这不是使用适当的普通图像资源吗?正如我所说,我在后端很懒惰。我可以将图像数据以文本形式存储在MongoDB中,避免像同步数据库和文件系统之类的事情。这是一个很小的项目,负载很小,肯定会以这种方式工作。我只是后来遇到IE问题,请求我想知道最好的方法是什么。@amiuhle只需将每个图像作为一个单独的资源提供……用任何语言都很容易做到。这将为您节省很多痛苦