成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何方便的檢測React項目的性能?

開發 前端
React本身就內置了性能檢測組件 —— Profiler,可以很方便的檢測React項目的性能。

大家好,我卡頌。

對于長期迭代的React項目,性能是不能忽視的問題。通常我們通過:

  • React-Dev-Tools的Profiler面板
  • 一些第三方工具,比如why-did-you-render[1]

檢測運行時性能瓶頸。

實際上,React本身就內置了性能檢測組件 —— Profiler,可以很方便的檢測React項目的性能。

使用方式

Profiler是個內置組件,用他包裹需要檢測性能的組件即可:

<Profiler id="App" onRender={onRender}>
  <App />
</Profiler>

嵌套使用也是可以的:

<App>
  <Profiler id="Sidebar" onRender={onRender}>
    <Sidebar />
  </Profiler>
  <Profiler id="Content" onRender={onRender}>
    <Content />
  </Profiler>
</App>

Profiler會檢測被他包裹的組件樹的性能,檢測結果會作為onRender回調的參數:

function onRender(
  id, 
  phase, 
  actualDuration, baseDuration, 
  startTime, commitTime
) {
  // ...回調
}

那么,這些參數都是什么意思呢?其實我們完全沒必要記這些。

我們只需要知道,一些典型的性能優化場景該使用哪些參數就行。

場景1:組件是不是嵌套更新?

對于一般的組件更新,會經歷4個步驟:

  1. 組件觸發更新
  2. 計算更新的影響
  3. 執行DOM操作
  4. 視圖更新

但如果在上一次更新流程的4個步驟還未走完的情況下,又觸發新的更新:

可以發現,在這種情況下,「視圖更新」的時機遠滯后于一般更新流程,這會造成頁面交互卡頓。

這就是「組件嵌套更新」,通常我們在useLayoutEffect中觸發新的更新會遇到這種情況。

Profiler onRender回調的phase參數,用來表示組件所處更新階段:

  • mount,代表組件是首屏渲染。
  • update,代表組件更新。
  • nested-update,代表組件嵌套更新。

通過該參數可以判斷組件是否處于嵌套更新。

當遇到嵌套更新造成的性能問題,可以考慮用useEffect替代useLayoutEffect。

場景2:性能優化到底起沒起作用?

當提到「性能優化」,很多同學第一反應就是:

  • useCallback
  • useMemo
  • React.memo

但當我們使用這些性能優化API后,我們怎么知道性能是否變得更好?

為了檢測優化效果,通常會在關鍵組件打印個log,如果狀態更新后log沒打印,代表組件沒有render,命中緩存成功,比如這樣:

function App() {
  console.log('App render')
  // ...省略邏輯
}

但這樣并不能反映性能優化的整體效果。這時候可以考慮Profiler中的actualDuration與baseDuration參數:

  • baseDuration衡量組件子樹在不命中任何緩存時,完整render一次所花時間。
  • actualDuration衡量組件子樹實際完整render一次所花時間。

所以,用baseDuration減去actualDuration剩余的時間,就是性能優化節約的時間。

比如,對下面的<App/>組件性能優化后,只需要在onRender中比較baseDuration與actualDuration之間的差就能度量<App />的性能優化效果:

<Profiler id="App" onRender={onRender}>
  <App />
</Profiler>

這個值越高,代表性能優化效果越好。當接近0時,代表性能優化沒有起到作用。

需要注意的是,baseDuration是通過子樹中每個組件最近render所需時間匯總求和得到的近似值,有時并不準確

如果你的同事固執的認為所有函數props都必須用useCallback包裹,所有變量props都必須用useMemo包裹,請用以上數據狠狠的和他講道理。

場景3:項目的性能瓶頸在哪?

當我們要做性能優化時,首先應該明確 —— 項目的性能瓶頸在哪?此時,可以用Profiler劃分幾個「待比較區域」,再分別對比actualDuration。

比如,對于下面的應用:

<App>
  <Sidebar />
  <Content />
</App>

<Sidebar />和<Content />誰render更耗時?

此時可以用Profiler分別包裹這兩個組件:

<App>
  <Profiler id="Sidebar" onRender={onRender}>
    <Sidebar />
  </Profiler>
  <Profiler id="Content" onRender={onRender}>
    <Content />
  </Profiler>
</App>

再分別在onRender中衡量actualDuration,值比較高的區域render更耗時。

這種方式定制性比較高。如果想更直觀比較哪些組件render更耗時,可以使用React Dev Tools中Profiler面板的火炬圖。

總結

Profiler是React內置的性能分析組件,用于度量其包裹的子樹的渲染性能。

最后說個有意思的細節 —— 在官網Profiler部分[2]中只介紹了Profiler有onRender這個回調。

從Profiler源碼看,他還存在:

  • onCommit回調
  • onPostCommit回調
  • onNestedUpdateScheduled回調

不知道為什么,他們沒有在文檔中提及。

參考資料

[1]why-did-you-render:https://www.npmjs.com/package/@welldone-software/why-did-you-render。

[2]官網Profiler部分:https://react.dev/reference/react/Profiler。

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2022-11-09 11:50:21

2023-04-07 15:12:46

ReactReact-Intl

2022-08-03 09:11:31

React性能優化

2010-04-13 14:43:37

Oracle性能檢測

2024-05-13 08:16:59

React任務調度鏈表結構

2023-07-04 07:30:35

React開發樣式

2023-07-19 15:45:47

ReactDOM輕量級

2020-03-11 20:38:13

JavaScript前端工具

2020-09-16 14:39:13

ReactJavaScript框架

2024-01-29 09:29:02

計算機視覺模型

2023-04-14 09:01:23

2015-07-07 10:11:39

GitHub項目流行度

2009-02-04 15:55:31

敏捷開發敏捷項目項目經理

2020-03-13 07:32:18

物聯網項目物聯網IOT

2021-04-14 08:20:46

Lighthouse工具性能檢測

2021-08-27 14:26:06

開發技能React

2022-10-31 11:09:48

物聯網智能建筑

2024-07-18 08:08:06

2023-06-20 18:33:00

DOM框架React

2010-07-27 09:24:21

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产色 | 欧美一级三级 | 成人久久久久久久久 | 午夜视频在线免费观看 | 欧美午夜精品 | 在线超碰 | 国产一级一级国产 | 综合国产第二页 | 人和拘一级毛片c | 91一区二区 | 亚洲成av| 国产亚洲一区二区三区在线 | a级在线观看 | 亚洲高清在线观看 | 欧美一区二区三区在线免费观看 | 国产精品99久久久久久www | 国产高清精品一区二区三区 | 久久精品一区 | 国产精品视频 | 高清亚洲 | 国产精品成av人在线视午夜片 | 国产探花在线精品一区二区 | 亚洲国产精品一区二区三区 | 国产99久久精品一区二区300 | 色综合久久久久 | 国产精品一区二区在线免费观看 | 精品美女视频在免费观看 | 国产高清在线精品 | 91精品国产综合久久福利软件 | 91高清视频在线观看 | 黄色在线免费观看 | 午夜a√ | 久久蜜桃av一区二区天堂 | 欧美日韩在线视频一区 | 日韩欧美在线一区 | 激情网五月天 | 欧美精品一二三 | 我爱操| 亚洲精品视频在线 | 亚洲不卡| 91精品久久久久久久久久 |