具代表性的面試主題

前端面試:HTTP 103 Early Hints 何時真正改善 LCP?

前端困難
Offer.cc 編輯團隊發佈 更新

題幹

首屏 HTML 由動態 SSR 產生時,如何判斷 HTTP 103 Early Hints 能否改善 LCP?

題幹與適用場景

你負責一個首屏 HTML 需要較久產生的電商首頁。候選方案是在最終回應前送出 103 Early Hints,提前提示關鍵 CSS、字型或腳本。請說明何時有效、如何避免重複下載,以及如何驗證 LCP 是否改善。假設請求是頂層導覽,連線使用 HTTP/2 或 HTTP/3,最終回應仍會送出正確的 Link 標頭。

面試官考察點

  • 能否把 103 說成「提示」而非最終資源清單:瀏覽器可以提前連線或預載,但最終回應仍是權威來源。
  • 能否辨識收益來自伺服器產生 HTML 的等待時間;伺服器立即回傳 200 時,主回應中的 preloadpreconnect 更簡單。
  • 能否處理資源穩定性、快取、跨來源重新導向、瀏覽器支援與通訊協定版本等邊界。
  • 能否用 LCP、快取命中、重複請求與錯誤率驗證,而不是只背狀態碼。

回答前需要釐清的問題

  1. 第一個位元組前的伺服器時間多長? 若幾乎為零,103 沒有可重疊的等待窗口,應先最佳化後端或主回應的資源提示。
  2. 提示的資源是否穩定且必要? 若取決於使用者、實驗或權限結果,誤提示會浪費頻寬;只提示跨頁穩定的關鍵資源。
  3. 請求是否為頂層導覽、連線是否為 HTTP/2+? 瀏覽器對 103 的處理主要針對導覽,並建議在 HTTP/2 或更高版本使用。
  4. 資源是否可快取? 不可快取的預載可能在 HTML 到達後再次下載,收益會變成額外成本。

30 秒回答框架

「我先確認頁面有足夠的伺服器思考時間,以及請求是支援 103 的頂層導覽。接著只提示高機率必要、穩定且可快取的 CSS、字型或連線來源,並在最終回應重複正確的 Link 標頭。若資源取決於實驗或使用者權限,我不會提前提示。上線前後用真實導覽比較 TTFB 到資源請求的重疊、LCP、重複下載與頻寬;遇到跨來源重新導向或不支援的用戶端則回退到一般回應。」

分步驟深入解答

1. 先計算可重疊的時間窗口

103 讓瀏覽器在伺服器準備最終 HTML 時開始連線或下載資源。可獲得的上限接近「伺服器準備時間減去瀏覽器收到最終回應後才開始請求資源的時間」。伺服器很快回傳 200 時,窗口接近零,Chrome 官方建議使用主回應中的一般 Link 或 HTML link

2. 選擇穩定資源,不要複製全部 HTML 提示

Early Hints 沒有最終 HTML,也不知道使用者最後看到的變體。適合的候選包括穩定的主 CSS、共用腳本、字型與關鍵 CDN 連線。個人化圖片、實驗分支腳本和權限資源應留在最終回應之後。可以把資源拆成穩定部分和動態部分:前者提前提示,後者由 HTML 決定。

3. 把快取與通訊協定當成正確性條件

預載資源必須能被最終頁面重用;若資源不可快取,瀏覽器可能先下載一次,HTML 到達後再觸發一次。跨來源資源還要維持正確的 crossorigin 語意。MDN 建議優先在 HTTP/2 或更高版本送出 103,舊用戶端或中介設備可能無法正確處理 1xx 回應。

4. 保留最終回應的權威宣告

最終回應應繼續送出 Link 標頭,作為不支援 103 用戶端的回退,也補上產生 HTML 期間才知道的動態資源。若最終結果發生跨來源重新導向,瀏覽器可能丟棄早期建立的連線和資源;因此不能把 103 當成不可撤銷的下載指令。

5. 用實驗驗證,而不是假設收益

在支援與不支援 Early Hints 的真實導覽上分組,記錄伺服器思考時間、資源請求開始時間、LCP、重複請求位元組和錯誤率。Chrome DevTools 可觀察 Early Hints initiator 與快取命中,但測試時不能關閉快取。若 LCP 沒改善,檢查提示資源是否已在快取、是否太晚送出、是否被重新導向丟棄,或伺服器等待本身才是瓶頸。

6. 與 HTTP/2 Push 的差異

103 只提供線索,由瀏覽器決定是否連線或取得;HTTP/2 Push 直接推送,容易重複傳送瀏覽器已快取的資源。面試時應強調 103 的控制權留在用戶端,代價是仍需一個網路往返並受瀏覽器支援限制。

高品質示範回答

我會先看第一個位元組前的伺服器時間。如果首頁 SSR 需要 300 毫秒,而主 CSS 和字型每次導覽都穩定存在,103 可以讓瀏覽器把連線和下載放進這 300 毫秒。我只會放穩定、可快取的資源,確保跨來源字型帶上正確的 crossorigin;個人化圖片和實驗腳本不提前發。最終回應仍送出 Link,讓不支援 103 的用戶端也能正常載入。

我不會把它當成加上狀態碼就一定提速。我要用真實導覽做對照實驗,比較 LCP、資源請求起點、重複下載位元組和跨來源重新導向比例。若伺服器很快回傳 200、資源已在快取,或提示資源常被最終頁面否決,一般主回應提示甚至不做預載會更合適。這同時涵蓋收益窗口、錯誤成本和回退路徑。

常見錯誤

  • 錯誤表現 → 認為 103 等同於 200。 失敗原因:103 是資訊提示,最終回應才決定資源和狀態。修正方法:說明提示可被忽略,並保留最終 Link
  • 錯誤表現 → 把所有 HTML 的 preload 原樣複製到 103。 失敗原因:早期階段沒有使用者變體資訊,動態資源會浪費。修正方法:只選擇穩定且高機率必要的資源。
  • 錯誤表現 → 只看 LCP,不看重複下載。 失敗原因:預載不可快取或跨來源屬性錯誤時,表面上可能較早請求卻增加總位元組。修正方法:同時記錄快取重用、重複請求、頻寬和錯誤率。
  • 錯誤表現 → 預設對所有 HTTP/1.1 請求送出。 失敗原因:用戶端和中介設備對 1xx 支援不一致,而且 Early Hints 主要針對導覽。修正方法:依協定、請求類型和用戶端能力啟用,準備一般回應回退。

追問及應對

如果最終回應經常 302 到另一個來源,還該送 103 嗎?

要謹慎。MDN 與 Chrome 資料都指出,跨來源重新導向後瀏覽器可能丟棄早期資源和連線。先把 103 限定在穩定的最終入口,或只提示不會因重新導向失效的同源資源,並以重新導向比例作為門檻。

如果 CSS 在不同實驗組不同,如何提示?

只提示所有實驗組共用的基礎 CSS,實驗專屬部分留到最終 HTML。若沒有穩定交集,就不要預載;錯誤預取的頻寬成本可能超過節省的等待時間。

如何證明收益來自 103 而不是快取變熱?

使用相同快取狀態的隨機分組,分別記錄冷快取和熱快取。比較資源請求與伺服器思考時間的重疊,而不只比較單次 LCP;同時檢查 Early Hints initiator、快取命中和重複下載。

瀏覽器不支援某個 Early Hints 指令怎麼辦?

保留最終回應的 Link 和 HTML 宣告作為回退。先送出相容性較廣的 preconnect,對 preload 則依目標瀏覽器支援矩陣逐步啟用,並監控錯誤率。

公開來源

同類題目