欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React Fiber中面試官最關心的技術話題

 更新時間:2023年06月29日 08:59:37   作者:沐華  
這篇文章主要為大家介紹了React Fiber中面試官最關心的技術話題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

關于 React Fiber 出來也有幾年了,可最近面試多了才發(fā)現(xiàn),還是有很多人一知半解,所以本文梳理了一下有關 Fiber、以及這個話題環(huán)環(huán)相扣,可以延伸的點,給大家面試復習、查缺補漏,如果你是面試官也可直接拿去提問

React Fiber

說一下 React Fiber

是指時間分片嘛,可以把渲染工作切片,優(yōu)化渲染性能的。

因為 React 是函數(shù)式編程嘛,單向數(shù)據(jù)流,需要手動 setState 來更新,所以當數(shù)據(jù)改變時會默認全部重新渲染整個組件樹,而構(gòu)建虛擬 DOM 則是采用同步遞歸的方式,如果組件很復雜且嵌套深,那么這個構(gòu)建虛擬 DOM 的過程就需要很多時間,而這種任務默認要執(zhí)行完才會把控制權交給瀏覽器,一旦執(zhí)行時間很長,可能就會地把瀏覽器卡死。

雖然可以用 pureComponent/shouldComponentUpdate/useMemo/useCallback 等方法來進行控制部分更新或緩存,但也是治標不治本。而 fiber 是可以使渲染過程被中斷,可以把控制權先交還給瀏覽器,讓位高優(yōu)先級的任務,等瀏覽器空閑時再恢復渲染,這樣就不會顯得卡頓,而是一幀一幀有規(guī)律的執(zhí)行任務,看起來雖然有點慢,但是一直在慢慢執(zhí)行的

就像一個房子,組件層級就像房子的樓層,但是每一層房子頂都破了很多個洞的,那幾個方法就像一片瓦,都能蓋一個小洞,但稍不注意少蓋一個房間就會漏水,房間里的人(用戶)就能感知到(卡),而 fiber 就像在破洞下面放了根水管直接通到屋外,雖然看起來水管彎彎繞繞的,水落地的時間慢了(執(zhí)行時間長了),但房間里的人,就感覺不到漏水了(屋子還是個破屋子)

實在是因為 React 沒辦法在編譯階段優(yōu)化更多了,所以采用這種方式來彌補傷害

React Fiber 是怎么實現(xiàn)的

主要是通過兩個原生的 API 來實現(xiàn)的 requestAnimationFrame 和 requestIdleCallback

顯示器每秒 60 幀我們看著才不會感覺到卡嘛,比如動畫的時候,一幀的時間內(nèi)布局和繪制結(jié)束,還有剩余時間,JS 就會拿到主線程使用權,如果 JS 某個任務執(zhí)行過長,動畫下一幀開始時 JS 還沒有執(zhí)行完,就會導致掉幀,出現(xiàn)卡頓。

所以就通過把 JS 任務分成更小的任務塊,分到每一幀上的方式,一幀時間到先暫停 JS 執(zhí)行,然后下一幀繪制任完成再把主線程交給 JS,在每一幀繪制之前調(diào)用 requestAnimationFrame;在每一幀空間階段,就是一幀動畫任務完成,下一幀還沒到開始時間,這中間還有時間的話就調(diào)用 requetIdleCallback,執(zhí)行它里面的任務

其他方式能實現(xiàn)

函數(shù)式編程嘛,generator 就可以控制函數(shù)的運行過程中斷和恢復,就像這樣:

// 任務列表
const tasks = []
function * run () {
    let task
    while(task = task.shift()) {
        // 如果有高優(yōu)先級的任務
        if (hasHighPriorityTask()) {
            // 中斷
            yield
        }
    }
}
// 中斷后恢復
const iterator = run()
// 這樣就恢復了
iterator.next()

為什么不直接用 generator

這個問題 React 開發(fā)者有在源碼里回答過:

  • 一是因為 React 是迭代的,而使用 generator + yield 的話需要把所有代碼都包裝成這個形式,非常麻煩,工作量很大
  • 二是 generator 內(nèi)部是有狀態(tài)的,比如一個函數(shù)里有用到多個 yield 中斷,就像 await 一樣,有時候后面的會依賴前面的結(jié)果,可當后面的執(zhí)行前,前面的又更新了,后面就無法拿到最新的值,這樣就不可控了

所以就自己實現(xiàn)一個完全可控的

怎么判斷當前是否有高優(yōu)先級的任務

這個據(jù)我所知 JS 好像沒法判斷,而是按幀的時間,如果一幀內(nèi)任務還沒執(zhí)行完,就中斷當前任務,把控制權交給瀏覽器

瀏覽器什么時候才有空呢

每秒60幀算,每幀就是 1000/60 = 16.7ms 差不多,每幀任務執(zhí)行完會調(diào) requetIdleCallback(callback),并且在 callback 中會有一個參數(shù)告訴我們當前幀還有多少時間給我們執(zhí)行任務

