React Profiler

React Profiler

這個 API 會去收集每個元件在渲染時花費的時間,透過收集結果找到效能瓶頸(花最多時間進行渲染的元件)便可以進行優化。只要下載 React Developer Tools,就可以使用 profiler 並且拿到收集的結果了。
React Developer Tools 的 "Profiler" tab 可用於分析 React 組件的性能。在這裡,你會看到每個組件重新渲染的次數、每次重新渲染的持續時間,以及它們是由什麼因素觸發的。以下是一些界面元素和它們可能意味著什麼:

顏色說明

  • 灰色: 組件沒有重新渲染。
  • 黃色: 組件重新渲染,但持續時間相對較短。
    • 值得注意的是,這些數據都是近似值,用於提供一個大致的性能分析,而非絕對精確的數據。
      黃色通常表示這個組件的渲染時間相對較長,可能需要進一步優化。但在這種情況下,因為時間非常短(毫秒級別),所以可能不會對性能有太大影響。除非這個組件被頻繁地重新渲染,或者在一個列表中有大量相同的組件。
  • 橙色或紅色: 組件重新渲染並且持續時間相對較長,這通常意味著這個組件可能需要優化。

重要術語和功能

  1. Commits: 每一次 React 虛擬 DOM 的重新渲染都稱為一個 "commit"。Profiler 會捕獲每次 commit 的信息。
  1. Rendered At: 顯示組件是在哪些 commits 裡被重新渲染的。
  1. Why Did This Render: 如果安裝了額外的函式庫(如 why-did-you-render),這會告訴你為什麼組件重新渲染。
  1. Owner & Parents: 顯示組件的擁有者或父組件,這有助於了解數據是如何流動的。
  1. Component render time: 顯示組件渲染所花費的具體時間。

優化建議

  1. 減少重新渲染: 使用 React.memo()useMemo()shouldComponentUpdate 來防止不必要的重新渲染。
  1. 程式碼拆分: 使用 React.lazy()Suspense 來進行程式碼拆分。
  1. 優化狀態和道具: 確保不要頻繁地改變組件的狀態或道具,除非真的需要。
  1. 使用 Web Workers: 對於計算密集型任務,考慮使用 Web Workers。
  1. Batch Updates: 如果可能,批量更新狀態以減少重新渲染。
  1. Virtualize Long Lists: 對於長列表,使用虛擬化(如 react-window)。
使用 Profiler 來找到性能瓶頸後,你就可以更有針對性地進行優化。
 
在 React Developer Tools 的 Profiler 裡,"render at Xs for Yms" 這種訊息提供了兩個主要的數據點:
  1. Xs(例如:1.9s, 2.8s, 3.6s, 4.4s):這個時間戳記表示從 Profiler 開始捕捉數據後,組件何時進行了重新渲染。這是相對於 Profiler 開始記錄的時間。
  1. Yms(例如:0.4ms, 1.1ms, 0.6ms, 0.8ms):這是組件重新渲染所需的具體時間(以毫秒為單位)。
  1. 如何解讀:
  • "1.9s for 0.4ms":在 Profiler 開始記錄後的 1.9 秒,這個組件進行了一次渲染,並且這個渲染過程花費了 0.4 毫秒。
  • "2.8s for 1.1ms":在 Profiler 開始記錄後的 2.8 秒,這個組件進行了另一次渲染,這次花費了 1.1 毫秒。
 
參考資料:讓 React 效能更好或是避免效能變差的技巧
 
React 效能優化篇-上篇(四個優化效能的技巧)
 
React 效能優化篇-下篇(介紹 React Profiler)