一個讓我們團隊困惑了兩週的 LCP 問題
我們曾接手一個電商網站的效能優化專案。團隊按照直覺,花費大量時間壓縮首頁 Hero 圖片的檔案大小、嘗試不同的圖片格式,但 Lighthouse 分數中的「最大內容繪製時間 (LCP)」依然停留在「需要改善」的區間。我們的直覺反應是「圖片下載還是不夠快」,但真實情況是,當我們最終使用 Chrome DevTools 進行一次完整的載入錄製後,才發現瀏覽器判定的 LCP 元素根本不是那張 Hero 圖片,而是一個大型的文字區塊。真正的問題根源在於字型載入延遲,導致這個文字節點的繪製時間被拉長。這個經驗給了我們一個深刻的教訓:在採取任何優化行動之前,第一步必須是精確地找出網站上那個真正的「LCP 元素」,否則極有可能白費工夫。
三種工具實測:DevTools vs. Lighthouse vs. JavaScript API
要找出 LCP 元素,我們主要依賴三種工具:Chrome DevTools 的 Performance 面板、Lighthouse 稽核報告,以及基於 PerformanceObserver 的 JavaScript API。這三者各有其適用場景與限制,理解其差異是高效診斷的關鍵。以下我們將結合實際操作步驟,對比它們的特性。
Chrome DevTools (Performance 面板) 提供了最詳盡的時序資訊,是開發階段深度診斷的首選。其標準流程為:開啟 DevTools(F12)並切換至 Performance 面板,為了模擬真實環境,建議開啟 CPU throttling(例如 4 倍)和 Network throttling(Fast 3G)。點擊錄製後重新整理頁面,載入完成後停止錄製。在錄製結果的 Timings 區域,找到橘色的「LCP」標記並點擊它,下方的 Summary 面板會顯示一個 Node 連結,點擊即可跳轉至 Elements 面板,準確定位到對應的 DOM 節點。這種方法的優點是能觀察到 LCP candidate 的更新過程,並精確對應到 DOM,缺點是操作步驟較多,且需要一定的解讀經驗。
Lighthouse 與 PageSpeed Insights (PSI) 則提供了更快速、自動化的診斷。在 Lighthouse 的 Performance 稽核結果中,展開「Largest Contentful Paint」項目,下方會列出「Largest Contentful Paint element」,直接顯示該元素的 HTML 片段。PSI 在其報告的「診斷」區域,同樣會列出「Largest Contentful Paint element」的描述。這兩種工具的優點是速度快、結果一目了然,且 PSI 還能同時提供來自真實使用者的 Field Data。但它們的缺點在於,Lighthouse 是在固定的模擬條件(實驗室數據)下運行,你網站在真實世界中、不同設備和網速下的 LCP 元素,可能與此不同。因此,它們是快速定位的好起點,但不能完全依賴其結果作為唯一的判斷依據。
JavaScript (PerformanceObserver API) 則適合用於監控與自動化測試。透過以下代碼片段,你可以在瀏覽器端持續追蹤 LCP 元素:const observer = new PerformanceObserver((list) => { const entries = list.getEntries(); const lastEntry = entries[entries.length - 1]; console.log('LCP element:', lastEntry.element); }); observer.observe({ type: 'largest-contentful-paint', buffered: true });。設定 buffered: true 能確保 observer 捕獲到初始化之前已發出的 entry。此方法的優點是可以程式化地收集真實使用者(Real User Monitoring, RUM)數據,了解 LCP 元素在不同條件下的分佈。缺點是它只提供數據,需要結合其他工具才能進行深度的成因分析。對於追求長期效能追蹤的團隊,這是最關鍵的數據來源。
實戰流程圖:我該用哪個工具?
面對不同的工作情境與需求,選擇正確的工具能大幅提升效率。根據你的角色與目的,可以參考以下決策路徑:如果你是開發者,需要深入分析一次具體載入過程中各資源的時序關係,以便進行深度除錯,那麼 Chrome DevTools Performance 面板是你的最佳選擇。如果你是產品經理或 SEO 專家,需要快速獲取一個頁面在模擬環境下的綜合健康報告,並理解它與真實用戶數據(Field Data)的差異,那麼 PageSpeed Insights 會是更合適的工具。如果你正在建立或維運一個自動化監控系統,需要持續收集真實用戶的 LCP 元素數據以進行長期趨勢分析,那麼整合 JavaScript PerformanceObserver API 到你的 RUM 方案中是必要的。
要注意的是,這些工具並非互斥,最佳實踐是組合使用。一個常見的流程是:先用 PSI 快速掃描,獲得一個初步的 LCP 元素候選者;然後用 DevTools 針對這個元素進行深度錄製,分析其延遲的具體子階段(TTFB、資源載入延遲、資源載入時間、元素算繪延遲);最後,透過 PerformanceObserver 收集真實用戶數據,驗證你的優化是否在真實環境中生效。
特別注意:行動裝置上的 LCP 元素可能是另一個
許多開發者容易忽略的一個關鍵點是:在行動裝置(Mobile)上,LCP 元素的判定可能與桌面裝置(Desktop)完全不同。這主要歸因於視口尺寸的差異。瀏覽器判定 LCP 元素時,依據的是其在視口內的「可見面積」。在較小的行動視口中,原先在桌面版首屏是背景圖片的元素,可能因為視口縮小而不再佔據最大可見面積;反之,一個原本在桌面版不算大的文字區塊,可能在行動版上成為視口內最大的元素。因此,永遠不要只在桌面版上確認 LCP 元素後就停止。務必使用 Chrome DevTools 的設備模擬功能(Device Toolbar),切換到常見的手機型號(如 iPhone 或 Pixel)與網路條件(如 Fast 3G),重新進行錄製。這能幫你發現那些只在行動版上出現的、截然不同的 LCP 瓶頸,確保你的優化策略能覆蓋所有主流用戶群體。在台灣,移動裝置使用率極高,這一步驟尤其重要,忽略它可能意味著你漏掉了大部分真實用戶的體驗問題。若要深入交流行動版效能優化的實戰經驗,也推薦關注台灣活躍的技術社群 Web Performance Taiwan,上面有許多本地開發者分享的真實案例與討論。
實驗結果:我們這樣將 LCP 時間顯著縮短
回到我們最初的案例。在精確識別出 LCP 元素是文字區塊後,我們依照以下三個步驟依序執行,逐步收斂問題並驗證成效:
- 瓶頸拆解:我們進一步使用 Performance Insights 面板,將 LCP 時間拆分為 TTFB、資源載入延遲、資源載入時間、元素算繪延遲四個子階段,發現「元素算繪延遲 (Render Delay)」佔據了大部分時間。
- 根源定位:結合「文字區塊 LCP」的線索,我們迅速定位到問題根源:網頁使用的一款自訂字型在載入時阻塞了渲染。
- 採取優化與驗證:針對此根源,我們在字型的 CSS 規則中加入
font-display: swap。此設定允許瀏覽器在自訂字型下載完成前,先使用系統備選字型進行渲染,確保文字內容能立即可見,並進行 A/B 對比驗證。
我們同步記錄了優化前後的觀察對比:優化前,Lighthouse 報告中的 LCP 時間為「需要改善」等級,Performance 錄製中 LCP 元素對應文字節點,且 Render Delay 時間較長;優化後,相同模擬條件下,LCP 時間明顯下降至「良好」等級,同一個文字節點的 Render Delay 大幅縮減。更關鍵的是,在後續收集的真實用戶數據中,也觀察到該頁面的 LCP 指標有顯著改善。這個實驗完整體現了「先準確識別,再針對性優化」的工作流價值。
常見問題 (FAQ)
LCP 元素是什麼?我可以自己指定嗎?
LCP(最大內容繪製)元素是瀏覽器在頁面載入過程中,自動判定的、視口內面積最大的主要可見內容對應的 DOM 節點。它是 Largest Contentful Paint 指標的計算基礎。你不能通過代碼或設定「指定」某個元素成為 LCP 元素,它完全由瀏覽器根據頁面載入時的實際渲染結果動態決定。
為什麼我優化了圖片,LCP 分數還是沒變?
這很可能意味著你誤判了 LCP 元素。如本文實驗案例所示,真正的 LCP 元素可能不是圖片,而是文字區塊、影片封面圖(poster)或 CSS 背景圖。不同元素類型的瓶頸點不同:圖片問題可能出在下載,文字問題可能出在字型載入。請務必先使用 DevTools 或 Lighthouse 確認當前的 LCP 元素是什麼,再決定優化方向。
DevTools 和 Lighthouse 顯示的 LCP 元素不同,以哪個為準?
兩者顯示不同是正常現象,因為它們的數據來源不同。Lighthouse 是在固定模擬條件下的實驗室測試,結果反映的是「該特定條件下」最可能的 LCP 元素。DevTools(在你真實的桌面環境錄製)和 PerformanceObserver API(收集真實用戶數據)更接近實際情況。建議以 DevTools 或真實用戶數據(Field Data)為主要依據進行深度優化,而將 Lighthouse 結果作為快速篩查和基準測試的參考。
頁面加載時有多個元素看起來都很大,會有「多個」LCP 元素嗎?
瀏覽器會在載入過程中持續追蹤並更新最大的內容候選者。在 DevTools 的 Performance 錄製中,你可能會看到多個被標記為「LCP」的 PerformanceEntry,但它們代表的是不同時刻的候選者。最終的、決定性的 LCP 元素只有一個,通常是使用者發生互動(如點擊、滾動)前最後一個被記錄的最大內容繪製完成事件所對應的那個元素。
找到 LCP 元素後,下一步具體該做什麼?
找到元素只是第一步,下一步是分析其延遲的「子階段」。將 LCP 時間拆分為 TTFB、資源載入延遲、資源載入時間、元素算繪延遲四個部分。找出最長的那個子階段,就能精準定位瓶頸。例如,如果瓶頸是資源載入延遲,對於圖片元素,可以考慮添加 fetchpriority="high" 或 rel="preload";如果是文字元素的算繪延遲,則需要檢查字型載入策略(如使用 font-display: swap)或渲染阻塞資源。詳細的優化步驟可參閱 LCP 優化指南。