借鑒:
「React深入」一文吃透虛擬DOM和diff算法 - 掘金 (juejin.cn)
虛擬dom、fiber、渲染dom、dom-diff - 掘金 (juejin.cn)
未閱讀源碼,了解層面,后續可以深入了解
1.虛擬DOM
①.結構上:虛擬DOM比真實DOM輕很多
②.操作上:虛擬DOM比真實DOM性能高
③.流程上:一個頁面如果有500次變化,沒有虛擬DOM的就會渲染500次,而虛擬DOM只需要渲染一次,從這點上來看,頁面越復雜,虛擬DOM的優勢越大
2.虛擬DOM
2.1概念:一個對象
2.2.React中為組件大寫原因:如果標簽的首字母是小寫,就會被認定為原生標簽,反之就是React組件
2.3虛擬DOM優勢:
①效率高,不用關注原生DOM,更關注業務層
②性能提升:瀏覽器在處理DOM的時候會很慢,處理JavaScript會很快。虛擬DOM減少真實DOM操作,提升性能。
③虛擬DOM不一定提升性能。虛擬DOM優勢在于diff算法和批量處理策略。首次加載,比起原生DOM,虛擬DOM多了一層計算,消耗了性能 ,會比html慢
④兼容性和跨平臺性
3.構建虛擬DOM
3.1 React.createElement?
3.1.1 react自身可以防止xss攻擊(跨站腳本攻擊)
3.2 轉換為真是DOM:虛擬DOM
轉化為真實DOM
的這個過程實際上非常復雜,大體上可以分為四步:?處理參數
、批量處理
、生成html
和渲染html
4.diff算法
4.1 與傳統diff算法相比復雜度從
O(n^ 3)?轉化為O(n)?
4.2 diff策略
React通過三大策略完成了優化:
- Web UI 中 DOM 節點跨層級的移動操作特別少,可以忽略不計。
- 擁有相同類的兩個組件將會生成相似的樹形結構,擁有不同類的兩個組件將會生成不同的樹形結構。
- 對于同一層級的一組子節點,它們可以通過唯一 id 進行區分。
分別對應:tree diff
、component diff
、element diff
三 react fiber 是react16新增的更新機制,讓react 更新過程可控,提升性能
在react v16之前更新組件只有兩層,分別是:
- Reconciler(調和器)—— 負責找出變化的組件;
- Renderer(渲染器)—— 負責將變化的組件渲染到頁面上; 缺點就是采用遞歸的方式去調和虛擬Dom且這個調和的過程不能被打斷。如果是一個很大的項目,很容易卡住頁面。 react v16+新增加了一層調度器。分別是:
- scheduler(調度器)—— 負責調度任務的優先級,優先級高的任務有限執行。暫停其他任務。
- Reconciler(協調器)—— 負責找出變化的組件:更新工作從遞歸變成了可以中斷的循環過程。Reconciler內部采用了Fiber的架構
- Renderer(渲染器)—— 負責將變化的組件渲染到頁面上;
1.每個元素都有fiber對象對應,形成fiber樹
2.react fiber的更新過程是碎片化的,一次更新會分成n個任務片。每個片執行完成后就將控制權給到調度器。
3.調度器查看有沒有更高級任務(比如 alert,onclick等),如果有就執行更高級任務,沒有久久繼續執行fiber更新。該功能基于requestldeleCallback實現
????????