React的diff演算法

看風景就發表於2018-10-28

React的diff演算法主要是兩個Tree的比較。

傳統的Tree diff演算法複雜度是O(n^3),React是演算法通過一些策略將複雜度將為O(n).

1. 優化策略

1. 網頁中的DOM跨層級移動的特別少,可以忽略不計
2. 相同型別的元件生成相似的樹形結構,不同型別的元件生成不同的樹形結構
3. 同一層級的節點,可以通過唯一id來區分

2. 優化演算法

基於以上的策略,React對diff演算法進行了一下優化

1. tree diff

只對同一層級的節點進行比較,跨層級移動,直接銷燬子樹,在目的節點完全插入子樹,這樣只需對樹進行一次遍歷,便能完成整個DOM樹的比較

2. component diff

1. 同一型別元件,按照tree diff進行同級比較,並且增加了shouldComponentUpdate鉤子來判斷元件是否發生變化,無變化,不比較,從而節省diff時間
2. 不同型別元件,將元件標記為dirty component,從而替換整個元件下的所有子節點

3. element diff

對於同一層級的element,通過唯一id,可以優化其新增,修改,刪除操作


在開發React元件時,保持DOM結構的穩定有助於提示效能。

 

參考:https://segmentfault.com/a/1190000004913592
   https://segmentfault.com/a/1190000010686582

相關文章