Web 效能優化:
Core Web Vitals 與 Lighthouse 實戰
LCP、INP、CLS 三大指標 — 從分析到實際改善,讓你的 Google Search 評分達到 90+
Section 1:為什麼效能很重要(數據說話)
Web 效能不只是技術問題,它直接影響業務成果。以下是幾個有名的數據,可以幫助你在團隊中說服非技術的利益相關人為何值得投資效能優化。
Google 研究
每增加 1 秒
轉換率下降 7%
行動版網頁載入時間與轉換率的直接關聯研究
Amazon
每 100ms 延遲
損失 1% 銷售額
早在 2006 年就發現的規律,至今仍被廣泛引用
BBC
每增加 1 秒
損失 10% 用戶
行動版新聞網站用戶留存率與速度的相關性
Core Web Vitals 是 Google 排名因素之一(2021 年起)
Google 在 2021 年 6 月正式將 Core Web Vitals 納入搜尋排名演算法。在內容品質相近的情況下,效能更好的網頁會獲得更高的排名。這讓效能優化從「加分項」變成了「必要條件」。
最大內容渲染時間
衡量載入速度
Largest Contentful Paint
互動反應速度
衡量互動性
Interaction to Next Paint
版面位移量
衡量視覺穩定性
Cumulative Layout Shift
INP 在 2024 年 3 月取代了 FID
舊的 FID(First Input Delay)只量測第一次互動的延遲,而 INP 量測整個頁面生命週期中所有互動的反應速度,更能反映用戶的實際體驗。如果你在看舊文章,FID 已經不再是 Core Web Vitals 的一部分。
Section 2:LCP(Largest Contentful Paint)— 讓頁面快速顯示主要內容
< 2.5s
良好
2.5s — 4s
需改善
> 4s
差
LCP 量測的是頁面上「視口中最大的內容元素」完成渲染的時間。通常是 Hero 圖片、大標題(H1)或背景圖。改善 LCP 的本質是:讓瀏覽器盡快取得這個元素所需的資源。
問題 1:圖片沒有優化
LCP 元素最常見的是圖片。使用 Next.js 的 Image 組件,你幾乎可以自動解決圖片相關的所有 LCP 問題。
問題 2:字型阻塞渲染
Google Fonts 的傳統 <link> 標籤需要建立額外的 HTTP 連線,字型未載入完成前文字渲染可能被阻塞,造成 Flash of Invisible Text(FOIT)。
問題 3:Server Response 太慢(TTFB 高)
TTFB(Time to First Byte)高表示伺服器處理時間太長。LCP 不可能在 TTFB 之前完成,所以 TTFB 是 LCP 的下限。
使用 CDN / Edge Network
- •Vercel 自動將靜態內容部署到全球 Edge 節點
- •Cloudflare Pages 同樣效果
- •用戶從最近的伺服器取得內容,TTFB 從 300ms 降到 10ms
加資料庫索引
- •找出慢查詢(slow query log)
- •在 WHERE 條件的欄位加索引
- •善用 ORM 的 explain() 分析查詢計畫
使用 ISR / SSG 預渲染
- •靜態頁面從 CDN 直接回傳,TTFB < 50ms
- •ISR 讓你有定期更新的靜態頁面
- •動態部分用 Suspense streaming
Section 3:INP(Interaction to Next Paint)— 互動要快速
< 200ms
良好
200ms — 500ms
需改善
> 500ms
差
INP 量測從用戶互動(點擊、鍵盤輸入、觸碰)到瀏覽器完成下一次繪製的時間。如果 INP 高,用戶會感覺頁面「卡卡的」— 按了按鈕沒反應、輸入文字有延遲。根本原因通常是 JavaScript 主線程被阻塞。
問題 1:JavaScript 主線程阻塞
瀏覽器的 JavaScript 主線程同時負責執行 JS 和繪製畫面。如果有昂貴的同步運算佔用主線程,用戶互動的回應就會被延遲。
問題 2:大型 Component 的重新渲染
問題 3:事件 Handler 太慢
Section 4:CLS(Cumulative Layout Shift)— 防止頁面跳動
< 0.1
良好
0.1 — 0.25
需改善
> 0.25
差
CLS 量測頁面生命週期中意外的版面位移總量。當用戶正在點擊某個按鈕,結果按鈕突然跑掉、點到了別的東西 — 這就是 CLS 造成的糟糕體驗。CLS 的分數是所有位移事件的加總(位移幅度 × 受影響的視口比例)。
問題 1:圖片沒有設定尺寸(最常見)
問題 2:字型替換導致文字位移
問題 3:動態注入的內容(廣告、Banner)
問題 4:動畫導致位移(用 transform 而非 margin)
Section 5:Next.js 效能最佳實踐清單
使用 Next.js 開發時,框架本身提供了許多效能優化工具。以下是一份可以立刻套用到你的專案的最佳實踐清單,每一項都有對應的實作方式。
1. Image 優化完整設定
2. Dynamic Import — 程式碼分割
Dynamic Import 讓你把大型組件分割成獨立的 JS chunk,只有在需要時才下載。這直接減少初始頁面的 JS 大小,改善 LCP 和 INP。
3. Script 最佳化載入
4. Bundle 大小分析
高效能清單
- ✓ LCP 元素加 priority 屬性
- ✓ 所有 Image 設定 width + height
- ✓ 字型使用 next/font/google
- ✓ 大型組件使用 dynamic import
- ✓ 第三方 Script 使用適當的 strategy
- ✓ 動畫只用 transform 和 opacity
常見錯誤
- ✗ 所有圖片都加 priority(失去 lazy loading 效益)
- ✗ 使用原生 img 標籤載入大圖
- ✗ 把整個 lodash 引入只用一個函式
- ✗ 在主線程做昂貴的同步計算
- ✗ 動畫使用 margin/top/left
- ✗ 圖片沒有設定 sizes(讓瀏覽器下載過大的圖片)
Section 6:用 Lighthouse 找出問題
Lighthouse 是 Google 提供的開源自動化網頁品質工具,內建在 Chrome DevTools 中。它從 Performance、Accessibility、Best Practices、SEO 四個維度評分,並提供具體的改善建議,是效能優化的最佳起點。
使用 Lighthouse
Lighthouse 分數解讀
| 分數 | 狀態 | 說明 |
|---|---|---|
| 90 — 100 | 🟢優秀 | 達到業界最佳實踐,SEO 有加分效果 |
| 50 — 89 | 🟡需要改善 | 有明顯的效能問題,建議優先處理分數較低的類別 |
| 0 — 49 | 🔴差 | 嚴重的效能問題,可能直接影響 SEO 排名和用戶體驗 |
最常見的 Lighthouse 建議
1. Serve images in next-gen formats
可節省 30-50% 圖片大小建議將 JPEG/PNG 轉換為 WebP 或 AVIF 格式。WebP 比 JPEG 小 25-35%,AVIF 更小但相容性稍差。使用 next/image 會自動轉換為 WebP/AVIF,完全解決這個問題。
2. Eliminate render-blocking resources
可改善 200-500ms 的 LCP某些 JS 和 CSS 在載入完成前會阻止頁面渲染。對 JS 加 defer/async,對不重要的 CSS 動態載入。Next.js 的 Script 組件幫你管理這個問題。
3. Reduce unused JavaScript
可節省 50-80% 的初始 JS 大小頁面載入了大量從未被執行的 JS。解決方法是程式碼分割(Dynamic Import)和 Tree Shaking。用 Bundle Analyzer 找出最大的 chunk。
4. Properly size images
可節省 90% 以上的圖片傳輸量圖片的實際像素遠大於顯示尺寸。例如上傳了 4000x3000px 的圖片,但只顯示 400x300px,浪費了 100 倍的資料量。使用 next/image 的 sizes 屬性解決。
5. Enable text compression
JS/CSS 壓縮後通常縮小 70%HTML、JS、CSS 等文字資源沒有壓縮。啟用 gzip 或 brotli 壓縮可以大幅減少傳輸大小。Vercel 和大多數現代主機自動啟用。
在 CI/CD 中整合 Lighthouse
效能優化的優先順序建議
效能優化是一個持續的過程,不要試圖一次解決所有問題。建議的優先順序:
- 先用 Lighthouse 找出最嚴重的問題(分數最低的建議)
- 修復 LCP(圖片優化、priority、字型)— 影響最大且通常最容易
- 修復 CLS(設定圖片尺寸、保留廣告空間)— 避免用戶點錯
- 改善 INP(程式碼分割、startTransition)— 需要更深入的分析
- 持續監控:在 CI/CD 設定效能門檻,防止退步