Data URI scheme 在前端开发中是个常用的技术,通常会在 CSS 设置背景图中用到。比如在 Google 的首页就有用到:

Data URI scheme 简称 Data URI,经常会被错误地写成 data URLs。笔者认为通常用于将图片 base64 编码的 Data URI 可以称为 data URLs,理由是这个地址(通过 base64 编码的 URL)可以在浏览器地址栏打开,而且 chrome 面板下也用了 "data URLs" 这个名称,但是广义的 Data URI 绝对不可以用 data URLs 来代替,毕竟 URL 只是 URI 的子集。

如果你是第一次接触,可能会诧异于这一堆 "乱七八糟" 的编码是如何生成,打开 http://www.pjhome.net/web/html5/encodeDataUrl.htm,将任意一张图拖进去,便能自动帮你生成这串 "base64:URL",接着便可以在任何需要用到图片 src 属性的地方,用这个字符串代替。

Data URI 的格式十分简单,如下所示:

data:[<mime type>][;charset=<charset>][;base64],<encoded data>
  • 第一部分是 data: 协议头,它标识这个内容为一个 data URI 资源。
  • 第二部分是 MIME 类型,表示这串内容的展现方式,比如:text/plain(默认),则以文本类型展示,image/jpeg,以 jpeg 图片形式展示,同样,客户端也会以这个 MIME 类型来解析数据。
  • 第三部分是编码设置,默认编码是 charset=US-ASCII, 即数据部分的每个字符都会自动编码为 %xx
  • 第四部分是 base64 编码设定,这是一个可选项,base64 编码中仅包含 0-9,a-z,A-Z,+,/,=,其中 = 是用来编码补白的。
  • 最后一部分为这个 Data URI 承载的内容,它可以是纯文本编写的内容,也可以是经过 base64编码 的内容。

我们先不管它的编码过程,可能你要问了,这么费尽周折是为了啥?这里就要说到 Data URI 最大的好处,减少 HTTP 请求。通常情况下我们在 HTML 页面中表示一张图片,会用一个 img 标签,然后将其 src 属性指向服务端的一个地址,每个 img 标签都会是一次请求;但是用了 Data URI 技术,将图片编码成字符串 "内嵌" 入 HTML 代码中(inline),然后在客户端完成解码工作,就不用进行 HTTP 请求了。但是这样做也有个明显的缺点,Data URI 无法进行缓存,于是聪明的工程师一般会把 Data URI 用在 CSS 中,因为 CSS 中的 URL 操作符是用来指定网页元素的背景图片的,而浏览器并不在意 URL 里写的是什么——只要能通过它获取需要的数据。所以,我们就有了可以将 Data URL 形式的图片存储在 CSS 样式表中的可能,而所有浏览器都会积极的缓存 CSS 文件来提高页面加载效率。

在开发过程中,其实我们不常用到 Data URI 来表示图片,在此我将其利弊进行了下汇总。

利:


  • 减少 HTTP 请求
  • 当访问外部资源很麻烦或受限时(比如服务器 ip 被墙)
  • 当图片是在服务器端用程序动态生成,每个访问用户显示的都不同时
  • 当图片的体积太小,占用一个 HTTP 会话不是很值得时
  • 没有图片更新要重新上传,还要清理缓存的问题

