React DOM

從來沒去搞懂 react 的一些機制

瀏覽器怎麼渲染網頁

瀏覽器會遵照一些既有的規則,去解析我們的 HTML 和 CSS 檔案,分別做成 DOM 和 CSSOM 等樹狀結構,最後再合併成 Render Tree。

Web Browser Rendering

Reflow

當 DOM 結構、元素的大小、位置或其他與 layout 的屬性改變時,瀏覽器會重新計算所有元素的位置

Repaint

當 DOM 變更影響了元素的外觀(顏色、背景、陰影等),瀏覽器只需要重新繪製該元素,成本沒有 Reflow 那麼高

React Virtual DOM

傳統的方法是直接更改 Real DOM,像是如果我有 document.getElementById().innerHTML = "new content",他會直接去更新 Real DOM,更新完後 Reflow 或 Repaint 可能會再做一遍,成本很高。如果我有數個相似的操作,就會很慢。

React 會在記憶體中建立一個 JavaScript 物件(Virtual DOM),這個物件是一個與 Real DOM 結構相似的樹。當 State 改變時, React 比較新舊版本的 Virtual DOM 的樹上的每一個節點,然後更新,最後批次更改 Real DOM,減少花費的成本。

React 的 re-rendering

上面提到,React 會比較新舊 Virtual DOM 的差異,最後更新到 Real DOM 上面。其中他會檢查 Virtual DOM 更新的部分,稱為 re-render,而非指 repaint。

React 中可以減少 re-rendering 的方式

  • memo
  • useCallback
  • babel-plugin-react-compiler

參考資料

浏览器的重绘 (repaint) 和重排 (reflow)
Why is every React site so slow?


React DOM
https://933yee.github.io/notes/2025/02/03/react-dom/
Author
Kevin Lee
Posted on
February 3, 2025
Licensed under