最佳化最大內容繪製

說明如何分析 LCP,並找出需要改善的部分的逐步指南。

最大內容繪製 (LCP)網站體驗核心指標指標之一,代表網頁主要內容的載入速度。具體來說,LCP 會測量從使用者開始載入網頁到在可視區域中顯示最大圖片或文字區塊所需的時間。

為提供良好的使用者體驗,網站應力求讓 LCP 達到 2.5 秒,且網頁造訪次數至少要有 75%

良好的 LCP 值不能超過 2.5 秒,值越低值超過 4.0 秒,而且需要改善
良好的 LCP 值不得超過 2.5 秒。

有許多因素會影響瀏覽器載入及轉譯網頁的速度,只要任何因素發生延遲,就會對 LCP 造成重大影響。

只稍微修正網頁的某個部分,就能有效提升 LCP。如要改善 LCP,請務必查看整個載入程序,確認過程中每個步驟都已最佳化。

瞭解 LCP 指標

將 LCP 最佳化前,開發人員應設法瞭解自己是否發生 LCP 問題,以及這類問題的影響程度。

LCP 指標可透過多種工具進行評估,而且並非所有工具都能以相同方式測量 LCP。為了瞭解實際使用者的 LCP,我們必須關注實際使用者的情況,而不是以研究室為基礎的工具 (如 Lighthouse 或本地測試) 所呈現的效果。這些實驗室式工具能提供大量資訊,協助您說明及協助改善 LCP。不過請注意,光是實驗室測試,未必完全反映實際使用者體驗的體驗。

如要顯示以實際使用者為基礎的 LCP 資料,可透過網站上安裝的實際使用者監控 (RUM) 工具,或使用 Chrome 使用者體驗報告 (CrUX),收集數百萬個網站的實際 Chrome 使用者匿名資料。

使用 PageSpeed Insights CrUX LCP 資料

PageSpeed Insights 則是存取 CrUX 資料 (位於「探索實際使用者所體驗」部分)。如要查看更詳細的研究室資料,請參閱底部的「診斷效能問題」部分。如果可取得網站 CrUX 資料,請一律先將重心放在真正的使用者資料上,

PageSpeed Insights 中顯示的 CrUX 資料
PageSpeed Insights 中顯示的 CrUX 資料。

PageSpeed Insights 最多可顯示四種不同的 CrUX 資料:

  • 這個網址的「行動裝置」資料
  • 「這個網址」的「電腦」資料
  • 整個 Origin行動數據資料
  • 整個來源電腦資料

您可以在本節頂部和右上方的控制項中切換。如果網址資料不足,無法在網址層級顯示,但確實有來源資料,PageSpeed Insights 一律會顯示原始資料。

PageSpeed Insight 改回使用未提供網址層級資料的來源層級資料
如果 PageSpeed Insights 沒有網址層級資料,會顯示來源層級資料。

整個來源的 LCP 可能與個別網頁的 LCP 有極大差異,具體取決於該網頁的 LCP 載入方式以及該來源的其他網頁。訪客瀏覽這些網頁的方式也可能受到影響。新的使用者可能會注意到首頁,因此在載入任何快取內容的情況下,通常會「冷靜」,因此通常是網站中最慢的網頁。

查看 CrUX 資料四個類別,可協助您瞭解某個 LCP 問題是與這個網頁有關,還是較常見的網站問題。同樣地,也會顯示哪些裝置類型有 LCP 問題。

使用 PageSpeed Insights CrUX 補充指標

想要最佳化 LCP 的使用者也應使用首次顯示內容所需時間 (FCP)第一個位元組時間 (TTFB) 時間,這兩項實用的診斷指標可以為 LCP 提供寶貴的深入分析資訊。

TTFB 是指訪客開始前往某個網頁 (例如按一下連結) 到收到 HTML 文件第一個位元組的時間。TTFB 偏高可能導致 2.5 秒 LCP 充滿挑戰,甚至無法實現。

TTFB 偏高的原因可能是多個伺服器重新導向、距離最近網站伺服器較遠的訪客、網路狀況不佳的訪客,或是因為查詢參數而無法使用快取內容所致。