弊:


  • Base64 编码的数据体积通常是原数据的体积 4/3,也就是 Data URL 形式的图片会比二进制格式的图片体积大 1/3(好在服务端有 gzip 压缩,压缩后和编码前图片大小差不多)
  • Data URL 形式的图片不会被浏览器缓存,这意味着每次访问页面时都被下载一次。(这点可以通过应用在 CSS 中,缓存 CSS 文件解决)
  • 增加了 CSS 文件的尺寸
  • IE678兼容性,比如 Google 首页的语音搜索提示图在 IE8 下直接舍去了(http://www.phpied.com/mhtml-when-you-need-data-uris-in-ie7-and-under/>)
  • 不适合 lazy loading
  • 不利于维护
  • 移动端不宜使用 Data URI 技术(解码耗 CPU)

那么,究竟什么时候该用 Data URI 技术呢?

  • 这类图片不能与其他图片以 CSS Sprite 的形式存在,只能独行
  • 这类图片从诞生之日起,基本上很少被更新
  • 这类图片的实际尺寸很小
  • 这类图片在网站中大规模使用

最后推荐几个在线网址(image -> base64 URL):

Read More:

Data URI 应用场景小结的更多相关文章

  1. intent-filter data Uri 意图过滤器 详解

    组件的intent-filter属性         如果一个 Intent 请求在一片数据(Uri)上执行一个动作(Action), Android 如何知道哪个应用程序的哪个组件能用来响应这个请求 ...

  2. 【转】Data URL和图片,及Data URI的利弊

    Data URL给了我们一种很巧妙的将图片“嵌入”到HTML中的方法.跟传统的用img标记将服务器上的图片引用到页面中的方式不一样,在Data URL协议中,图片被转换成base64编码的字符串形式, ...

  3. 前端-Data URI Scheme

    了解Data URI scheme,首要要掌握一些URI.URL的基本知识,很多做移动端上开发的同学对这两个基本概念掌握的不够,本文首先会对这两个基本概念做一些简单的介绍. 基本概念 <HTTP ...

  4. 细说 Data URI

    Data URL 早在 1995 年就被提出,那个时候有很多个版本的 Data URL Schema 定义陆续出现在 VRML 之中,随后不久,其中的一个版本被提上了议案——将它做个一个嵌入式的资源放 ...

  5. JS魔法堂:Data URI Scheme介绍

    一.前言 上周五公司内部的Any Topic Conf.上我和同事们分享了这个主题,有同事说这个有用,有同事说这个没啥用,后来还延伸到网站性能的话题上,大家讨论的激烈程度让我觉得这次选题还不错.本篇先 ...

  6. php://input,php://filter,data URI schema的那些事

    一.php://input一句话木马 在调研dedecms的历史漏洞时,发现了dedecms安装文件曾经出过被植入后门的漏洞(SSV-ID站点include目录下shopcar.class.php文件 ...

  7. data URI

    参考资料:http://www.cnblogs.com/hustskyking/p/data-uri.html 与http,ftp等协议类似,data URL也是一种协议,不同的是它直接将数据(编码或 ...

  8. 网页优化URI(http URI scheme与data URI scheme)

    网页优化的一大首要任务是减少HTTP 请求 (http request) 的次数,例如通过合并多个JS文件,合并CSS样式文件.除此之外,还有一个data URL 的密技,让我们直接把图像的内容崁入网 ...

  9. data URI scheme

    优化网页效能,首要的任务是尽量减少HTTP请求(http request)的次数,例如把多个JavaScript文档合并,多个CSS文件合并等等.此外,还有有一种 data URL 的方法,可以直接把 ...

随机推荐

  1. EventBus使用详解(一)

    一.概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间 ...

  2. mac版 android破解软件下载安装

    1 apktool下载安装 下载地址https://code.google.com/p/android-apktool/ [1].下载apktool.jar — 解压 [2].下载Mac上的辅助工具a ...

  3. X264库直接压缩BITMAP格式数据

    最近帮朋友看了下X264压缩视频,主要参考了雷霄骅(leixiaohua1020)的专栏的开源代码: http://blog.csdn.net/leixiaohua1020/article/detai ...

  4. day 2远程连接Linux系统管理

        IP端口-协议等基本概念 互联网上的计算机,都会有一个唯一的32位的地址,IP地址. 我们访问服务器.就必须通过这个IP地址. 局域网也有预留的IP地址 192/10/172开头.局域网的 I ...

  5. linux 分区 物理卷 逻辑卷

    今天我们主要说说分区.格式化.SWAP.LVM.软件RAID的创建哈~ 格式化 查看当前分区:fdisk   -l 这个命令我们以前是讲过的,我现在问下,ID那项是什么意思? 83 是代表EXT2和E ...

  6. linux基础-第七单元 用户、群组及权限的深入讨论

    怎样查看文件的权限 ls命令详解 root用户及文件的安全控制 什么是root用户 用户分类 文件操作权限 文件操作权限的字符表示 chown chgrp 使用符号表示法设定文件或目录上的权限 chm ...

  7. proteus 查找 仿真元件 中英文对照 [持续更新]

    CRYSTAL 晶振 CAP 电容 RES 电阻 LED 灯 DIODE 二极管 POWER 电源 GND   接地 SPEAKER 扬声器 AT89C51   51 CPU芯片 三极管 PNP  N ...

  8. Page Visibility(页面可见性) API介绍、微拓展[转]

    一.网页君的悲情谁来懂 唉,突然想到了一首悲情诗: 泪湿罗巾梦不成,夜深前殿按歌声.红颜未老恩先断, 斜倚薰笼坐到明. 学生时代学过的一首诗,已还给老师不知所云的诸位可参见下面释义: 诗的主人公是一位 ...

  9. [转]Ionic系列——CodePen上的优秀Ionic_Demo

    本文转自:http://my.oschina.net/u/1416844/blog/514361?fromerr=bbFC5JIl 案例网站 Slidebox with Dynamic Slides ...

  10. 还是不想改报告,伊阿忆啊哟-Linux基础继续

    hi 虽然今天是最最美好的周六(前不着工作日后不着工作日),但老子还要来改报告,但额就是不想改,你拿我有啥办法啊... 争取完结Linux基础 一.Linux常用命令(三) 4.帮助命令 4.1 帮助 ...