Xlenco

Xlenco

github
zhihu
email

dns-prefetch、prefetch、preload、defer、async 字段的區別

1、dns-prefetch#

域名轉化為 ip 是一個比較耗時的過程,dns-prefetch 能讓瀏覽器空閒的時候幫你做這件事。尤其大型網站會使用多域名,這時候更加需要 dns 預取。

<link rel="dns-prefetch" href="//baidu.com" />

2、prefetch#

prefetch 一般用來預加載可能使用的資源,一般是對使用者行為的一種判斷,瀏覽器會在空閒的時候加載 prefetch 的資源。

<link rel="prefetch" href="http://www.baidu.com/" />

3、preload#

prefetch 不同,prefecth 通常是加載接下來可能用到的頁面資源,而 preload 是加載當前頁面要用的腳本、樣式、字體、圖片等資源。所以 preload 不是空閒時加載,它的優先級更強,並且會佔用 http 請求數量。

<link rel="preload" href="style.css" as="style" />

as 值包括#

  • script
  • style
  • image
  • media
  • document onload 方法是資源加載完成的回調函數

4、preconnect#

當瀏覽器向伺服器請求一個資源的時候,需要建立連接,而建立一個安全的連接需要經歷以下 3 個步驟:

  • 查詢域名並將其解析成 IP 地址(DNS Lookup);
  • 建立和伺服器的連接(Initial connection);
  • 加密連接以確保安全(SSL);

以上 3 個步驟瀏覽器都需要和伺服器進行通訊,而這一來一往的請求和響應勢必會耗費不少時間。
當我們的站點需要對別的域下的資源進行請求的時候,就需要和那個域建立連接,然後才能開始下載資源,如果我都已經知道了是和哪個域進行通訊,那不就可以先建立連接,然後等需要進行資源請求的時候就可以直接進行下載了。對比正常請求和配置了 preconnect 時候的請求,它們在請求時間軸上看到的表現是不一樣的。
通過如下配置可以提前建立和 https://example.com 這個域的連接:

<link rel="preconnect" href="https://example.com">

通過 preconnect 提早建立和第三方源的連接,可以將資源的加載時間縮短 100ms ~ 500ms,這個時間雖然看起來微不足道,但是它是實實在在的優化了頁面的性能,提升了使用者的體驗。

通過 preconnect 和別的域建立連接後,應該儘快的使用它,因為瀏覽器會關閉所有在 10 秒內未使用的連接。不必要的預連接會延遲其他重要資源,因此要限制 preconnect 連接域的數量。

5、deferasync#

//defer
<script defer src="script.js"></script>
//async
<script async src="script.js"></script>

deferasync 都是異步 (並行) 加載資源,不同點是 async 是加載完立即執行,而 defer 是加載完不執行,等到所有元素解析完再執行,也就是 DOMContentLoaded 事件觸發之前。 因為 async 加載的資源是加載完執行,所以它比不能保證順序,而 defer 會按順序執行腳本。
-162351542.png

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。