魯斯前端布魯斯前端

文章中英模式

常見的前端面試題目 - 頁面載入 - Prefetch & Preload 解析

深入理解 Prefetch 與 Preload 技術的差異和應用場景,掌握前端資源優化關鍵技術,提升網站載入速度與使用者體驗。

影片縮圖

懶得看文章?那就來看影片吧

基本概念

Prefetch 和 Preload 是現代瀏覽器提供的資源載入優化技術,它們能幫助開發者控制資源載入的優先順序,大幅提升頁面載入速度和使用者體驗。

  • 1. Preload(預載入)- 提前載入當前頁面必需的關鍵資源
  • 2. Prefetch(預抓取)- 提前載入使用者可能需要的未來資源

這兩種技術雖然名稱相近,但用途和行為完全不同,正確使用對優化網站性能至關重要。

Preload vs Prefetch 資源載入流程:
┌─────────────────────────────────────────────────────┐
│                                                     │
│  Preload                      Prefetch              │
│  ┌───────────────┐           ┌───────────────┐     │
│  │ 關鍵資源       │           │ 未來可能需要的  │     │
│  │ (立即高優先級) │           │ 資源(低優先級)  │     │
│  └───────┬───────┘           └───────┬───────┘     │
│          │                           │             │
│          ▼                           ▼             │
│  ┌───────────────┐           ┌───────────────┐     │
│  │ 立即載入       │           │ 瀏覽器閒置時   │     │
│  │ 參與當前頁面   │           │ 才載入,存入   │     │
│  │ 渲染過程       │           │ 快取供將來使用 │     │
│  └───────────────┘           └───────────────┘     │
│                                                     │
└─────────────────────────────────────────────────────┘

特點:

  • 1. 高優先級 - 優先載入最重要的資源
  • 2. 參與關鍵渲染路徑 (CRP) - 直接影響當前頁面渲染
  • 3. 不會阻塞頁面解析 - 平行下載,不影響 HTML 解析
  • 4. 控制在 4~6 個資源 - 太多會導致性能問題

實現方式:

<!-- 預載入 CSS -->
<link rel="preload" href="critical-styles.css" as="style">

<!-- 預載入字體檔案 -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>

<!-- 預載入 JavaScript -->
<link rel="preload" href="important-script.js" as="script">

<!-- 預載入 LCP 主要圖片 -->
<link rel="preload" href="hero-image.jpg" as="image">

使用情境:

  1. 1. 關鍵 CSS 和 JavaScript - 確保頁面骨架快速呈現
  2. 2. 主要圖片 (LCP 元素) - 縮短最大內容繪製時間
  3. 3. 自訂字體 - 避免字體閃爍,提前載入
  4. 4. 主要 API 資料 - 可用於預載入 JSON 資料

Preload - 當前頁面的關鍵資源

Preload 用於載入當前頁面必需的資源,這些資源會在頁面解析 HTML 的同時就立即開始下載,不會阻塞頁面的解析過程。

特點:

  • 1. 高優先級 - 優先載入最重要的資源
  • 2. 參與關鍵渲染路徑 (CRP) - 直接影響當前頁面渲染
  • 3. 不會阻塞頁面解析 - 平行下載,不影響 HTML 解析
  • 4. 控制在 4~6 個資源 - 太多會導致性能問題

實現方式:

<!-- 預載入 CSS -->
<link rel="preload" href="critical-styles.css" as="style">

<!-- 預載入字體檔案 -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>

<!-- 預載入 JavaScript -->
<link rel="preload" href="important-script.js" as="script">

<!-- 預載入 LCP 主要圖片 -->
<link rel="preload" href="hero-image.jpg" as="image">

使用情境:

  1. 1. 關鍵 CSS 和 JavaScript - 確保頁面骨架快速呈現
  2. 2. 主要圖片 (LCP 元素) - 縮短最大內容繪製時間
  3. 3. 自訂字體 - 避免字體閃爍,提前載入
  4. 4. 主要 API 資料 - 可用於預載入 JSON 資料

Prefetch - 未來可能需要的資源

Prefetch 用於載入未來頁面可能需要的資源,瀏覽器會在閒置時間以低優先級下載這些資源,並放入快取,供將來使用。

特點:

  • 1. 低優先級 - 僅在瀏覽器閒置時處理
  • 2. 不參與當前頁面渲染 - 僅作快取用途
  • 3. 用於未來需求 - 為用戶下一步操作做準備
  • 4. 節省後續載入時間 - 從快取中讀取已經預抓取的資源

實現方式:

<!-- 預抓取下一頁資源 -->
<link rel="prefetch" href="/next-page.html">