網頁開始轉譯後,系統可能會先顯示初始顯示畫面 (例如背景顏色),最後顯示一些內容 (例如網站標題)。初始內容的外觀由 FCP 評估。FCP 和其他指標的差距可能讓我們知道。

TTFB 和 FCP 之間出現大幅差異,可能表示瀏覽器需要下載大量會禁止轉譯的素材資源。這也可能表示網站必須完成大量作業才能轉譯任何有意義的內容,也就是網站的經典標誌,而該介面極度仰賴用戶端轉譯。

如果 FCP 和 LCP 之間的差距很大,表示瀏覽器無法立即提供 LCP 資源以排定優先順序 (例如,由 JavaScript 管理的文字或圖片,而非在初始 HTML 中取得),或者瀏覽器已完成其他工作,所以瀏覽器仍可顯示 LCP 內容。

使用 PageSpeed Insights Lighthouse 資料

PageSpeed Insights 的 Lighthouse 部分提供改善 LCP 的指引,但請務必先確認提供的 LCP 是否廣泛與 CrUX 提供的實際使用者資料達成共識。如果 Lighthouse 和 CrUX 不同意,CrUX 可能會提供更準確的使用者體驗資訊。採取行動前,請先確認您的 CrUX 資料適用於您的網頁,而非完整來源。

如果 Lighthouse 和 CrUX 皆顯示 LCP 值,但仍有改善空間,則可透過 Lighthouse 部分提供寶貴的指引,瞭解如何改善 LCP。使用 LCP 篩選器時,就只會顯示與 LCP 相關的稽核項目,方法如下:

Lighthouse LCP 商機與診斷
Lighthouse 診斷與改善 LCP 的建議。

你還可以查看「診斷」資訊,以及改善的「商機」分頁,進一步瞭解相關資訊,以便診斷問題。最大內容繪製元素診斷會顯示 LCP 各種時間的實用細目:

Lighthouse LCP 階段
Lighthouse 的 LCP 元素細目。

接下來我們會深入探討這些子部分。

LCP 細目

如果 PageSpeed Insights 無法協助您瞭解如何改善這項指標,進行 LCP 最佳化作業可能會較為複雜。一般而言,對於複雜的工作,建議您將這些工作細分為多個較小且方便管理的工作,然後分別處理。

本節介紹一個方法,說明如何將 LCP 細分為最重要的子部分,然後提出調整各部分的特定建議和最佳做法。

大多數網頁載入通常包含一些網路要求,但為了找出改善 LCP 的機會,您一開始就要從觀察兩方面:

  1. 初始 HTML 文件
  2. LCP 資源 (如適用)

雖然網頁上的其他要求可能會影響 LCP,但可以透過這兩個要求 (尤其是 LCP 資源的開始和結束時間) 顯示網頁是否針對 LCP 進行最佳化。

如要找出 LCP 資源,可以使用開發人員工具 (例如上述的 PageSpeed Insights、Chrome 開發人員工具WebPageTest) 來判斷 LCP 元素。在這個頁面中,您可以針對頁面載入的所有資源,比對元素在聯播網刊登序列中載入的網址 (如有)。

例如,下圖顯示了從一般網頁載入作業的網路瀑布圖中醒目顯示的這些資源,其中 LCP 元素需要處理圖片要求才能轉譯。

以醒目方式顯示 HTML 和 LCP 資源的聯播網刊登序列
刊登序列圖表,顯示網頁 HTML 的載入時間,以及 LCP 所需的資源。

若是最佳化的網頁,您會希望 LCP 資源要求盡快開始載入,而且您希望在 LCP 資源載入完成之後盡快轉譯 LCP 元素。為了便於視覺化呈現特定網頁是否遵守這項原則,您可以將 LCP 總時間細分為以下幾個子部分:

首次位元組時間 (TTFB)
從使用者開始載入網頁到瀏覽器收到 HTML 文件回應第一個位元組所需的時間。
資源載入延遲
從 TTFB 到瀏覽器開始載入 LCP 資源所需的時間。如果 LCP 元素不需要載入資源即可轉譯 (例如,如果元素是使用系統字型轉譯的文字節點),則這次為 0。
資源載入時間長度
載入 LCP 資源本身所需的時間。如果 LCP 元素不需要載入資源即可轉譯,則這次為 0。
元素顯示延遲
LCP 資源載入完成到完全轉譯 LCP 元素之間的時間。