那瀏覽器一幀內(nèi)要做哪些事情

比如布局(layout)、繪制(paint)、JS 的執(zhí)行、處理用戶輸入事件、requestAnimation 調(diào)用等,如果在一幀內(nèi)處理完了這些剩余時間就用來執(zhí)行 requetIdleCallback,直到下一幀開始

  • 如果瀏覽器很忙,一幀結(jié)束了還沒執(zhí)行怎么辦

requetIdleCallback(callback, options),還有第二個參數(shù),里面有個 timeout 字段(毫秒),如果超過這個時間還沒有被執(zhí)行的話,那么下一幀就會強制執(zhí)行

  • 就是說超時后一定會被執(zhí)行咯

也不一定,React 里有 5 個優(yōu)先級的等級,高優(yōu)先級的會被優(yōu)先執(zhí)行,低優(yōu)先級的慢慢等下去,等級是這樣的

  • Immediate: 最高優(yōu)先級,會馬上執(zhí)行的不能中斷
  • UserBlocking: 這一般是用戶交互的結(jié)果,需要及時反饋
  • Normal: 普通等級的,比如網(wǎng)絡請求等不需要用戶立即感受到變化的
  • Low: 低優(yōu)先級的,這種任務可以延后,但最后始終是要執(zhí)行的
  • Idle: 最低等級的任務,可以被無限延遲的,比如 console.log()

如果是相同優(yōu)先級的任務,就會按推入任務隊列的順序來執(zhí)行

兼容性怎么樣

requetIdleCallback 兼容性是很差的,React 也是通過 messageChannel 模擬實現(xiàn)的 requetIdleCallback 的功能

除了 MessageChannel 還有沒有其他類似方法

還有一個功能類似的 BroadcastChannel

以上就是React Fiber中面試官最關心的技術話題的詳細內(nèi)容,更多關于React Fiber面試技術的資料請關注腳本之家其它相關文章!

相關文章

  • React如何自定義輪播圖Carousel組件

    React如何自定義輪播圖Carousel組件

    這篇文章主要介紹了React如何自定義輪播圖Carousel組件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Jira 任務管理系統(tǒng)項目總結(jié)講解

    Jira 任務管理系統(tǒng)項目總結(jié)講解

    這篇文章主要為大家介紹了Jira 任務管理系統(tǒng)項目總結(jié)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • React中如何設置自定義滾動條樣式

    React中如何設置自定義滾動條樣式

    這篇文章主要介紹了React中如何設置自定義滾動條樣式問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • React路由封裝的實現(xiàn)淺析

    React路由封裝的實現(xiàn)淺析

    路由是React項目中相當重要的概念,對于功能較為復雜的網(wǎng)頁來說,必然會涉及到不同功能間的頁面跳轉(zhuǎn),本篇文章將對React官方維護的路由庫React-Router-Dom的使用和常用組件進行講解,同時對路由組件傳遞param參數(shù)的方式進行講解,希望對各位讀者有所參考
    2022-08-08
  • React引入css的幾種方式及應用小結(jié)

    React引入css的幾種方式及應用小結(jié)

    這篇文章主要介紹了React引入css的幾種方式及應用小結(jié),操作styled組件的樣式屬性,可在組件標簽上定義屬性、也可以通過attrs定義屬性,本文通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 關于React Native報Cannot initialize a parameter of type''NSArray<id<RCTBridgeModule>>錯誤(解決方案)

    關于React Native報Cannot initialize a parameter of type''NSArra

    這篇文章主要介紹了關于React Native報Cannot initialize a parameter of type'NSArray<id<RCTBridgeModule>>錯誤,本文給大家分享解決方案,需要的朋友可以參考下
    2021-05-05
  • 詳細談談React中setState是一個宏任務還是微任務

    詳細談談React中setState是一個宏任務還是微任務

    學過react的人都知道,setState在react里是一個很重要的方法,使用它可以更新我們數(shù)據(jù)的狀態(tài),下面這篇文章主要給大家介紹了關于React中setState是一個宏任務還是微任務的相關資料,需要的朋友可以參考下
    2021-09-09
  • react-native ListView下拉刷新上拉加載實現(xiàn)代碼

    react-native ListView下拉刷新上拉加載實現(xiàn)代碼

    本篇文章主要介紹了react-native ListView下拉刷新上拉加載實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 詳解升級react-router 4 踩坑指南

    詳解升級react-router 4 踩坑指南

    本篇文章主要介紹了詳解升級react-router 4 踩坑指南,主要是對react-router 4升級的踩坑總結(jié),有興趣的可以了解一下
    2017-08-08
  • React Native 圖片查看組件的方法

    React Native 圖片查看組件的方法

    這篇文章主要介紹了React Native 圖片查看組件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論