談談Data URI在性能優(yōu)化中的作用

URI:統(tǒng)一資源標識符。由一個‘協(xié)議’和‘定位符’組成。定位符其實是補充信息,它可以是一個地址(如果是這樣的話,那這個URI就是一個URL),也可以是數(shù)據(jù)本身(比如 data URI),或者命名空間(URN).

URI較URL是一個更廣的概念,或者說URL是最常見的一種URI。所以Data URI不是URL。

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

它允許文檔直接使用一小段數(shù)據(jù)作為"即時數(shù)據(jù)",而不是之前那樣必須引用外部資源

隨后,文檔定義了data URI的格式:

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

在這種格式中,data:就是URI的協(xié)議,表明就是一個data URI。

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

我們一般指定base64編碼方式,如果不填,默認是低效的URL編碼。

對于非英文字符串,URL編碼是一種非常浪費空間的編碼方式。URL編碼在地址欄中很常見,對于URL安全的字符(比如英文字母、數(shù)字、中劃線、下劃線等)就直接顯示,對于URL不安全的字符(比如非英文的字符)就編碼成%XX的形式。

二進制文件中包含很多URL不安全的字符,所以轉(zhuǎn)成URL編碼字符之后很冗長。因此所以有了base64編碼。(關(guān)于base64編碼http://www.lxweimin.com/writer#/notebooks/3331706/notes/11322163)。

通過對比 Base64編碼明顯比URL編碼小很多(但是因為使用了6個比特而不是8個比特,所以仍然比壓縮過的二進制文件大一些)

因此,當我們提到data URI時,99%同時是指配套使用base64編碼技術(shù),來把一個二進制資源文件(比如字體或圖片)合并到主文檔(可能是HTML,可能是CSS)中。

性能神器還是棄之可惜的雞肋?

誤區(qū)一:節(jié)省請求等于性能優(yōu)化?

對于前端來說,顯而易見好處是能夠減少圖片的HTTP請求,而缺點可能是不夠顯而易見。

樣式表會變得很大,從而阻塞關(guān)鍵下載和渲染。

通俗地講,圖片文件或字體文件的體積轉(zhuǎn)移到了HTML或CSS中,而后者的體積直接影響到渲染,導致用戶會長時間注視空白屏幕。HTML和CSS阻塞渲染,圖片不會。

這是Base64的第一個缺點,資源合并到CSS文件中導致體積增大,進而阻塞關(guān)鍵路徑。

誤區(qū)二:Base64 能獲益于Gzip壓縮?

Gzip是在web前端最常見的一種壓縮文本的方法。

Gzip壓縮算法分兩步。

第一步:采用LZ77算法的一種變種替換字符串。

第二步:使用Huffman樹來儲存出現(xiàn)的位置和長度。

簡單來講,Gzip把原文本中多次出現(xiàn)的相同字符串標記為一個‘標記’,所以文本中重復出現(xiàn)的字符串越多,壓縮率越高。

圖片經(jīng)過Base64轉(zhuǎn)化后變成的文本是無規(guī)律的,所以在Gzip中不能達到較高的壓縮率。

誤區(qū)三:考慮緩存了嗎?

Base64影響了我們的緩存策略。

我們把樣式、圖片、字體文件等合并到一起之后,整個變成一個資源,我們無法再分別為它們配置緩存時間,以及更新資源。而圖片、字體、HTML和CSS的更新頻率都是不一樣的。

在平常的項目中,CSS文件的修改頻率是較高的,圖片其次,而字體文件幾乎不改,我們一般會為不同類型的文件設置不同的緩存失效時間,以及在更新某個文件之后單獨更新這個文件的時間戳。混在一起之后,即使我們只是想更新CSS規(guī)則里面的一個字號,整個幾百k的文件就會重新生成。用戶不得不在每次小型更新后重新下載整個大文件,這違背了基本的緩存原則。

Base64跟CSS混在一起,難以分別進行緩存設置和更新。

誤區(qū)四:CSSOM渲染

Base64跟CSS混在一起,大大增加了瀏覽器需要解析CSS樹的耗時。一般解析CSS樹的過程是很快的,一般在幾十微秒到幾毫秒之間。如果CSS文件中混入了Base64,那么(因為文件體積的大幅增長)解析時間會增長到十倍以上。增加的解析時間全部都在關(guān)鍵渲染路徑上

有沒有適合使用data URI的場景?

有!在某些罕見特例中,也許使用Base64是合理的選擇。在規(guī)避了以上缺點時,就可以考慮使用它了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內(nèi)容