預先載入回應式圖片

從 Chrome 73 版開始,使用者可以結合連結 rel="preload" 和回應式圖片,加快圖片載入速度。

瀏覽器支援

  • 73
  • 79
  • 78
  • 17.2

這篇文章讓我有機會討論兩大重點:回應式圖片「和」預先載入。身為負責同時開發這兩項功能的人員,我很高興能一起開發這些功能!

回應式圖片總覽

假設您瀏覽網頁時寬度為 300 像素,而網頁剛才要求的圖片寬度為 1500 像素。因為螢幕無法使用額外的解析度,導致該頁面只耗用大量行動數據流量。在理想情況下,瀏覽器會擷取比螢幕尺寸更寬的圖片版本,例如 325 像素。確保高解析度影像不會浪費數據。更棒的是,圖片載入速度也會更快。回應式圖片可讓瀏覽器擷取不同圖片資源到不同裝置。如果您沒有使用 image CDN,就必須為每張圖片儲存多個尺寸,並在 srcset 屬性中指定這些尺寸。w 值會告知瀏覽器每個版本的寬度。視裝置而定,瀏覽器可以選擇合適的瀏覽器:

<img src="small.jpg" srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 1500w" alt="…">

預先載入總覽

「預先載入」可讓您告訴瀏覽器,您想在 HTML 中發現相關的重要資源時盡快載入。這對搜尋不易找到的資源特別有用,例如樣式表中的字型、背景圖片或從指令碼載入的資源。

<link rel="preload" as="image" href="important.png">

回應式圖片 + 預先載入 = 加快圖片載入速度

回應式圖片和預先載入功能過去幾年已經推出,但當時還少了一點:無法預先載入回應式圖片。從 Chrome 73 版開始,瀏覽器可以在發現 img 標記之前,預先載入 srcset 中指定的正確回應式圖片變化版本!

視網站的結構而定,圖片顯示的速度可能會大幅加快!我們在網站上使用 JavaScript 延遲載入回應式圖片的網站執行測試。預先載入功能讓圖片載入速度加快 1.2 秒。

imagesrcsetimagesizes

如要預先載入回應式圖片,最近為 <link> 元素新增了新屬性:imagesrcsetimagesizes。這些運算子會與 <link rel="preload"> 搭配使用,且符合 <img> 元素中使用的 srcsetsizes 語法。

舉例來說,如果您想預先載入使用以下項目的回應式圖片:

 <img src="wolf.jpg" srcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" sizes="50vw" alt="A rad wolf">

方法是將下列程式碼新增至 HTML 的 <head>

<link rel="preload" as="image" href="wolf.jpg" imagesrcset="wolf_400px.jpg 400w, wolf_800px.jpg 800w, wolf_1600px.jpg 1600w" imagesizes="50vw">

這會使用與 srcsetsizes 相同的資源選擇邏輯啟動要求。

用途

預先載入動態插入的回應式圖片

假設您要在投影播放中動態載入主頁橫幅,並知道首先顯示哪一張圖片。在這種情況下,建議您避免等到指令碼載入後再載入相關圖片,因為這會造成使用者看到圖片的時間稍晚。

