[note] React Performance
React Performance @ Frontend Master
原則
- 不額外做事總是比做事來的快:如果能透過「調整 component 階層或 state」就解決問題的話,這是第一優先選擇
- 當客觀數據顯示利大於弊時,才考慮用「memoization」
- 有些事情可以延後執行,則可以使用 Suspense API
- 先執行緊急的事情,接著再執行較不緊急的事情,這可以使用「Transition API」
React Developer Tools: Profiler 的使用
Top Bar
- 觀察的重點是 Render duration
Flame graph
點擊每一個 bar 會看到每次 render 時不同的 flame graph,寬度約寬表示所需的時間越久,並且可以看到導致拖這麽久的元素是什麼:
Ranked
點擊每一個 bar 會看到每次 render 時不同的 Ranked,排序後可以很清楚知道,有問題的 component 是 ExpensiveComponent
:
Timeline
從 Timeline 也可以清楚看到導致 render 時間拉長的原因:
觀察問題
Chrome Performance: 出現紅標
Chrome 的 Performance Tools 會針對有問題的部分標上「紅標」:
React Profiler: Render 的時間超過16ms
一般來說,要讓使用者用起來覺得順暢,至少要 60 FPS(frames per second),1000ms/60 = 16.67ms,也就是 render 的時間不應該超過 16ms。
如果從 React Profiling Tools 發現它 render 的時間超過 16ms,像是下圖,除了第一次 render 需要 300ms 外,每次畫面 re-render 也需要 300ms 以上,表示有明顯的效能問題:
從 Ranked 頁籤可以很明確知道問題是發生在那個 component:
從 Timeline 的頁籤也可以看到每次 render 都花了超過 300ms 的時間:
比較正常的情況應該要是,第一次載入因為有做複雜的運算,所以花了比較久的時間,但後續 UI re-render 時,都不應該超過 16ms:
當使用者操作時有多少元件 re-render
把 "Highlight updates when components render" 打開:
接著在和畫面互動時,可以很明確的看到哪些 component 會 re-render:
最理想的情況是,真的值有改變的 component 才去 re-render(有藍框框),其他無關的元件則最好不要有藍框框出現。