快速理解 React 基礎:Fiber
Fiber 是什麼?
Fiber 是一純 JavaScript object
在 React 16.3 釋出,抽換整個 React 底層,將舊版的Virtual DOM Tree -> Fiber Tree
主要是強化下列兩點:
- Animations (動畫)
- Responsiveness (反應能力)
Fiber 特性
- 一個Fiber(即 Fiber node),就是一個工作單位(a unit of work)
- 可以將頁面渲染的任務切分成 chunks
- 可以設定優先級(prioritize),以調整工作順序
- 任務可以暫停,之後再繼續執行(當有高優先級的任務進來時,暫停現有任務,處理完後再回來繼續處理)
- 可以重複使用之前的 work,也可以將不需要的 work 丟棄掉
- 非同步(異步)
Fiber node
- 跟某個東西有1對1關聯(1-1 relationship),如 component instance, DOM node, provider, Fragment…之類的
- Fiber 跟 react element 很像,主要差別是 Fiber 會盡可能的重複利用。大部份 Fiber 都在 initial mount 就建立完成
- Fiber 也會組成一棵樹(Fiber Tree),其 relationship 包含 child, sibling, return
- 取名為 Fiber Tree 就是要避免與舊版的 Virtual DOM Tree 混淆
- Fiber Tree 會依深度優先搜尋 (DFS) 由上至下遍歷,再由 return 回到父節點拜訪 sibling
- 拜訪順序: child -> 自身 -> sibling
- 由LinkedList 組成,遍歷過程是 while loop 而非 recursive(遞迴)。16.3 以前的 Virtual DOM Tree 使用 stack
Phase
有 2 個 phases
- render phase (processing) -> 可排列優先順序(prioritized)、可暫停、廢棄掉。此時皆在背景作業,user 看不到
- commit phase (committing) -> 同步動作,不可被中斷。結束後反應到畫面上
可以把 render phase 的主要目的想成需要產出
- 一個 Fiber Tree
- 一個 Effect List
Effect List(副作用清單): 當 Fiber Tree 處理完後,會組出 Effect List。再遍歷 effect list 處理副作用(同時解決舊版 stack 過深造成的效能問題)
以 React 來說主要的 side effect 有兩種:
- DOM 操作
- calling lifecycle method
參考資料
medium / React 開發者一定要知道的底層機制 — React Fiber Reconciler
YouTube / What Is React Fiber? React.js Deep Dive #2