如要檢查這個問題,請使用動態載入的圖片庫網站:

  1. 在新分頁中開啟這個範例網站

  2. 按下 `Control+Shift+J 鍵 (在 Mac 上為 Command+Option+J 鍵) 開啟開發人員工具。

  3. 按一下 [網路] 分頁標籤。

  4. 在「Throttling」下拉式清單中選取「Fast 3G」

  5. 停用「停用快取」核取方塊。

  6. 重新載入網頁。

Chrome 開發人員工具「Network」面板的螢幕截圖。
這個刊登序列顯示圖片只有在瀏覽器執行完指令碼後才會開始載入,因此對於圖片初次向使用者顯示的時間,會帶來不必要的延遲。

使用 preload 就有助於這裡,因為圖片會事先載入,並且可能會在瀏覽器需要顯示圖片的時候到達該圖片。

Chrome 開發人員工具「Network」面板的螢幕截圖。
這個刊登序列顯示第一張圖片同時開始載入指令碼,避免造成不必要的延遲,進而加快圖片顯示速度。

如要瞭解預先載入功能帶來的差別,您可以按照第一個範例中的步驟,檢查同一個動態載入的圖片庫,但是預先載入第一個圖片

使用圖片集預先載入背景圖片

如果您針對不同螢幕密度使用不同的背景圖片,可以在 CSS 中使用 image-set 語法指定這些圖片。瀏覽器接著即可根據螢幕的 DPR 選擇要顯示哪一個裝置。

background-image: image-set( "cat.png" 1x, "cat-2x.png" 2x);

CSS 背景圖片的問題在於,只有在網頁 <head> 中下載並處理所有 CSS 之後,瀏覽器才能找到這些圖片,這類資訊可以是大量 CSS...

你可以在含有回應式背景圖片的範例網站上檢查這個問題。

Chrome 開發人員工具「Network」面板的螢幕截圖。
在這個例子中,系統會等到 CSS 下載完成之後,才開始下載圖片,導致圖片出現不必要的延遲。

回應式圖片預先載入可讓您輕鬆快速地載入這些圖片,完全無需入侵。

<link rel="preload" as="image" imagesrcset="cat.png 1x, cat-2x.png 2x">

請注意,排除 href 屬性可確保瀏覽器不支援 <link> 元素中的 imagesrcset,但支援 CSS 中的 image-set,不會下載錯誤來源。不過在這種情況下,他們也不會受惠於預先載入的內容。

您可以透過預先載入的回應式背景圖片,查看上述範例的行為。

Chrome 開發人員工具「Network」面板的螢幕截圖。
這張圖片和 CSS 會同時開始下載,以避免延遲,進而加快圖片載入速度。

預先載入回應式圖片的實際運作情形

預先載入回應式圖片雖然可以在理論上加快速度,但實際上該怎麼做?

為了回答這個問題,我建立了兩個示範版 PWA 商店的副本:一個未預先載入圖片預先載入部分圖片。網站延遲載入會使用 JavaScript 載入圖片,因此建議您預先載入在初始可視區域中的圖片。

以上結果顯示「不預先載入」和「圖片預先載入」的結果。從原始數據來看,「Start Render」保持不變,速度指數稍微改善 (273 毫秒,因為圖片抵達速度較快,但不會佔用大量像素區域),而真正能看出兩者間的差異是「上次繪製主頁橫幅」指標,這個指標增加了 1.2 秒。🎉🎉

當然,任何元素都不會帶來視覺差異,就像幻燈片比較一樣:

顯示預先載入圖片的 WebPageTest 幻燈片比較結果螢幕截圖,顯示速度快了 1.5 秒。
幻燈片顯示圖片在預先載入時可大幅加快顯示速度,提供大幅改善的使用者體驗。

要預先載入並<picture>嗎?

如果您很熟悉回應式圖片,可能會想知道「<picture> 怎麼了?」。

網路效能工作小組是指為 srcsetsizes 新增對等的預先載入項目,而不是針對處理「藝術方向」使用案例的 <picture> 元素。

為什麼這種用途會「忽視」?

雖然也希望解決這個用途,但仍有一些技術問題需要釐清,但這也表示這裡的解決方案十分複雜。最重要的是,看來大部分用途似乎都沒有問題,即使網站遭到入侵 (請見下方說明) 也一樣。

因此,網站效能 WG 決定優先推出 srcset,並評估是否增加對等 picture 的需求。

如果您發現自己有預先載入 <picture> 的位置,或許可以使用以下技巧來解決問題。

請看以下情境:

<picture>
    <source srcset="small_cat.jpg" media="(max-width: 400px)">
    <source srcset="medium_cat.jpg" media="(max-width: 800px)">
    <img src="large_cat.jpg">
</picture>

為精確指定 <picture> 元素的邏輯 (或圖片來源選取邏輯),請依序查看 <source> 元素的 media 屬性、找出第一個相符的屬性,並使用附加的資源。

由於回應式預先載入沒有「順序」或「第一個相符」的概念,因此您必須將中斷點轉譯為類似如下的內容:

<link rel="preload" href="small_cat.jpg" as="image" media="(max-width: 400px)">
<link rel="preload" href="medium_cat.jpg" as="image" media="(min-width: 400.1px) and (max-width: 800px)">
<link rel="preload" href="large_cat.jpg" as="image" media="(min-width: 800.1px)">

預先載入並type

<picture> 元素也支援第一個 type 比對,以提供不同的圖片格式,並讓瀏覽器選擇其支援的第一個圖片格式。預先載入功能目前不支援這個用途。

對使用這種配置的網站而言,避免預先載入是最好的選擇,而是讓預先載入掃描器<picture><source> 元素取得這些項目。這種做法同樣是最佳做法,尤其是支援優先提示。這樣一來,系統就能優先顯示適當圖片,而非只預先載入適當圖片。

對最大內容繪製 (LCP) 的影響

由於圖片可能適用於最大內容繪製 (LCP),因此預先載入圖片或許能改善網站的 LCP。使用上述技術也能確保回應式圖片能更快載入。

請注意,無論您要預先載入的圖片是否具有回應式功能,請注意預先載入在初始標記酬載中無法找到圖片資源時,載入效果會特別好。至於能夠透過伺服器傳送完整標記的網站,您可能無法從中獲得巨大優勢。不過,如果網站在用戶端上算繪標記 (側載瀏覽器的預先載入掃描器),你就能在表格中預先載入可能的 LCP 圖片以提升效能。

摘要

回應式圖片預先載入開創了更多令人興奮的可能,那就是預先載入回應式圖片,以前只能透過駭客入侵的方式進行。對於注重速度的開發人員,這是一項重要的新工具,可讓我們確保重要的圖片能在需要時快速呈現給使用者。