每個網頁的 LCP 由這四個子類別組成。兩者之間沒有間距或重疊,而會加總到整個 LCP 時間。

LCP 細目,顯示四個子類別
相同的瀑布圖,其中四個 LCP 子類別重疊在時間軸上。

每個網頁的 LCP 值都可以細分為以下四個子部分。兩者之間沒有重疊或有間隔。而這兩者合計將加總至整個 LCP 時間。

最佳化 LCP 時,建議您個別改進這些子部分。但同時也需要注意的是,兩者都要最佳化。在某些情況下,對某個部分套用最佳化並不會改善 LCP,而這只會將省下的時間轉移至另一個部分。

舉例來說,在早期的網路刊登序列中,如果您為了縮小圖片而縮減檔案大小,或改用較為理想的格式 (例如 AVIF 或 WebP),這麼做將可縮短資源載入時間,但實際上並不會改善 LCP,因為時間只會變更為「元素轉譯延遲」子部分:

先前顯示 LCP 的細目資料與先前顯示的 LCP 相同,其中資源載入時間子類別縮短,但整體 LCP 時間維持不變。
如果縮短資源載入時間長度,就能增加元素轉譯延遲時間,但不會減少 LCP。

這是因為這個網頁上的 LCP 元素會一直隱藏,直到 JavaScript 程式碼載入完成才會同時顯示。

此範例可協助您說明,要將所有子部分最佳化,進而獲得最佳 LCP 結果。

最佳子部分時間

為了最佳化 LCP 的每個子部分,您必須瞭解這些子部分的理想分項適用於已最佳化的網頁。

在四個子章節中,兩個子部分的名稱有「延遲」一詞。這表示您希望這些時間盡可能接近零。其他兩個部分則涉及網路要求,而這類要求相當有限。

LCP 子部分 LCP 百分比
第一個位元組所需時間 約 40%
資源載入延遲 低於 10%
資源載入時間長度 約 40%
元素顯示延遲 低於 10%
總計 100%

請注意,這些時間細目是規範,而非嚴格的規則。如果網頁的 LCP 時間持續在 2.5 秒內,則相對比例並不重要。但要是您在「延遲」部分的設定中花費太多時間,就會難以持續達到 2.5 秒的目標

以下何者是 LCP 時間細項分析的好方法:

  • LCP 時間的絕大部分都應用於載入 HTML 文件和 LCP 來源。
  • 在 LCP 之前,只要其中任一資源「無法」載入,就有機會改善

如何最佳化每個部分

現在,您已瞭解每個 LCP 子部分應如何細分在經過最佳化處理的網頁上,現在就可以開始最佳化自己的網頁了。

接下來的四個章節會說明最佳化各部分的建議和最佳做法。系統會按照順序放送,從放送最可能影響力的最佳化開始。

1. 消除資源載入延遲

此步驟的目標是確保 LCP 資源盡早開始載入。理論上,雖然最早的資源「可以」在 TTFB 之後開始載入,但實際上瀏覽器在實際開始載入資源之前會經過一些延遲。

根據經驗法則,LCP 資源應與該網頁載入的第一個資源同時開始載入。另一種情況是,如果 LCP 資源比第一項資源晚開始載入,就有改善空間。

網路瀑布圖,顯示第一項資源之後開始的 LCP 資源,顯示改善的機會
在這個頁面中,LCP 資源會在首次載入的樣式表單後開始載入。這裡有改善空間。

一般來說,有兩項因素會影響 LCP 資源的載入速度:

  • 找到資源的時間。
  • 資源獲派的優先順序。

在找到資源時進行最佳化

為確保您的 LCP 資源盡快開始載入,請務必讓瀏覽器的預先載入掃描器在 HTML 文件的初始回應中找到該資源。舉例來說,在下列情況中,瀏覽器可以透過掃描 HTML 文件回應來找出 LCP 資源:

  • LCP 元素是 <img> 元素,其 srcsrcset 屬性則位於初始 HTML 標記中。
  • LCP 元素需要 CSS 背景圖片,但系統會使用 HTML 標記中的 <link rel="preload"> (或使用 Link 標頭) 預先載入該圖片。
  • LCP 元素是一個文字節點,需要網站字型才能轉譯,且使用 HTML 標記中的 <link rel="preload"> (或使用 Link 標頭) 載入字型。

