[React] React reconciliation, Virtual DOM
什麼是 Virtual DOM
Virtual DOM 實際上就是用物件來描述 DOM 的結構並儲存在 memory 裡,在 DOM 的節點需要更動時,不直接修改 DOM,而是透過 diff 演算法比較 Virtual DOM 修改前與修改後的樹狀結構,然後批次更新真實 DOM 中的節點。
什麼是 React reconciliation
:reconciliation 指的是 react 更新 Virtual-DOM 和 DOM 的過程,透過只更新有更動的部分,讓 React 可以比操作原生 DOM 更省效能跟快速。
為什麼需要 reconciliation?
因為瀏覽器的 DOM 操作是很消耗資源的。透過 React 提供的 declarative api(宣告式 api,指僅需要用其透過的 api 來執行程式,而不需要操控到底層得內容。Ex, react 提供 render, jsx 語法讓我們不用實際操控到 DOM),和其 diff 演算法(只改動 virtual-DOM 中有改動的部分),讓程式可以在 state 改變的情況下更快速。
什麼是 React fiber?
TLDR: React fiber(a unit of work) 是內部的引擎機制,達到幾件事
- 可以將頁面渲染的任務切分成 chunks(time slicing)
- 不同的任務可以有優先等級
- 任務可以暫停,之後再繼續執行(這也是將任務分優先級的目的,當做到一半出現更高優先級的任務的時候,可以先暫停目前工作的執行,等處理完高優先任務後再回來繼續執行)
- fiber 是 asynchronous
來解決頁面卡頓等破壞使用者體驗的事件。
舊的 reconciler: stack
- stack 是 synchronous
- 只有在 stack 是 empty 時才能再次使用
fiber always has a 1-1 relationship with 'something'(ex, fragment, functionalComponent, contextConsumer...)
render phase:
- asynchronous
- tasks can be prioritized
commit phase:
- synchronous and can't be interrupted
Resources:
https://www.freecodecamp.org/news/lets-fall-in-love-with-react-fiber-90f2e1f68ded/ https://medium.com/starbugs/react-%E9%96%8B%E7%99%BC%E8%80%85%E4%B8%80%E5%AE%9A%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84%E5%BA%95%E5%B1%A4%E6%9E%B6%E6%A7%8B-react-fiber-c3ccd3b047a1
https://segmentfault.com/a/1190000039682751
https://cloud.tencent.com/developer/article/1882296
https://tech-blog.cymetrics.io/posts/mingyou/deep-dive-into-react-fiber/
https://reactjs.org/docs/reconciliation.html https://github.com/acdlite/react-fiber-architecture https://hackernoon.com/virtual-dom-reconciliation-and-diffing-algorithm-explained-simply-ycn34gr