Html 使用数据内联图像的最佳实践:-URL?

Html 使用数据内联图像的最佳实践:-URL?,html,image,Html,Image,我有一个简单的rails应用程序,它使用canvasContext.toDataURL()存储HTML5站点中用户创建的图像。有一个索引操作,显示缩略图列表,还有一个显示每个图像的显示操作,显示图像 我在后端非常懒惰,我只存储base64编码的数据:image/png;base64,…原始图像的字符串和缩略图,也在客户端生成。图像使用URI包含在页面中 现在,由于在v9之前的IE中不完全支持这一点,我将不得不实现某种解决方法,可能是使用data-属性包含生成图像的URL,然后在页面加载后使用jQ

我有一个简单的rails应用程序,它使用
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只需将每个图像作为一个单独的资源提供……用任何语言都很容易做到。这将为您节省很多痛苦