`
wezly
  • 浏览: 490591 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Data URI 和 MHTM

阅读更多

Data URI

Data URI是由RFC 2397定义的一种把小文件直接嵌入文档的方案。通过如下语法就可以把小文件变成指定编码直接嵌入到页面中:

data:[<MIME-type>][;base64],<data>
  1. MIME-type:指定嵌入数据的MIME。其形式是[type]/[subtype]; parameter,比如png图片对应的MIME是image/png。parameter可以用來指定附加的信息,更多情況下是用于指定text/plain和text/htm等的文字编码方式的charset参数。默认是text/plain;charset=US-ASCII。
  2. base64:声明后面的数据的编码是base64的,否则数据必须要用百分号编码(即对内容进行urlencode)。

 

在上个世纪HTML4.01引入了Data URI方案,到今天为止除了IE6和IE7之外,所有主流浏览器都支持,但IE8对Data URI的支持还是有限制的,只支持object(仅是图片时)、img、input type=image、link和CSS中的URL,且数据量不能大于32K。

优点:

  1. 减少HTTP请求数,没有了TCP连接消耗和同一域名下浏览器的并发数限制。
  2. 对于小文件会降低带宽。虽然编码后数据量会增加,但是却减少了http头,当http头的数据量大于文件编码的增量,那么就会降低带宽。
  3. 对于HTTPS站点,HTTPS和HTTP混用会有安全提示,而HTTPS相对于HTTP来讲开销要大更多,所以Data URI在这方面的优势更明显。
  4. 可以把整个多媒体页面保存为一个文件。

缺点:

  1. 无法被重复利用,同一个文档应用多次同一个内容,则需要重复多次,数据量大量增加,增加了下载时间。
  2. 无法被独自缓存,所以其包含文档重新加载时,它也要重新加载。
  3. 客户端需要重新解码和显示,增加了点消耗。
  4. 不支持数据压缩,base64编码会增加1/3大小,而urlencode后数据量会增加更多。
  5. 不利于安全软件的过滤,同时也存在一定的安全隐患。

MHTML

MHTML是MIME HTML (Multipurpose Internet Mail Extension HTML)的缩写,是由RFC 2557定义的把一个多媒体的页面所有内容都保存到同一个文档解决方案。这个方案是由微软提出从IE5.0开始支持,另外Opera9.0也开始支持,Safari可以把文件保存为.mht(MHTML文件的后缀)格式,但不支持显示它。

MHTML和Data URI还比较类似,有更强大的功能和更复杂的语法,并且没有Data URI中“无法被重复利用”的缺点,但MHTML使用起来不够灵活方便,比如对资源引用的URL在mht文件中可以是相对地址,否则必须是绝对地址。hedger在《Cross Browser Base64 Encoded Images Embedded in HTML》针对IE的解决方案使用的是相对路径就是因为声明了Content-type:message/rfc822使IE按照MHTML来解析,如果不修改Content-type则需要使用MHTML协议,这个时候必须使用绝对路径,如《MHTML – when you need data: URIs in IE7 and under》

应用

Data URI和MHTML两者的配合可以完整的解决所有的主流浏览器,它们由于无法被缓存和重复利用的缺陷,所以并不适合直接在页面中使用,但在CSS和JavaScript文件中对图片适当地使用有非常大的优越性:

  1. 大大减少请求数,现在大型网站的CSS引用了大量的图片资源。
  2. CSS和JavaScript都可以被缓存,间接的实现了数据的缓存。
  3. 利用CSS可以解决Data URI的重复利用问题
  4. 告别CSS Sprites,CSS Sprites的出现是为了减少请求数,但它除了带来在不确定情况下的异常外,CSS Sprites还需要人为的图片合并,即使有合并工具也依旧必须人为地在如何有效的拼图上耗费大量的时间,并带来维护的困难。当你遵循一定的设计原则后,你就可以完全抛弃CSS Sprites来编写CSS,最后使用工具在上传到服务器环节把图片转换成Data URI和MHTML,如《利用data-uri合并样式表和图片》中用python实现的工具,这可以节约大量的时间。
  5. base64编码把图片文件增加了1/3,Data URI和MHTML同时使用相当于增加了2/3,但CSS和JavaScript可以使用gzip压缩,其可以节省2/3的数据量,所以使用gzip压缩后的最终数据量是(1 + 1/3) * 2 * (1/3) = 8/9,所以最终流量是减少的。

为了方便在CSS中实现Data URI和MHTML,我写了一个Data URI & MHTML 生成器,你可以看利用其生成Data URI & MHTML应用实例

在CSS文件中使用应用MHTML时URL必须使用绝对路径,导致非常不灵活,所以可以考虑使用CSS expression来解决(DEMO),比如:

   /*

http://old9.blogsome.com/2008/10/26/css-expression-reloaded/

http://dancewithnet.com/2009/07/27/get-right-url-from-html/

   */
  *background-image:expression(function(ele){
    ele.style.backgroundImage = 'url(mhtml:' +
         document.getElementById('data-uri-css').getAttribute('href',4) +
         '!03114501408821761.gif)';
   }(this));
分享到:
评论

相关推荐

    探究dataURI中使用SVG正确姿势

    在JavaScript中,我们可以使用Blob对象和URL.createObjectURL方法将SVG转换为dataURI,这对于动态生成SVG或在运行时修改SVG非常有用。以下是一个简单的示例: ```javascript let svgString = '...

    Data URI浅析

    Data URI由三个主要部分组成:数据类型、可选参数(如字符集和Base64编码)以及数据本身。下面对这些组成部分进行详细解释。 ##### 数据类型 数据类型指定了Data URI所包含的数据格式。常见的类型包括但不限于: -...

    .net 图片base64编码 Data URI scheme

    这些代码可以作为实际项目中的参考,帮助开发者快速地在.NET应用程序中实现图片的Base64编码和Data URI功能。 总结起来,.NET中的图片Base64编码结合Data URI方案,能够简化Web应用的图片处理,提升用户体验。...

    Python库 | python_datauri-0.2.7-py2.py3-none-any.whl

    总的来说,`python_datauri`是一个实用的Python库,它为处理和创建Data URI提供了便利,特别是在Web开发领域,有助于提升页面性能和用户体验。通过理解和应用这个库,开发者可以更高效地工作,并在项目中实现更多...

    Data URI和MHTML完整解决所有浏览器

    Data URI和MHTML是两种在Web开发中用于嵌入资源的技术,它们可以帮助优化网页加载速度和性能,尤其是在处理小文件和图像时。然而,这两种方法都有其特定的优缺点和适用场景。 Data URI(Data URL Scheme)是一种在...

    datauri:通过terminal或node.js生成Data-URI方案

    模组npm i --save datauri命令行界面npm i -g datauri-cli使用datauri的工具NPM脚本古尔一个插件,用于将图像转换为嵌入式数据URI。 旨在用作的简单单一用途包装器。RUN 在datauri模块的顶部运行着许多grunt插件。 ...

    python-datauri:简化数据URI操作

    &gt;&gt; &gt; from datauri import DataURI &gt;&gt; &gt; uri = DataURI ( [removed]VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cu' ) &gt;&gt; &gt; uri . mimetype 'text/plain' &gt;&gt; &gt; uri . charset 'utf-8' &gt;&gt; &gt; uri . ...

    iconfont到datauri「iconfont to datauri」-crx插件

    iconfont到datauri 用于将iconfont网站上的项目字体转为内嵌样式可用的datauri编码 支持语言:中文 (简体)

    image-encoder:将图片编码为dataURI

    将图像编码为DataURI。 安装 通过凉亭安装。 $ bower install 1000ch/image-encoder 用法 var ie = new ImageEncoder ( 'path/to/image.png' ) ; ie . getDataURI ( ) . then ( function onFulfilled ( datauri ) {...

    Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例

    Data URI方案是一种编码机制,它允许在网页中直接嵌入文件数据,而无需通过URL访问外部资源。格式通常如下所示: `data:[][;base64],&lt;data&gt;` 其中,mediatype 是指MIME类型,比如图片的MIME类型可以是`image/png`、...

    Data URI scheme详解和使用实例及图片base64编码实现方法

    一、 Data URI scheme 简介 Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。比如上面那串字符,其实是一张小图片,将这些字符复制黏贴到火狐的地址栏中并...

    to-datauri:从图像路径获取数据 uri

    to-datauri 从图像源 url 获取数据 uri。 用法 var toDataURI = require('to-datauri'); toDataURI(imagePath, function (error, uri) { // do things. });

    Go-SVGdatauri用于在CSS中内联小型SVG图标

    Go语言提供了一个名为Go-SVGdatauri的工具,专门用于将SVG图标转换为data URI格式,以便于在CSS中直接引用。 data URI是一种在Web内容中嵌入资源的方式,它允许将图片、字体等数据编码为Base64字符串,并直接放在...

    css-img-datauri-stream:css-img-datauri-stream

    CSS本地图像参考-&gt;数据URI转换接受文件参数和(可选)opts参数。 对于作为输入传递CSS文件,返回,该具有对本地图像的引用,并被内联取代。 所有其他文件通过流返回原始值。 opts参数对象可能包含以下内容: ...

    datauri-generator:用于从文件URI转换为数据URI的命令行程序

    数据生成器用于从文件转换为[removed]写入文件datauri -f=file.png &gt;&gt; file.png.txt# makes a file "file.png.txt" containing the data URI安装只需运行npm install -g 。 现在,您可以全局使用datauri命令。依存...

    DataURI:一个方便的类,用于在 PHP 中处理数据 URI

    #来源和历史# DataURI 是一个最初由编写的类,并在用作示例和 。 2014 年,我对 Gist 进行了分叉,以便将其打包为微型库,供 Composer 作为其他项目的依赖项使用。 在 composer 中使用基于 Gist 的微库需要在 ...

    resizeo:调整dataURI的大小

    调整大小 将dataURI调整为最大尺寸 用法 var resizeo = require('resizeo'); resizeo(dataUri, 1024, function(error, resizedUri) { // use resizedUri });

    file-to-datauri:轻松将本地文件转换为数据uri

    import datauri from 'file-to-datauri' // use with a callback datauri ( __dirname + '/some/file.txt' , ( err , uri ) =&gt; { if ( err ) { return ; } console . log ( uri ) ; } ) ; // use with ...

Global site tag (gtag.js) - Google Analytics