Featured image of post 使用 DNS 預取和預連線加速資產加載Featured image of post 使用 DNS 預取和預連線加速資產加載

使用 DNS 預取和預連線加速資產加載

透過在 HTML 標頭中引入 dns-prefetch 和預連接資源提示來減少連線開銷。

介紹

每個外部資源(字體、腳本、映像、API 端點)都需要網路連線。 DNS 解析TCP 握手TLS 協商的開銷可能會導致頁面載入時間增加數百毫秒。 資源提示dns-prefetchpreconnect 讓您告訴瀏覽器在實際需要資源之前提前執行這些步驟。


連接成本

建立 HTTPS 連線涉及多次往返:

步驟延遲(大約)
DNS 查找20-120 毫秒
TCP握手1 個RTT
TLS 協商2 即時傳輸時間
總計3+ RTT

在 3G 連線(300 毫秒 RTT)上,傳輸任何資料之前需要近 1 秒的開銷。資源提示消除了大部分內容。


DNS 預取

dns-prefetch 提前解析網域

<link rel="dns-prefetch" href="https://fonts.googleapis.com">

這會在瀏覽器仍在解析 HTML 的同時啟動網域的 DNS 查找。當瀏覽器遇到來自該來源的資源時,IP 位址已被快取。

何時使用: 簡單地引用外部網域。它是輕量級的-只有 DNS 解析,沒有開啟連線。


預連接

preconnect 更進一步:它執行 DNS 查找 + TCP 握手 + TLS 協商

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

使用 CORS 模式載入的資源(字體、取得請求等)需要 crossorigin 屬性。

何時使用: 頁面盡快需要的關鍵第三方來源 - Web 字體提供者、分析端點、CDN。


預連接與預取/預載

這些提示有不同的用途:

提示行動使用案例
佔位符_0僅解析 DNS低優先權來源
佔位符_0DNS + TCP + TLS關鍵的第三方來源
佔位符_0下載+快取資源未來導覽
佔位符_0下載目前頁資源目前頁面的關鍵資產

想想層次結構:dns-prefetch 最便宜,preconnect 成本更高但節省更多,preload 實際上下載資源。


實用的 HTML 範例

網頁字體(最常見的用例)

<head>
  <link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
  <link rel="dns-prefetch" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
</head>

第三方API

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

分析和 CDN

<link rel="dns-prefetch" href="https://www.googletagmanager.com">
<link rel="preconnect" href="https://cdn.example.com" crossorigin>

Cloudflare 和 TTFB 注意事項

如果您使用 Cloudflare 或類似的 CDN,資源提示仍然很有價值。儘管 Cloudflare 提供了快速優勢,但新用戶的首次連接仍然需要 DNS 和 TLS。新增 preconnect 透過消除連線設定時間來減少 TTFB(第一個位元組的時間)

衡量影響:

<!-- Before optimization -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">

<!-- After optimization -->
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">

用 Lighthouse 衡量影響

Lighthouse 審核 「預先連線至所需來源」 下的資源提示。開啟 Chrome DevTools → Lighthouse → 執行審核。尋找:

  • 機會:預先連接到所需的來源
  • 預計節省:最多幾百毫秒

您也可以使用啟用「停用快取」的 網路面板 進行手動測試:

// Before vs. after — check connection timing
// Target: < 100ms connection time for preconnected origins

最佳實踐

  1. 將預先連線限制為 3-6 個來源 - 每個來源開啟一個真實的套接字
  2. 總是為字體和 CORS 資源新增 crossorigin
  3. 不要預先連接到您自己的來源 - 瀏覽器已經這樣做了
  4. 針對不支援預先連線的瀏覽器,將分層 dns-prefetch 作為後備
  5. 站點變更後定期與 Lighthouse 進行審核
<!-- Fallback pattern: both hints for wide support -->
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>

結論

dns-prefetchpreconnect 是省力、高影響力的最佳化,可減少外部資源的連接開銷。使用 dns-prefetch 作為許多來源的輕量級提示,並為 3-6 個最關鍵的第三方來源保留 preconnect。與 preload 和適當的快取結合,這些提示可以將頁面載入時間縮短數百毫秒。