以下舉例說明系統在掃描 HTML 文件回應時,找不到 LCP 資源:

  • LCP 元素是一種 <img>,可使用 JavaScript 動態加入網頁中。
  • LCP 元素會延遲載入,其中包含隱藏其 srcsrcset 屬性的 JavaScript 程式庫 (通常為 data-srcdata-srcset)。
  • LCP 元素需要 CSS 背景圖片。

在這些情況下,瀏覽器都需要執行指令碼或套用樣式表 (通常必須等到網路要求完成後),才會發現 LCP 資源並開始載入。但這並非最理想的做法。

為避免不必要的資源載入延遲,您的 LCP 資源必須可從 HTML 來源中找到。如果只會從外部 CSS 或 JavaScript 檔案參照資源,LCP 資源必須以高「擷取優先順序」預先載入,例如:

<!-- Load the stylesheet that will reference the LCP image. -->
<link rel="stylesheet" href="/path/to/styles.css">

<!-- Preload the LCP image with a high fetchpriority so it starts loading with the stylesheet. -->
<link rel="preload" fetchpriority="high" as="image" href="/path/to/hero-image.webp" type="image/webp">

最佳化提供資源的優先順序

即使 LCP 資源可透過 HTML 標記找到,但「仍」可能還沒像第一個資源那樣開始載入。如果瀏覽器預先載入掃描器的優先順序經驗法則無法識別該資源很重要,或是認為其他資源很重要,就可能出現這種情況。

舉例來說,如果您在 <img> 元素上設定 loading="lazy",就能使用 HTML 延遲 LCP 圖片。使用延遲載入是指在版面配置確認圖片位於可視區域中後,系統才會載入資源,因此可能會比其他時間之後開始載入。

就算沒有延遲載入,瀏覽器一開始也不會將圖片載入最高優先順序,因為圖片並不是會妨礙顯示的資源。您可以使用 fetchpriority 屬性,提示瀏覽器對哪些資源來說最重要,因為這些資源較重視優先順序較高的資源:

<img fetchpriority="high" src="/path/to/hero-image.webp">

如果您認為 <img> 元素很有可能成為網頁的 LCP 元素,建議您設定 fetchpriority="high" 的標記。但是,如果為超過一或兩張圖片設定高優先順序,會使優先順序設定對減少 LCP 沒有幫助。

你也可以降低圖片優先順序。如果圖片可能在文件回覆中較早出現,卻因樣式設定而無法顯示 (例如啟動時未顯示的輪轉介面投影片圖片),你也可以降低圖片的優先順序:

<img fetchpriority="low" src="/path/to/carousel-slide-3.webp">

降低特定資源的優先順序,將更多頻寬提供給需要這類資源的資源,但請謹慎小心。請一律檢查開發人員工具中的資源優先順序,並使用研究室和現場工具測試變更。

將 LCP 資源優先順序和探索時間最佳化之後,網路刊登序列應如下所示 (LCP 資源會與第一項資源同時開始執行):

顯示 LCP 資源的網路瀑布圖,現在和第一項資源同時開始
現在,LCP 資源會和樣式表同時開始載入。

2. 消除元素轉譯延遲

此步驟的目標是確保 LCP 元素在資源載入完成後 (無論任何情況下) 都能「立即」顯示。

LCP 元素在資源載入完成後立即顯示,無法立即顯示的主要原因,主要原因是如果出於其他原因,導致算繪作業遭到封鎖

  • 由於 <head> 中的樣式表或同步指令碼仍在載入,因此系統無法轉譯整個網頁。
  • LCP 資源已載入完成,但尚未將 LCP 元素加入 DOM (正在等待某些 JavaScript 程式碼載入)。
  • 其他程式碼隱藏了元素,例如仍在決定使用者應加入哪個版本的 A/B 測試程式庫。
  • 主要執行緒因長時間工作而遭到封鎖,轉譯工作必須等待這些長時間的工作完成。

