web性能優化-預加載

編輯于2015年

Patrick Hamann 對此的說明
Pre-fetching會提示瀏覽器那些未來一定或可能使用到的資源,有時在當前頁面見效,有些則在未來可能打開的頁面生效。 作為開發者,我們比瀏覽器更懂自己的應用。我們可以利用這些技術提前告知瀏覽器web中用到的核心資源。

以前這種實踐也被稱為『prebrowsing』。但這并不是一種單一的技術,實際上可以拆分成很多小點:dns-prefetch, subresource, prefetch, preconnect, 和 prerender.

DNS prefetch

DNS prefetching通過指定具體的URL來告知客戶端未來會用到相關的資源,這樣瀏覽器可以盡早的解析DNS。比如我們需要一個在example.com的圖片或者視頻文件。在<head>就可以這么寫:

<link rel="dns-prefetch" >

當請求這個域名下的文件時就不需要等待DNS查詢了。項目中有用到第三方的代碼時這么做尤其有益(譯者注:其他的使用場景,比如當靜態資源和HTML不在一個域上,而在CDN上;又比如在重定向前可以加上DNS prefetch)。
Harry Roberts在他的前端性能優化文章中建議:
簡單的一行就能讓支持的瀏覽器提前解析DNS。也就是說在瀏覽器請求資源時,DNS查詢就已經準備好了。

這可能看起來是個非常微不足道的性能提升,而且還不是必須的–Chrome總是會做類似的處理,用戶只要在地址欄敲入一部分域名,如果命中了歷史常用的網站,Chrome就會提前解析DNS、預拉取頁面。(譯者注:效果確實有限,但是聊勝于無)

Preconnect

和DNS prefetch類似,preconnect不光會解析DNS,還會建立TCP握手連接和TLS協議(如果需要)。用法如下:

<link rel="preconnect" >

Ilya Grigorik寫了一篇文章詳細說明了這種技術:
現代瀏覽器竭盡所能的嘗試預測網站可能需要哪些鏈接。通過提前連接,瀏覽器可以提前建立必要的通信,消除了實際請求中DNS、TCP和TLS的耗時。不過,即使是只能的現代瀏覽器,也沒辦法為每個網站可靠的預測所有連接。
幸運的是開發者可以告訴瀏覽器哪些通信需要在實際請求發起前就提前建立連接。
舉個栗子:

image.png

上半張圖顯示了瀏覽器先拉html、再拉CSS并建立好CSSOM后,發現需要兩個外鏈的字體(在fonts.gstatic.com上),然后瀏覽器開始發起兩個請求,具體來說,需要對這個域進行DNS解析、TCP和TLS握手(一個建立后可以復用給另一個連接)。

<link  rel='preconnect' crossorigin>
<link  rel='stylesheet'>

下半張圖增加了上面的代碼來從fonts.gstatic.com preconnect資源。可以看到,瀏覽器在請求CSS的同時并行的建立字體資源需要的連接,等到真正開始需要字體時立刻就開始返回數據。
更多詳細的內容可以參考Ilya Grigorik的文章。
目前只支持Firefox 39+和Chrome 46+,具體參見caniuse

Prefetch

當能確定網頁在未來一定會使用到某個資源時,開發者可以讓瀏覽器提前請求并且緩存好以供后續使用。prefetch支持預拉取圖片、腳本或者任何可以被瀏覽器緩存的資源。
不同于DNS prefetch,上面的寫法可是會去請求、下載資源并且緩存起來。當然也是有一些發生條件的。比如,客戶端可能會在弱網絡下不去請求較大的字體文件,Firefox則只會在瀏覽器空閑的時候prefetch資源(譯者注:這里是MDN上對瀏覽器空閑的定義和一些FAQ,建議閱讀)。
正如Bram Stein在他的文章中指出,prefetch很適用于優化webfonts的性能。以前,字體文件必須等DOM和CSSOM創建好后才能下載,可如果prefetch了字體,這個瓶頸就能輕松解決了。
注意:prefetch并沒有同域的限制

caniuse

Subresource

subresource可以用來指定資源是最高優先級的。比如,在Chrome和Opera中我們可以加上下面的代碼:

<link rel="subresource" href="styles.css">

Chromium的文檔這么解釋:
和 "Link rel=prefetch"的語義不同,"Link rel=subresource"是一種新的連接關系。rel=prefetch指定了下載后續頁面用到資源的低優先級,而rel=subresource則是指定當前頁面資源的提前加載。

所以,如果資源是在當前頁面需要,或者馬上就會用到,則推薦用subresource,否則還是用prefetch。

Prerender

prerender是一個重量級的選項,它可以讓瀏覽器提前加載指定頁面的所有資源。


<link rel="prerender"  href="/thenextpage.html" />

Steve Souders的文章詳細解釋了這個技術:
prerender就像是在后臺打開了一個隱藏的tab,會下載所有的資源、創建DOM、渲染頁面、執行JS等等。如果用戶進入指定的鏈接,隱藏的這個頁面就會進入馬上進入用戶的視線。Google Search多年前就利用了這個特性實現了Instant Pages功能。微軟最近也宣布會讓Bing在IE11上用類似prerender的技術。

但是要注意,一定要在十分確定用戶回點某個鏈接時才用這個特性,否則客戶端就會無端的下載很多資源和渲染這個頁面。
正如任何提前的動作一樣,預判總是有一定風險出錯。如果提前的動作是昂貴的(比如高CPU、耗電、占用帶寬),就要謹慎使用了。雖然不容易預判用戶會點進哪個頁面,但還是存在一些典型的場景:
如果用戶搜索到了一個明顯正確的結果時,那么這個頁面就很有可能被點入
如果用戶在登錄頁面,那么登錄成功后的頁面就很可能接下來會被加載了
如果用戶在閱讀一個多頁面的文章或者有頁碼的內容時,下一頁就很可能會馬上被點擊了

利用Page Visibility API可以用來防止頁面在還沒真正展示給用戶時就觸發了JS的執行。

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

推薦閱讀更多精彩內容

  • 網頁性能基礎: http://www.alloyteam.com/2015/05/wang-ye-xing-nen...
    raincoco閱讀 1,668評論 0 0
  • 在這個前端用戶體驗越來越重要的時代,你的頁面稍微有點卡頓,都難以挽留用戶。而作為一名有追求的前端,勢必要力所能及地...
    SCQ000閱讀 3,838評論 0 52
  • 在這個前端用戶體驗越來越重要的時代,你的頁面稍微有點卡頓,都難以挽留用戶。而作為一名有追求的前端,勢必要力所能及地...
    程序員小布的養生之道閱讀 1,086評論 0 50
  • 圍繞前端的性能多如牛毛,涉及到方方面面,以我我們將圍繞PC瀏覽器和移動端瀏覽器的優化策略進行羅列注意,是羅列不是展...
    流動碼文閱讀 693評論 0 0
  • 很長一段時間忘記了自己,每天做著同樣的事情,甚至吃著同樣的午餐。不想說話不想動。我看著鏡子里的我,陌生得不像話...
    D061張琴閱讀 112評論 0 0