<!-- 預抓取 JavaScript 模組 -->
<link rel="prefetch" href="non-critical-bundle.js">

<!-- 預抓取可能需要的圖片 -->
<link rel="prefetch" href="secondary-images.jpg">

使用情境:

  1. 1. 分頁導航 - 預抓取下一頁/上一頁內容
  2. 2. 搜尋結果 - 預抓取排名靠前的搜尋結果頁面
  3. 3. 非關鍵 JS bundle - 預抓取非立即需要的功能模組
  4. 4. 登入/註冊頁面 - 預抓取使用者可能即將訪問的頁面

效能影響與應用技巧

Preload 與 LCP (Largest Contentful Paint)

LCP 是 Core Web Vitals 中的重要指標,反映頁面上最大內容元素呈現的時間。正確使用 Preload 可以大幅改善 LCP 時間。

┌───────────────────────────────────────────────┐
│                                               │
│  未使用 Preload:                              │
│  解析 HTML ──> 發現 LCP 圖片 ──> 開始載入圖片  │
│                                               │
│  使用 Preload:                                │
│  解析 HTML ──┐                                │
│              ├──> 平行載入 LCP 圖片           │
│  繼續解析    ┘                                │
│                                               │
└───────────────────────────────────────────────┘

總結

Preload 和 Prefetch 是現代網頁開發中重要的資源載入優化技術,正確使用它們可以顯著提升網站的載入速度和使用者體驗。

  • 1. Preload - 對當前頁面的關鍵資源進行高優先級載入
  • 2. Prefetch - 對未來可能需要的資源進行低優先級載入

記住:

  1. 1. 控制 Preload 資源數量,避免過度使用
  2. 2. 使用 Prefetch 為用戶的下一步操作做準備
  3. 3. 結合效能監測,確保這些技術真正帶來效能提升

透過策略性地實施這些技術,開發者可以創造更快速、更流暢的網頁瀏覽體驗,提高用戶滿意度並改善轉化率。

🔥 常見面試題目

(一)Preload 和 Prefetch 的主要區別是什麼?

解答:Preload 和 Prefetch 有以下關鍵差異:

特性PreloadPrefetch
用途當前頁面必需的資源未來頁面可能需要的資源
優先級低(閒置時才載入)
時機立即下載瀏覽器閒置時
使用場景當前頁面渲染需要預期用戶下一步操作

代碼範例:

<!-- Preload 範例:當前頁面需要的字體 -->
<link rel="preload" href="fonts/important-font.woff2" as="font" type="font/woff2" crossorigin>

<!-- Prefetch 範例:用戶可能會點擊的下一頁資源 -->
<link rel="prefetch" href="/next-page-assets/main.js">

<!-- 在同一頁面可以同時使用兩種技術 -->
<head>
  <!-- 當前頁面的關鍵CSS -->
  <link rel="preload" href="critical.css" as="style">
  <!-- 用戶可能會訪問的下一頁 -->
  <link rel="prefetch" href="next-page.html">
</head>

(二)什麼情況下應該使用 Preload 而不是正常的資源載入方式?

解答:應在以下情況使用 Preload:

  1. 1. 重要資源在 CSS 中被引用,但被發現太晚(如自訂字體)
  2. 2. 關鍵資源在頁面 HTML 結構深處,被發現太晚
  3. 3. 需要提前載入 LCP 圖片以改善關鍵效能指標
  4. 4. 資源不是由 HTML 解析器直接發現的(如由 JavaScript 動態載入的關鍵資源)

總之,當資源對當前頁面很重要,但在正常載入順序中會被延後發現時,就應該考慮 Preload。

(三)使用 Preload 可能帶來的問題是什麼?如何避免?

解答:主要問題包括:

  1. 1. 過度使用 - 預載入太多資源會分散帶寬,反而拖慢關鍵資源載入
  2. 2. 未使用資源 - 如果預載入後 3 秒內未使用,Chrome 會在控制台顯示警告
  3. 3. 重複請求 - 若設置不當,同一資源可能被請求兩次

避免方法:

  1. 1. 嚴格控制 Preload 數量,通常不超過 4-6 個
  2. 2. 確保每個 Preload 資源都有正確的 as 屬性
  3. 3. 只 Preload 真正關鍵的資源,並確保它們會被立即使用
  4. 4. 監控頁面效能,確認 Preload 確實帶來效能提升
<!-- 範例: 預載入一個關鍵的字體 -->
<link rel="preload" href="/fonts/important-font.woff2" as="font" type="font/woff2" crossorigin="anonymous">