以下各節將說明如何解決非必要元素轉譯延遲的最常見原因。

減少或內嵌禁止轉譯樣式表

由於您通常不希望顯示未經樣式的 HTML,因此從 HTML 標記載入的樣式表會禁止轉譯其後面的所有內容,這是不錯的做法。不過,如果樣式表過大,導致載入時間大幅超過 LCP 資源,那麼即使 LCP 元素載入完畢,仍不會轉譯 LCP 元素,如下例所示:

一個網路瀑布圖,顯示大型 CSS 檔案導致 LCP 元素無法顯示,因為載入時間超過 LCP 資源
系統會同時開始載入圖片和樣式表,但必須等到樣式表準備就緒後,圖片才會顯示。

如要修正這個問題,您可以採取下列其中一種做法:

  • 將樣式表內嵌於 HTML 中,以避免產生額外的網路要求;或
  • 縮減樣式表的大小。

一般而言,只有在樣式表較小時,才建議讓樣式表太小,因為 HTML 中的內嵌內容無法在後續載入網頁時快取內容。如果樣式表過大,導致載入時間比 LCP 資源長,就不可能適合嵌入內嵌項目。

在大多數情況下,要確保樣式表不會妨礙 LCP 元素轉譯,最好的方法就是縮減其大小,使其小於 LCP 資源。這應該確保大多數訪客造訪時不會出現瓶頸。

以下提供幾個縮減樣式表大小的建議:

延遲或內嵌禁止轉譯 JavaScript

在網頁的 <head> 中加入同步指令碼 (沒有 asyncdefer 屬性的指令碼) 通常就沒有必要,而且因為這樣通常對成效造成負面影響。

如果 JavaScript 程式碼必須在網頁載入中盡早執行,最好將它內嵌,這樣網頁就不會延遲等待另一個網路要求顯示。但就像樣式表一樣,建議您只在指令碼很小的情況下使用內嵌指令碼。

錯誤做法
<head>
  <script src="/path/to/main.js"></script>
</head>
正確做法
<head>
  <script>
    // Inline script contents directly in the HTML.
    // IMPORTANT: only do this for very small scripts.
  </script>
</head>

使用伺服器端算繪

伺服器端轉譯 (SSR) 是指在伺服器上執行用戶端應用程式邏輯,並以完整的 HTML 標記回應 HTML 文件要求的程序。

就最佳化 LCP 而言,SSR 有兩個主要優勢:

  • 這些圖片資源將可透過 HTML 來源尋找 (如前述步驟 1 中所述)。
  • 網頁上的內容無須完成額外的 JavaScript 要求就能顯示。

SSR 的主要缺點是需要額外的伺服器處理時間,這可能會拖慢 TTFB 的速度。這種權衡取捨通常值得您這麼做,因為伺服器處理時間由您控制,但使用者的網路和裝置功能並沒有在掌控。

與 SSR 類似的選項稱為「靜態網站產生 (SSG)」或「預先算繪」。此為在建構步驟中產生 HTML 網頁的程序,而非以量計價。如果架構可以進行預先算繪,通常就比較適合執行效能。

拆分執行時間較長的任務

如果您已按照先前的建議操作,且 JavaScript 程式碼未禁止轉譯,也未負責轉譯元素,仍可能會延遲 LCP。

發生這個問題最常見的原因是網頁載入大型的 JavaScript 檔案,而後者需要在瀏覽器的主要執行緒上剖析和執行。換句話說,即使圖片資源已完整下載完畢,可能仍須等到不相關的指令碼執行完畢才能顯示。

目前所有瀏覽器都會在主執行緒上轉譯圖片,也就是說,任何會封鎖主執行緒的圖片,都可能造成不必要的元素轉譯延遲

縮短資源載入時間

這個步驟的目標是減少透過網路將資源位元組傳輸到使用者裝置所花費的時間。一般來說,方法有三種:

  • 縮減資源大小。
  • 縮短資源移動的距離。
  • 減少網路頻寬的爭用情況。
  • 完全不必使用網路時間。

縮減資源大小

