Skip to content

2026-07-31

/ 8 分鐘閱讀

/ Web Performance Fundamentals

改善 FCP:資源預載(Preconnect 與 Preload) ​

關鍵路徑(Critical Path) ​

要改善 FCP,核心問題是:哪些資源是瀏覽器在繪製第一個畫面之前必須取得的?這條路徑上的任何延遲都會直接推遲 FCP。

以 Google Fonts 為例,這是大多數人使用網路字型的方式。Google Fonts 提供的嵌入程式碼中,包含兩個 link preconnect:

html
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />

preconnect 告訴瀏覽器:「我之後會需要這個網域上的資源,請現在就開始進行 DNS 查詢、建立 TCP 連線、完成 TLS 握手。」這樣等到真正需要資源時,連線已經準備好,可以直接發出請求。

preconnect 只是提前建立連線,不會實際取得任何檔案。

若你已經知道某個資源是必要的,而且它目前要等到某個 CSS 或 JS 執行完才會被發現,可以用 link preload 直接告訴瀏覽器提前去取得它:

html
<link rel="preload" href="/fonts/example.woff2" as="font" crossorigin />

as 屬性必須指定資源類型(font、style、script、image 等),讓瀏覽器知道如何優先排序這個請求。

預載字型和使用 fetch preload 時,必須加上 crossorigin 屬性,因為這些跨來源請求需要伺服器回傳正確的 CORS 標頭。

可以預載的資源類型 ​

  • CSS 樣式表(style)
  • JavaScript(script)
  • 圖片(image)
  • 字型(font)
  • fetch 呼叫(在 JavaScript 尚未執行前就可以預先發出請求,等 JS 醒來後直接使用結果)

更好的做法:自行托管字型 ​

講師特別提到,雖然 preload 可以改善 Google Fonts 的載入順序,但更根本的建議是把字型檔案放在自己的伺服器上,而不是指向 Google 的 URL。

原因有兩個:

穩定性:Google 隨時可能更改其字型檔案的 URL,直接 hardcode 這些 URL 到 preload 中,未來可能會失效。

速度:如果你的網站已經針對 TTFB 做了優化並放在快速的 CDN 上,從自己的伺服器載入字型往往比依賴 Google Fonts 更快。講師從真實使用者資料中觀察到,Google Fonts 的回應時間在第三方資源中通常是最慢的一環。

複習 ​

提前對特定網域建立連線,執行 DNS 查詢與連線設定,在真正需要資源之前完成這些準備工作,減少後續請求時的額外開銷

link preconnect 只是提前對某個網域建立連線,link preload 則是指示瀏覽器實際提早取得某個特定資源,早於它通常被發現的時間點

哪些類型的資源可以被預載? ​

樣式表、腳本、圖片、字型,以及 fetch 呼叫都可以使用 link preload 屬性進行預載

預載字型或使用 fetch preload 時,需要加上哪個特殊屬性? ​

需要加上 crossorigin 屬性,代表該資源必須支援跨來源資源共享(CORS)標頭

載入網路字型的最佳實踐建議是什麼? ​

自行托管字型,將所需的字型檔案放在自己的原始碼中,而非依賴 Google Fonts 等第三方服務,這樣通常能提升效能與可靠性

小測驗 ​

link preload 屬性讓開發者能做什麼? 指示瀏覽器提早取得某個資源,早於它通常被發現的時間點
預載字型或使用 fetch 時,需要加上哪個額外屬性? crossorigin 屬性
哪些類型的資源可以被預載? 樣式表、腳本、圖片、字型與 fetch 呼叫
處理網路字型的建議方式是什麼? 自行托管字型,而非使用外部服務
link preconnect 屬性的作用是什麼? 在需要資源之前,提前對某個網域建立連線

此文章是 FrontendMasters 上的 Web Performance Fundamentals 課程筆記

最後更新時間:

Buy Me A Coffee

系列章節 第 32 篇 / 共 41 篇

0 %
MIT Licensed | Copyright © 2025-present Wen-Hsiu's Blog
Photo by Federica Galli on Unsplash