在 react16 沒有正式公佈之前,業界的人員覺得此次的 react16 就叫作 Fiber,足以說明 Fiber 的重要性。fiber 在英文中意爲纖維,此處意爲比線程還細的單位。Facebook 取名 Fiber 的意思是爲了描述一個比線程更小單位的渲染機制。用一句話來描述我所理解的 Fiber 架構:react
新的 Fiber 架構改變了以前 react 同步的組件渲染機制,使原來同步渲染的組件如今能夠異步化,可中途中斷渲染,執行更高優先級的任務,用戶體驗更好。git
每次更新都不是無病呻吟的改變,而是爲了解決問題,Fiber 的引入主要是爲了解決在網頁裏面用戶和網頁應用進行交互的問題:github
咱們用下面的一個案例來描述 react15 存在的問題: 在一個頁面元素不少,且須要頻繁刷新的狀況下,react15 會出現失幀的狀況,以下圖: demo地址:claudiopro.github.io/react-fiber…web
其根本緣由是:大量的同步計算任務阻塞了瀏覽器的 UI 渲染。默認狀況下,JS 運算、頁面佈局和頁面繪製都是運行在瀏覽器的主線程當中,他們之間是互斥的關係。若是 JS 運算持續佔用主線程,頁面就無法獲得及時的更新。當咱們調用 setState 更新頁面的時候,React 會遍歷應用的全部節點,計算出差別,而後再更新UI,整個過程是一鼓作氣,不能被打斷的。若是頁面元素不少,整個過程佔用的時機就可能超過16毫秒,就容易出現掉幀的現象。 針對這一問題,React 團隊從框架層面對 web 頁面的運行機制作了優化,獲得很好的效果。改變以後的效果見下圖:瀏覽器
解決主線程長時間被 JS 運算佔用這一問題的基本思路,是將運算切割爲多個步驟,分批完成。也就是說在完成一部分任務以後,再將控制權交回給瀏覽器,讓瀏覽器有時間進行頁面的渲染。等瀏覽器忙完以後,再繼續以前未完成的任務。架構
這裏改動最大的當屬 Reconciler 層了,爲了和以前的作區別,咱們有了以下稱呼的約定:框架
Stack Reconciler 運做的過程是不能被打斷的,必須一條道走到黑:異步
Fiber Reconciler 每執行一段時間,都會將控制權交回給瀏覽器,能夠分段執行:函數
任務優先級佈局
爲了達到這種效果,須要有一個調度器(schedular)來根據任務的優先級進行任務的分配。優先級高的任務(如鍵盤輸入)能夠打斷優先級低的任務的執行,從而更快的生效。任務的優先級分爲六種:
在react的生命週期中,以 render 爲界限,分爲兩個階段,分別爲:
render phase 這個階段所作的事很是重要,所以咱們須要瞭解下 render phase 的機制。
由於 render phase 階段會被打斷的特性,因此 render phase 階段的生命週期函數可能會被執行屢次。所以,咱們須要保證 render phase 階段的生命週期函數是沒有反作用的純函數,確保每次執行都是同樣的輸出結果。
Facebook比較慎重,16的第一個版本並無啓用這個功能,防止改變太大,影響到別的開發人員的正常工做。在 react16 晚一些的版本中會給出一個選項能夠開啓 fiber,在默認狀況下是關閉的。
另外,facebook 在 react16 增長 Fiber 結構,其實並非爲了減小組件的渲染時間,事實上也並不會減小,反而會增長。解決的是使得一些更高優先級的任務可以優先執行,提升用戶的體驗,從用戶的角度不會感受到卡頓。
最後,還有一些問題並無獲得很好地解釋,好比飢餓問題,即若是優先級高的任務一直存在,那麼優先級低的任務將一直沒有辦法執行。咱們期待 react 能給出優秀的解決方案。