将所有 JPEG 图片替换为 data URI 是否有负面影响?

data URI体积增大缓存限制JPEG编码
On this page

将所有 JPEG 图片替换为 data URI 是否有负面影响?

摘要

尽管 data URI 可以优化性能,但在替换所有 JPEG 图片前应考虑体积增大和缓存不足等缺点。


data URI 允许你直接将小文件比如图片编码为字符串,而不是链接到外部资源。一些开发者探索了将所有的 JPEG 图片引用替换为内联 data URI 的做法。在这篇文章中,我们来看看全面使用 data URI 而不是传统图片文件的利与弊。

什么是 data URI?

一个 data URI 可以将图片、CSS 和 JavaScript 等文件内容直接编码为一个字符串,而不是引用外部文件:

1data:[<media type>][;base64],<data>

例如,一个小的 PNG 图片可以表示为:

1data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAY...

浏览器可以像渲染外部文件一样渲染这些 data URI 字符串。这避免了额外的 HTTP 请求。

data URI 可以用于任何文件类型,如图片、SVG、字体、HTML、CSS 和 JavaScript 代码。但它们最常用于小图片和图标。

使用 data URI 的优点

使用 data URI 的一些潜在优势:

  • 消除了对外部资源的 HTTP 请求
  • HTML 页面包含内联文件,自成一体
  • 没有网页服务器的更简单的路径和访问控制
  • 避免 canvas、WebGL 纹理等的跨域问题

对于生产网站,内联小资源可以通过减少请求来优化性能。

对于测试和开发,data URI 简化了无需资源服务器的本地工作。

data URI 的缺点

然而,全面使用 data URI 有一些需要注意的缺点:

  • 编码会增加 HTML 和 JavaScript 的大小
  • 无法利用浏览器缓存外部文件
  • 不兼容 IE 6/7 和一些老版本浏览器
  • 未来更难更新资源

data URI 中使用的 Base64 编码会使文件大小比二进制文件大约增加 33%。因此内联所有图片可能会明显增加页面体积。

data URI 也无法利用 CDN 或外部静态文件的边缘缓存。

data URI 适用的场景

有一些场景下 data URI 很理想:

  • 非常小的图标图片
  • 图标和 SVG 图片
  • 作为外部资源失败时的回退

内联几 KB 大小的小图片是一个简单的优化。

data URI 对于需要离线工作或有可预测性能的图形和 UI 元素也很有用。

优化 data URI 的使用

优化使用 data URI 的一些方法:

  • 仅用于小于特定大小阈值的静态资源
  • 使用构建工具自动内联过程
  • 为更大的资源 fallback 到正常文件

一般来说,你需要避免内联大图片和文件。任何超过几 KB 的应该保持为正常的资源请求。

data URI 的替代方案

还有一些可以实现类似优势的替代技术:

  • CSS 精灵 - 将图片组合成一个文件
  • 图标字体 - 将图标编码成字体
  • SVG 图片 - 小的矢量图形格式
  • 内容分发网络 - 分布式缓存层

每种方法在特定使用场景下都有权衡需要评估。

总结

在某些情况下,data URI 可以通过消除资源请求来优化性能。但在替换所有正常的图片引用之前,应考虑编码体积增大和缺乏缓存的缺点。

特别是 JPEG 文件并不是内联的理想格式。其压缩机制已经使其非常紧凑,Base64 编码会导致明显的体积增大。

一般来说,data URI 最适用于几 KB 大小以下的静态元素。它们可以简化开发,但可能不是所有生产场景的最佳选择。与任何优化一样,在浏览器和连接上进行彻底的测试是明智的。