網頁渲染效能優化與瓶頸分析 網頁卡頓影響體驗嗎

me
林彥成
2021-03-11 | 4 min.
文章目錄
  1. 1. 如何顯著提升網頁渲染效能?
  2. 2. 一、 Reconciliation & Batch 概念理解
  3. 3. 二、 渲染優化 (Rendering Performance)
  4. 4. 三、 腳本效能優化 (JavaScript Performance)
  5. 5. 總結與持續優化建議
  6. 6. FAQ:網頁渲染效能常見問題
    1. 6.1. Q1:為什麼在 React List 中一定要給唯一的 key?
    2. 6.2. Q2:如何分辨一個動畫觸發的是 Reflow 還是 Repaint?
    3. 6.3. Q3:什麼是「記憶體洩漏 (Memory Leak)」在渲染效能上的表現?

如何顯著提升網頁渲染效能?

提升網頁渲染效能(Rendering Performance)的核心在於「減少瀏覽器的重算與重繪成本」。優化路徑可分為三層:1. 架構層:理解 Reconciliation (協調) 機制,透過 Batch (批次) 處理減少直接修改實體 DOM 的頻率,降低 O(n) 比對複雜度;2. 佈局層:精準區分 Reflow (重排)Repaint (重繪),優先使用 transform 等不影響幾何屬性的 CSS 屬性以避開昂貴的佈局計算;3. 分析層:熟練運用 Chrome 開發者工具 的 Performance 面板鎖定「效能小偷」函數,並透過 Coverage 移除無用程式碼。掌握這些技術,能有效解決大量資料更新時的畫面卡頓,打造反應靈敏的現代 Web 應用。


在現代的網頁開發中,網頁渲染效能(Web Rendering Performance)已成為決定使用者體驗(UX)與搜尋引擎優化(SEO)成敗的關鍵因素之一。當網站商業邏輯中有需要大量頻繁的快速更新畫面,往往會遇到畫面卡頓的情況,這時候就需要工程師進行執行效能上的優化。

良好的前端效能優化不僅能讓使用者感到流暢,還能降低跳出率。接下來,我們將透過Chrome 開發者工具(Chrome DevTools)進行評估,並分為以下三步驟來優化你的網站:

  1. 渲染優化 (Rendering Performance):深入理解 Reflow 與 Repaint。
  2. 腳本效能優化 (JavaScript Performance):利用 Performance 面板找出效能瓶頸。
  3. 持續監控與測試:確保優化成果得以維持。

如果還不太熟悉開發者工具的話,也可以先看看怎麼透過搶票按鈕來學習 Chrome 開發者工具除錯技巧 (Debug)


一、 Reconciliation & Batch 概念理解

在探討網頁渲染效能之前,我們必須理解瀏覽器是如何處理畫面更新的。當資料更新時,從解析 HTML + CSS 變成實際畫面的過程後會產生 Render Tree,接著經過 reFlow 計算出 Render Tree 上各個元素的物理屬性,如位置、大小、visible 等等,最後執行 Repaint 把算出來的結果畫到畫面上。

對使用 React 的開發者來說,React 提供了 Reconciliation 這套機制來協助我們處理前端效能優化。每當呼叫 render() 函式時,React 會比對虛擬 DOM(Virtual DOM)與實際 DOM 的差異,僅更新必要的節點。這種比對機制的複雜度在 React 中被優化為 O(n),主要基於以下兩個假設:

  1. 兩個不同類型的 element 會產生出不同的 tree。
  2. 開發者可以通過 key prop 來指出哪些子 element 在不同的 render 下能保持不變。

Reconciliation 最重要的核心在於「Batch」(批次處理),即避免頻繁且直接地修改實體 DOM。減少不必要的運算量與 DOM 操作,是提升網頁渲染效能的第一步。

在 React 的生態系中,Redux 的 react-redux 也提供了 batch 功能,目的都是為了讓 Render Tree 的操作次數降到最低,從而提升整體的執行效率。


二、 渲染優化 (Rendering Performance)

Chrome 開發者工具 的 "More Tools" 中,"Rendering" 分頁是一個強大工具,它能即時標示畫面中正在重新繪製的部分。

Chrome 開發者工具中的 Rendering 面板,可用於追蹤網頁重新繪製區域
Chrome 開發者工具 Rendering Tab 示意圖

在進行優化時,我們需要區分:

  • Reflow (重排): 當元素的幾何屬性(寬高、位置)改變,瀏覽器需重新計算整個 Render Tree。極度耗費資源。
  • Repaint (重繪): 當樣式(顏色、陰影)改變但不影響佈局時,只需重新畫出該元素。速度較快。

舉例來說,使用 transform: scale(2); 通常只觸發 Repaint。建議參考 csstriggers 網站,查詢各 CSS 屬性的渲染代價。

查詢 CSS 屬性對渲染影響的工具界面
CSS Triggers 網站工具截圖


三、 腳本效能優化 (JavaScript Performance)

JavaScript 效能分析是進階優化的核心。Chrome 提供了 Performance、Performance Monitor 與 Coverage 三大工具,協助我們精確定位「效能小偷」。:

  1. Performance Tab: 深度分析的首選。錄製網頁行為後,透過 Call Tree 顯示哪個 Function 佔用最多執行時間。

    Performance Tab 效能分析

  2. Performance Monitor: 適合手動測試。動態觀察 CPU 使用率、記憶體占用 (Heap Size) 與 DOM 節點數量。如果 Heap Size 持續攀升,就是記憶體洩漏 (Memory Leak) 的徵兆。

    Performance Monitor 即時監測

  3. Coverage Tab: 揭示載入時哪些 CSS/JS 從未執行。這對於進行 Code Splitting (程式碼拆分)、移除冗餘腳本至關重要。

    Coverage Tab 程式碼覆蓋率


總結與持續優化建議

提升網頁渲染效能是一個持續過程:

  • 定期稽核: 使用 Lighthouse 進行自動化評分。
  • 優化圖片: 確保 alt 屬性完整與檔案體積最小化。
  • 減少阻塞: 將非關鍵 JS 標記為 deferasync

FAQ:網頁渲染效能常見問題

Q1:為什麼在 React List 中一定要給唯一的 key

A:這與 Reconciliation 機制直接相關。有了唯一的 key,React 就能在資料順序變動時,精確識別哪些 DOM 節點是「移動」而非「刪除後重建」。這能避開昂貴的 DOM 銷毀與建立過程,是 List 渲染效能優化的核心。

Q2:如何分辨一個動畫觸發的是 Reflow 還是 Repaint?

A:最簡單的方法是開啟 Chrome DevTools 的 Rendering 面板,勾選 Paint Flashing。如果整個頁面區塊都在閃綠光,那通常是引發了 Reflow;如果只有動畫元素局部閃動,則可能是 Repaint。此外,操作幾何屬性(width, height, margin, top)幾乎都會觸發 Reflow。

Q3:什麼是「記憶體洩漏 (Memory Leak)」在渲染效能上的表現?

A:當您在 Performance Monitor 看到 JS Heap Size 階梯式上升且在操作結束後不下降時,即為記憶體洩漏。在網頁上,這會導致畫面越來越卡頓,甚至瀏覽器崩潰。常見原因包括:未清除的定時器 (setInterval)、全域變數引用、或未移除的 DOM 事件監聽器。



喜歡這篇文章,請幫忙拍拍手喔 🤣