網站跑分滿江紅?拆解 Core Web Vitals,LCP/CLS/FID 調教實戰全攻略
☰ 目錄 table-of-contents.md
為什麼換了主機、裝了快取外掛,PageSpeed Insights 還是一片紅?因為紅字幾乎都集中在 Core Web Vitals 三大指標——LCP(載入)、CLS(穩定)、FID/INP(互動),方向沒抓對,再多外掛也是白裝。要把分數從紅轉綠,路線其實很明確:LCP 顧伺服器回應時間與最大元素的圖片載入策略、CLS 替所有會撐開版面的元素事先預留空間、FID/INP 則想辦法別讓 JavaScript 把主執行緒塞滿。本文用工程師實戰的角度,逐項拆解每個指標的成因與可立即動手的修法。
身為一個天天跟 WordPress 程式碼打交道的工程師,最常被客戶問到的問題之一,大概就是:「Eric,為什麼我的網站用 Google PageSpeed Insights 測出來分數這麼難看?一片紅字,是不是網站快掛了?」
每次看到客戶傳來的滿江紅報告,我都能感受到那份焦慮。但別擔心,這篇文章就是要帶你撥開迷霧,深入理解這些分數背後的意義,並動手進行 WordPress 速度優化。我們不談那些虛無飄渺的理論,只講能讓你網站「有感」變快的實戰技巧,特別是針對 Google 最在意的三大指標:LCP、CLS、和 FID。
說真的,網站效能優化已經不是選修課,而是必修學分了。它不僅僅是為了討好 Google 的演算法,更是為了尊重每一位訪客寶貴的時間。一個卡頓、遲緩的網站,只會讓使用者毫不猶豫地按下上一頁。好了,囉嗦完畢,我們捲起袖子,開始幹活吧!
什麼是網站體驗核心指標 (Core Web Vitals)?為什麼 Google 這麼在意?
首先,我們得搞懂到底在跟誰「作戰」。Core Web Vitals(簡稱 CWV)是 Google 提出來的一組指標,用來衡量使用者在網頁上的實際體驗。你可以把它想像成 Google 派出的秘密客,專門評估你網站的「待客之道」。它主要由三個核心成員組成:
- LCP (Largest Contentful Paint) — 最大內容繪製:使用者進到頁面後,畫面上「最大塊」的圖片或文字區塊需要多久才能完整顯示。這代表使用者感知到的「載入速度」。
- CLS (Cumulative Layout Shift) — 累計版面配置位移:你有過這種經驗嗎?正要點擊一個按鈕,突然一個廣告或圖片載入把按鈕擠下去,結果點到別的東西。這種惱人的「畫面跳動」就是 CLS 在測量的東西,它代表「視覺穩定性」。
- FID (First Input Delay) — 首次輸入延遲:當使用者第一次與頁面互動(例如點擊連結、按按鈕)時,瀏覽器需要多久才能開始處理這個動作。這代表網站的「互動性」。
最近 Google 也開始推廣 FID 的接班人——INP (Interaction to Next Paint),它衡量的是整個互動過程的延遲,比 FID 更全面。但別緊張,優化 FID 的基本功,同樣能為 INP 打下良好基礎。
實驗室數據 vs. 真實使用者數據,差在哪?
有一個觀念一定要先建立:你在 PageSpeed Insights 上看到的數字,其實分成兩類,這也解釋了為什麼很多人「測一次紅、測一次綠」覺得很玄。
- 實驗室數據 (Lab Data):由工具在一個受控環境中模擬載入所得到的,每次條件固定、可重現,適合用來除錯。但它測不到 FID(因為實驗室裡沒有真人去點擊),通常會用「總阻塞時間 (Total Blocking Time, TBT)」當作互動性的替身指標。
- 真實使用者數據 (Field Data):來自實際造訪你網站的使用者,反映他們在各種裝置、各種網路下的真實體驗。Google 在評估搜尋排名時看的是這一類資料,而它需要累積一段時間的流量才會穩定。
換句話說,實驗室數據用來找問題、驗證修法是否有效;真實使用者數據才是 Google 真正拿來打分的依據。修完之後別急著看一次跑分就下結論,真實數據需要時間反映改善。
為什麼這些指標這麼重要?因為 Google 已經公開表示,Core Web Vitals 是搜尋排名的因素之一。也就是說,一個使用者體驗好的網站,更有機會獲得好的排名。這就是為什麼我們必須嚴肅看待 WordPress 速度優化:LCP / CLS / FID 調教 這件事。
LCP 拖垮速度?Largest Contentful Paint 優化實戰
LCP 通常是效能報告中最顯眼的紅字來源。一個理想的 LCP 時間應該在 2.5 秒以內。如果你的網站超過 4 秒,那使用者大概已經等到不耐煩了。LCP 過慢,通常代表你的「第一印象」很差。
LCP 的時間其實是好幾段加起來的
很多人以為 LCP 慢就是「圖片太大」,但實際上一張 LCP 圖片從使用者點進來到完整顯示,中間至少經過四個階段,每一段都可能是瓶頸:
- 第一個位元組之前的等待 (TTFB):瀏覽器送出請求,到伺服器吐出第一個位元組的時間。主機慢,這段就慢。
- 資源載入延遲:從拿到 HTML 到瀏覽器「發現」並開始下載 LCP 資源之間的空窗。如果 LCP 圖片藏在 CSS 背景裡,或要等 JavaScript 跑完才插進來,這段就會被拉長。
- 資源載入時間:實際下載這張圖片本身花的時間,跟檔案大小、格式、CDN 直接相關。
- 元素繪製延遲:圖片下載完到實際畫上螢幕的時間,通常受到渲染阻塞的 CSS/JS 影響。
把 LCP 拆成這四段之後,優化策略就很清楚了:前面兩段靠主機與資源提示,後面兩段靠圖片優化與解除渲染阻塞。
揪出 LCP 的元兇:到底誰是那個「最大」的元素?
動手優化前,得先找到問題點。你可以使用 Google PageSpeed Insights 報告,它會明確告訴你哪個元素是 LCP 元兇。通常不是首圖 (Hero Image),就是大標題。在 Chrome 開發者工具 (DevTools) 的「Performance」面板中,你也可以錄製頁面載入過程,找到 LCP 事件,確認是哪個元素。
LCP 優化四大絕招
找到元兇後,我們就可以對症下藥了。以下是我在實務中最常用的幾招:
- 1. 優化伺服器回應時間 (TTFB):地基不穩,蓋什麼樓都危險。如果你的主機本身反應就慢(Time to First Byte, TTFB 過長),後面的優化做得再好都沒用。這也是我最常跟客戶囉嗦的一點:拜託不要再用那些便宜到不可思議的共享主機了!選擇一個優質的 WordPress 主機、設定頁面快取 (Page Caching)、使用 CDN 服務,是降低 TTFB 的根本之道。
- 2. 圖片優化是重中之重:LCP 元素十之八九是圖片。請務必做到:
- 正確的尺寸:不要上傳一張 4000px 寬的圖片,卻只在 800px 寬的欄位顯示。這是在謀殺使用者的流量和耐心。
- 有效的壓縮:使用像 TinyPNG 這樣的工具,在不犧牲太多畫質的前提下,大幅減少圖片檔案大小。
- 現代化的格式:盡量使用 WebP 或 AVIF 格式,它們的壓縮效率遠高於傳統的 JPG 或 PNG。
- 3. 延遲載入非關鍵 CSS 與 JavaScript:瀏覽器在渲染頁面時,如果遇到 CSS 或 JS 檔案,會停下來等它們下載並執行完畢,這就是所謂的「渲染阻塞 (Render-blocking)」。我們需要讓關鍵的 CSS(也就是讓頁面首屏能看的樣式)優先載入,而非關鍵的 CSS 和 JavaScript 則可以延後。許多快取外掛都有提供這類功能,或者你也可以手動為 script 標籤加上
defer屬性。<script src="my-script.js" defer></script> - 4. 預載入 (Preload) 關鍵資源:對於 LCP 元素(例如那張最重要的首圖),我們可以給瀏覽器一個「提示」,告訴它:「嘿!這個資源很重要,請優先下載!」這可以透過在
<head>中加入<link rel="preload">來實現。<!-- 預載入 LCP 圖片 --> <link rel="preload" as="image" href="/path/to/your-lcp-image.webp">
進階一招:用 fetchpriority 直接告訴瀏覽器誰最重要
除了 preload,還有一個更精準的工具:fetchpriority 屬性。瀏覽器在載入初期會自己替資源排優先序,但它不一定猜得對你的首圖。直接在 LCP 圖片上標明高優先權,可以讓它在一堆資源裡插隊先下載;反過來,對於首屏看不到的圖片,標成低優先權能把頻寬讓給更重要的資源。
<!-- 首屏最重要的 LCP 圖片,請優先處理 -->
<img src="hero.webp" fetchpriority="high" width="1280" height="720" alt="首圖">
<!-- 首屏看不到、不急著載入的圖片 -->
<img src="footer-logo.webp" fetchpriority="low" width="200" height="80" alt="頁尾標誌">
提醒一點:preload 與 fetchpriority 是「加速最重要的一張」,不是「全部都標高優先」。如果你把每張圖都標成 high,等於沒有優先序,反而失去效果。
頁面亂跳逼走訪客?Cumulative Layout Shift (CLS) 調教指南
CLS 的理想分數應該低於 0.1。它雖然不像 LCP 那樣直接影響載入速度,卻嚴重破壞使用者體驗。一個高 CLS 分數的網站,會給人一種「不專業」、「不可靠」的感覺。
CLS 到底是怎麼算出來的?
理解計算方式,你就會知道為什麼有些位移特別致命。CLS 的分數來自兩個因素相乘:
- 影響範圍 (impact fraction):發生位移的元素影響到畫面多大的比例。位移整片內容區塊,當然比位移一個小角標糟糕得多。
- 移動距離 (distance fraction):這些元素相對於可視範圍移動了多遠。
這也解釋了一個常見現象:越接近首屏、面積越大的元素,一旦發生位移,對分數的傷害越嚴重。所以優化 CLS 時,優先盯住首屏的大圖、大橫幅與標題區。
CLS 的常見罪魁禍首
版面位移通常是由於瀏覽器一開始不知道某些元素「佔多大空間」所造成的。
- 沒有尺寸的圖片或影片:這是最常見的原因。圖片載入完成後,突然「撐開」一個空間,把下面的內容都擠下去了。
- 動態載入的廣告或 iframe:廣告商的腳本通常不會告訴你廣告多大,載入後就直接插入頁面,造成災難性的版面位移。
- 網頁字型 (Web Fonts) 造成的閃爍:當自訂字型還在下載時,瀏覽器可能會先用系統預設字型顯示文字,等自訂字型載入後再替換,這個替換過程可能因為字體大小不同而導致版面跳動。
- 在現有內容上方動態插入內容:例如一個「訂閱我們的電子報!」的橫幅,在頁面載入後才用 JavaScript 插入到頂部。
根治 CLS 的處方籤
幸運的是,CLS 相對容易修復,核心概念就是「事先預留空間」。
- 永遠為圖片和影片設定
width和height屬性:這是最簡單也最有效的解法。只要在<img>標籤上加上寬高,瀏覽器在圖片下載完成前,就會先根據寬高比幫你把位置佔好(即使你用 CSS 把寬度設成 100%,現代瀏覽器仍會依寬高比保留正確的縱向空間)。<!-- 瀏覽器會根據寬高比 16:9 預留空間 --> <img src="image.jpg" width="1280" height="720" alt="一個有設定寬高的好圖片" style="width: 100%; height: auto;"> - 為廣告和嵌入內容預留空間:如果你知道廣告區塊的大小,可以用 CSS 設定一個容器
div,並給它一個min-height,確保它在廣告載入前就佔據了足夠的空間。 - 優化字型載入策略:在你的
@font-face規則中加入font-display: swap;。這會讓瀏覽器在自訂字型載入完成前,先用備用字型顯示文字,減少文字隱形的時間。同時,也可以預載入重要的字型檔案。 - 動畫只動 transform,不要動會撐開版面的屬性:如果你有開場動畫或互動效果,盡量用
transform(位移、縮放)與opacity來做,這類屬性不會影響其他元素的排版位置,因此不計入 CLS。反之,直接去改top、margin、width、height會推擠周圍內容,很容易把分數搞糟。
點擊沒反應?First Input Delay (FID) 與 INP 互動優化
理想的 FID 應該低於 100 毫秒。當使用者點擊按鈕卻感覺到「延遲」、「卡頓」,背後的主因通常是瀏覽器的主執行緒 (Main Thread) 太忙了,沒空理你。
是什麼佔用了你的瀏覽器主執行緒?
主執行緒就像一個單線道的工廠作業員,他要負責處理 JavaScript、渲染畫面、回應使用者操作等所有事情。如果他正在處理一個非常耗時的 JavaScript 任務,就沒辦法回應你的點擊了。
- 冗長且複雜的 JavaScript 執行:一個執行時間超過 50ms 的 JavaScript 任務,就被稱為「長任務 (Long Task)」。過多的長任務是造成 FID/INP 過高的主因。
- 巨大的 JS 檔案:瀏覽器需要時間去下載、解析和編譯這些檔案。
- 過多的第三方腳本:你裝的 Facebook Pixel、Google Analytics、線上客服外掛……每一個都在搶佔主執行緒的資源。這也是我常跟客戶唸的,裝外掛前請三思,真的每個都需要嗎?
釋放主執行緒,讓網站「動」起來
優化 FID/INP 的核心就是「別讓主執行緒太忙」。
- 拆分長任務 (Long Tasks):將一個龐大的 JavaScript 任務,切分成數個小任務,並透過
setTimeout來排程執行。這樣可以在任務的空檔,讓瀏覽器有機會去處理使用者的輸入。// 一次跑完整批,主執行緒會被卡死 function processAll(items) { for (const item of items) heavyWork(item); } // 切成小批、每批之間把控制權還給瀏覽器 function processInChunks(items, chunkSize = 50) { let i = 0; function next() { const end = Math.min(i + chunkSize, items.length); for (; i < end; i++) heavyWork(items[i]); if (i < items.length) setTimeout(next, 0); // 讓出主執行緒,先回應使用者 } next(); } - 延遲載入非必要的 JavaScript:跟優化 LCP 的概念一樣,不是所有 JS 都需要在頁面一載入就執行。例如,處理表單驗證的腳本,只有在使用者真的開始填表單時才需要。同樣地,使用
defer屬性是你的好朋友。 - 減少第三方腳本的依賴:定期審視你的 WordPress 網站安裝了哪些外掛和第三方追蹤碼。每個腳本都會帶來效能成本。問問自己:「這個功能帶來的價值,是否值得犧牲網站的互動性?」
為什麼大家都在從 FID 轉向 INP?
這裡補充一個觀念,幫你理解「為何不能只顧 FID」。FID 只測量使用者「第一次」互動前的那段等待,而且只算延遲、不算後續處理時間,所以即使 FID 很漂亮,使用者在頁面上後續每一次點擊、捲動都可能很卡。INP 則會把整個瀏覽過程中的互動都納入觀察,反映的是「整體互動順不順」。
好消息是,兩者變差的根本原因相同——都是 JavaScript 把主執行緒佔住了。所以上面那些「減少、延遲、拆分 JavaScript」的功夫,優化 FID 的同時也直接改善 INP,不必另起爐灶。
沒有頭緒時,照這個順序動手
面對一份滿江紅的報告,與其東補一塊西補一塊,不如照投資報酬率排序,由地基往上修:
- 先確認主機與 TTFB:地基太慢,後面全白做。先確認頁面快取有開、主機等級夠用。
- 處理首屏最大的圖片:正確尺寸、現代格式、加上
width/height,必要時用 preload 或fetchpriority="high"。這一步通常同時改善 LCP 與 CLS。 - 替所有會撐開版面的元素預留空間:圖片、影片、廣告、嵌入內容、動態橫幅,全部給定尺寸或
min-height。 - 盤點並瘦身 JavaScript:砍掉用不到的外掛與追蹤碼,剩下的能
defer就 defer、能延後就延後、長任務切小。 - 回到真實使用者數據驗收:記得真實數據要累積流量才會反映改善,別只看一次實驗室跑分就下定論。
總結:WordPress 速度優化是一場持續的旅程
搞定 WordPress 速度優化,特別是針對 LCP / CLS / FID 的調教,絕對不是安裝一個外掛就能一勞永逸的。它更像是一場結合了技術偵錯、資源管理與使用者體驗思維的持續性工程。
從伺服器 TTFB 的基礎建設,到 LCP 的圖片與資源載入策略,再到 CLS 的版面穩定性,最後是 FID/INP 的 JavaScript 執行效率,每一個環節都息息相關。今天我們分享的,是你在面對 PageSpeed Insights 紅字時,最應該優先檢查與動手的方向。
我知道,這其中涉及的技術細節可能讓你感到有些頭大。沒關係,這正是浪花科技存在的價值。如果你的團隊希望專注在核心業務上,而將網站效能這個燒腦的任務交給專業的工程師團隊,我們非常樂意為你服務。我們擅長深入程式碼層級,找出真正的效能瓶頸,並打造出既快速又穩定的 WordPress 網站。
準備好讓你的網站從滿江紅變成一片綠了嗎?立即聯繫我們,讓我們聊聊如何為你的網站進行一次徹底的健康檢查與效能升級!
延伸閱讀
常見問題
Core Web Vitals 是哪三個核心指標?
理想的 LCP 時間應該是多少?
PageSpeed Insights 的實驗室數據和真實使用者數據有什麼差別?
如何優化網站的 LCP?
preload 和 fetchpriority 該怎麼用才不會適得其反?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。