這個 API 會去收集每個元件在渲染時花費的時間,透過收集結果找到效能瓶頸(花最多時間進行渲染的元件)便可以進行優化。只要下載 React Developer Tools,就可以使用 profiler 並且拿到收集的結果了。
React Developer Tools 的 "Profiler" tab 可用於分析 React 組件的性能。在這裡,你會看到每個組件重新渲染的次數、每次重新渲染的持續時間,以及它們是由什麼因素觸發的。以下是一些界面元素和它們可能意味著什麼:
顏色說明
- 灰色: 組件沒有重新渲染。
- 黃色: 組件重新渲染,但持續時間相對較短。
值得注意的是,這些數據都是近似值,用於提供一個大致的性能分析,而非絕對精確的數據。
黃色通常表示這個組件的渲染時間相對較長,可能需要進一步優化。但在這種情況下,因為時間非常短(毫秒級別),所以可能不會對性能有太大影響。除非這個組件被頻繁地重新渲染,或者在一個列表中有大量相同的組件。
- 橙色或紅色: 組件重新渲染並且持續時間相對較長,這通常意味著這個組件可能需要優化。
重要術語和功能
- Commits: 每一次 React 虛擬 DOM 的重新渲染都稱為一個 "commit"。Profiler 會捕獲每次 commit 的信息。
- Rendered At: 顯示組件是在哪些 commits 裡被重新渲染的。
- Why Did This Render: 如果安裝了額外的函式庫(如
why-did-you-render
),這會告訴你為什麼組件重新渲染。
- Owner & Parents: 顯示組件的擁有者或父組件,這有助於了解數據是如何流動的。
- Component render time: 顯示組件渲染所花費的具體時間。
優化建議
- 減少重新渲染: 使用
React.memo()
、useMemo()
或shouldComponentUpdate
來防止不必要的重新渲染。
- 程式碼拆分: 使用
React.lazy()
和Suspense
來進行程式碼拆分。
- 優化狀態和道具: 確保不要頻繁地改變組件的狀態或道具,除非真的需要。
- 使用 Web Workers: 對於計算密集型任務,考慮使用 Web Workers。
- Batch Updates: 如果可能,批量更新狀態以減少重新渲染。
- Virtualize Long Lists: 對於長列表,使用虛擬化(如
react-window
)。
使用 Profiler 來找到性能瓶頸後,你就可以更有針對性地進行優化。
在 React Developer Tools 的 Profiler 裡,"render at Xs for Yms" 這種訊息提供了兩個主要的數據點:
- Xs(例如:1.9s, 2.8s, 3.6s, 4.4s):這個時間戳記表示從 Profiler 開始捕捉數據後,組件何時進行了重新渲染。這是相對於 Profiler 開始記錄的時間。
- Yms(例如:0.4ms, 1.1ms, 0.6ms, 0.8ms):這是組件重新渲染所需的具體時間(以毫秒為單位)。
- 如何解讀:
- "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)