網頁的 LCP 資源 (如有) 可以是圖片或網路字型。以下指南詳細說明如何縮減兩者的大小:

縮短資源行駛距離

除了縮減資源的大小之外,您也可以將伺服器盡可能靠近使用者,進而縮短載入時間。最佳做法是使用內容傳遞聯播網 (CDN)。

Image CDN 特別有幫助,因為其能縮短資源移動的距離,而且通常會縮減資源大小,自動導入先前為您執行的所有大小縮減建議。

減少網路頻寬的爭用情況

即使您縮減了資源的大小以及移動的距離,如果同時載入許多其他資源,系統可能仍需要很長的時間來載入資源。這個問題稱為「網路爭用」

如果你已將 LCP 資源提供給fetchpriority,並盡快載入資源,瀏覽器就會盡可能防止優先順序較低的資源與其他資源競爭。不過,假如您載入的多個 fetchpriority 資源偏高,或者您只是要載入大量資源,就可能影響 LCP 資源載入速度。

完全減少網路時間

縮短網路載入時間長度的最佳方式,就是完全刪除網路。如果您是透過高效的快取控制政策提供資源,第二次索取這些資源的訪客就會從快取提供資源,資源載入持續時間基本上等於零!

如果 LCP 資源為網路字型,除了縮減網路字型大小外,您也應考量是否需要在網路字型資源載入時封鎖轉譯。如果將 font-display 值設為 autoblock 以外的任何內容,則文字會在載入期間一律顯示,而且 LCP 不會因其他的網路要求遭到封鎖。

最後,如果 LCP 資源很小,您可以將資源內嵌為「資料網址」,這麼做也會刪除額外的網路要求。不過,使用資料網址時會有一些注意事項,原因是無法快取資源;在某些情況下,可能會因為解碼費用增加而導致轉譯延遲的時間變長。

4. 縮減第一個位元組的時間

此步驟的目標是盡快提供初始 HTML。下面列出這個步驟,因為通常是由開發人員最寬鬆控制。不過,這也是最重要的步驟之一,因為這些步驟會直接影響之後發生的每個步驟。在後端傳送內容的第一個位元組之前,前端不會發生任何變化,因此,只要能加快 TTFB 的運作速度,也會改善所有其他的載入指標。

如果訪客連上的 TTFB 速度很快,就會導致訪客透過多種重新導向 (例如廣告或縮短連結) 到達。請盡量減少訪客必須等待的重新導向次數。

另一個常見的原因是,當 CDN 邊緣伺服器無法使用快取內容時,必須將所有要求都引導回原始伺服器。如果訪客使用專用網址參數來進行分析,即使兩者不會連到不同網頁,都可能會發生這種情況。

如需最佳化 TTFB 的具體指引,請參閱「最佳化 TTFB 指南」。

監控 JavaScript 中的 LCP 細目

您可以在 JavaScript 中結合下列效能 API,以使用先前討論的所有 LCP 子部分的時間資訊:

在 JavaScript 中計算這些時間值的優點,就是讓您可以將其傳送給分析供應商,或是記錄至開發人員工具,以便進行偵錯和最佳化。

舉例來說,以下螢幕截圖使用 User Timing APIperformance.measure() 方法,在 Chrome 開發人員工具「效能」面板中的 Timings 音軌中加入長條。

在 Chrome 開發人員工具中,以視覺化方式呈現 LCP 子類別的使用者載入時間指標
「時間順序」軌跡會顯示 LCP 子類別的時間軸。

與「網路」和「主要執行緒」追蹤一併查看時,「時間」軌中的圖表會特別有用,因為您可以一眼瞭解網頁上其他期間發生的事情。

除了以視覺化方式呈現時間軌跡中的 LCP 子部分外,您也可以使用 JavaScript 計算每個子部分在 LCP 總時間中佔多少百分比。運用這項資訊,您就可以判斷網頁是否符合前述的建議百分比細目

這個螢幕截圖的示例說明如何將每個 LCP 子部分記錄總時間,以及記錄在主控台中佔 LCP 總時間的百分比。

LCP 子類別時間以及在控制台中列印的 LCP 百分比
LCP 子類別時間和百分比。

這兩個圖表都是使用下列程式碼建立:

