谈谈Data URI在性能优化中的作用

URI:统一资源标识符。由一个‘协议’和‘定位符’组成。定位符其实是补充信息,它可以是一个地址(如果是这样的话,那这个URI就是一个URL),也可以是数据本身(比如 data URI),或者命名空间(URN).

URI较URL是一个更广的概念,或者说URL是最常见的一种URI。所以Data URI不是URL。

RFC 2397(The "data" URL scheme)中第一次定义了Data URI:

它允许文档直接使用一小段数据作为"即时数据",而不是之前那样必须引用外部资源

随后,文档定义了data URI的格式:

data:[<mediatype>][;base64],<data>

在这种格式中,data:就是URI的协议,表明就是一个data URI。

mediatype可能是image/png之类的,如果不填,默认是text/plain

我们一般指定base64编码方式,如果不填,默认是低效的URL编码。

对于非英文字符串,URL编码是一种非常浪费空间的编码方式。URL编码在地址栏中很常见,对于URL安全的字符(比如英文字母、数字、中划线、下划线等)就直接显示,对于URL不安全的字符(比如非英文的字符)就编码成%XX的形式。

二进制文件中包含很多URL不安全的字符,所以转成URL编码字符之后很冗长。因此所以有了base64编码。(关于base64编码http://www.jianshu.com/writer#/notebooks/3331706/notes/11322163)。

通过对比 Base64编码明显比URL编码小很多(但是因为使用了6个比特而不是8个比特,所以仍然比压缩过的二进制文件大一些)

因此,当我们提到data URI时,99%同时是指配套使用base64编码技术,来把一个二进制资源文件(比如字体或图片)合并到主文档(可能是HTML,可能是CSS)中。

性能神器还是弃之可惜的鸡肋?

误区一:节省请求等于性能优化?

对于前端来说,显而易见好处是能够减少图片的HTTP请求,而缺点可能是不够显而易见。

样式表会变得很大,从而阻塞关键下载和渲染。

通俗地讲,图片文件或字体文件的体积转移到了HTML或CSS中,而后者的体积直接影响到渲染,导致用户会长时间注视空白屏幕。HTML和CSS阻塞渲染,图片不会。

这是Base64的第一个缺点,资源合并到CSS文件中导致体积增大,进而阻塞关键路径。

误区二:Base64 能获益于Gzip压缩?

Gzip是在web前端最常见的一种压缩文本的方法。

Gzip压缩算法分两步。

第一步:采用LZ77算法的一种变种替换字符串。

第二步:使用Huffman树来储存出现的位置和长度。

简单来讲,Gzip把原文本中多次出现的相同字符串标记为一个‘标记’,所以文本中重复出现的字符串越多,压缩率越高。

图片经过Base64转化后变成的文本是无规律的,所以在Gzip中不能达到较高的压缩率。

误区三:考虑缓存了吗?

Base64影响了我们的缓存策略。

我们把样式、图片、字体文件等合并到一起之后,整个变成一个资源,我们无法再分别为它们配置缓存时间,以及更新资源。而图片、字体、HTML和CSS的更新频率都是不一样的。

在平常的项目中,CSS文件的修改频率是较高的,图片其次,而字体文件几乎不改,我们一般会为不同类型的文件设置不同的缓存失效时间,以及在更新某个文件之后单独更新这个文件的时间戳。混在一起之后,即使我们只是想更新CSS规则里面的一个字号,整个几百k的文件就会重新生成。用户不得不在每次小型更新后重新下载整个大文件,这违背了基本的缓存原则。

Base64跟CSS混在一起,难以分别进行缓存设置和更新。

误区四:CSSOM渲染

Base64跟CSS混在一起,大大增加了浏览器需要解析CSS树的耗时。一般解析CSS树的过程是很快的,一般在几十微秒到几毫秒之间。如果CSS文件中混入了Base64,那么(因为文件体积的大幅增长)解析时间会增长到十倍以上。增加的解析时间全部都在关键渲染路径上

有没有适合使用data URI的场景?

有!在某些罕见特例中,也许使用Base64是合理的选择。在规避了以上缺点时,就可以考虑使用它了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容