const LCP_SUB_PARTS = [
  'Time to first byte',
  'Resource load delay',
  'Resource load duration',
  'Element render delay',
];

new PerformanceObserver((list) => {
  const lcpEntry = list.getEntries().at(-1);
  const navEntry = performance.getEntriesByType('navigation')[0];
  const lcpResEntry = performance
    .getEntriesByType('resource')
    .filter((e) => e.name === lcpEntry.url)[0];

  // Ignore LCP entries that aren't images to reduce DevTools noise.
  // Comment this line out if you want to include text entries.
  if (!lcpEntry.url) return;

  // Compute the start and end times of each LCP sub-part.
  // WARNING! If your LCP resource is loaded cross-origin, make sure to add
  // the `Timing-Allow-Origin` (TAO) header to get the most accurate results.
  const ttfb = navEntry.responseStart;
  const lcpRequestStart = Math.max(
    ttfb,
    // Prefer `requestStart` (if TOA is set), otherwise use `startTime`.
    lcpResEntry ? lcpResEntry.requestStart || lcpResEntry.startTime : 0
  );
  const lcpResponseEnd = Math.max(
    lcpRequestStart,
    lcpResEntry ? lcpResEntry.responseEnd : 0
  );
  const lcpRenderTime = Math.max(
    lcpResponseEnd,
    // Use LCP startTime (the final LCP time) because there are sometimes
    // slight differences between loadTime/renderTime and startTime
    // due to rounding precision.
    lcpEntry ? lcpEntry.startTime : 0
  );

  // Clear previous measures before making new ones.
  // Note: due to a bug, this doesn't work in Chrome DevTools.
  LCP_SUB_PARTS.forEach((part) => performance.clearMeasures(part));

  // Create measures for each LCP sub-part for easier
  // visualization in the Chrome DevTools Performance panel.
  const lcpSubPartMeasures = [
    performance.measure(LCP_SUB_PARTS[0], {
      start: 0,
      end: ttfb,
    }),
    performance.measure(LCP_SUB_PARTS[1], {
      start: ttfb,
      end: lcpRequestStart,
    }),
    performance.measure(LCP_SUB_PARTS[2], {
      start: lcpRequestStart,
      end: lcpResponseEnd,
    }),
    performance.measure(LCP_SUB_PARTS[3], {
      start: lcpResponseEnd,
      end: lcpRenderTime,
    }),
  ];

  // Log helpful debug information to the console.
  console.log('LCP value: ', lcpRenderTime);
  console.log('LCP element: ', lcpEntry.element, lcpEntry.url);
  console.table(
    lcpSubPartMeasures.map((measure) => ({
      'LCP sub-part': measure.name,
      'Time (ms)': measure.duration,
      '% of LCP': `${
        Math.round((1000 * measure.duration) / lcpRenderTime) / 10
      }%`,
    }))
  );
}).observe({type: 'largest-contentful-paint', buffered: true});

您可以將這個程式碼直接用於本機偵錯,也可以修改程式碼,將這些資料傳送給分析供應商,進一步瞭解網頁對於實際使用者而言,LCP 的詳細資料。

使用網站體驗指標擴充功能,監控 LCP 細目

網站體驗指標擴充功能在控制台中記錄 LCP 時間、LCP 元素和這四個子部分,方便您查看這項細目資料。

網站體驗指標擴充功能的主控台記錄螢幕截圖,顯示 LCP 子部分時間
網站體驗指標擴充功能的「主控台」面板會顯示 LCP 細目。

摘要

LCP 相當複雜,而且時間可能會受到許多因素影響。不過,如果您認為最佳化 LCP 主要是為了最佳化 LCP 資源的負載,就能大幅簡化作業。

大致來說,最佳化 LCP 可透過四個步驟摘要說明:

  1. 確保 LCP 資源盡早開始載入。
  2. 確認 LCP 元素可在資源載入完成後立即轉譯。
  3. 在不影響品質的情況下,盡可能縮短 LCP 資源的載入時間。
  4. 盡快傳送初始 HTML 文件。

如果能完成網頁上的步驟,應該就能確保可以為使用者提供最佳載入體驗,而實際的 LCP 分數應該也會反映這項變化。