React Filber及核心原理

1. React Fiber 的核心目標?

  • ?增量渲染?:將大型更新拆解為可中斷的小任務(時間切片),避免阻塞

  • 主線程?優先級調度?:動態管理任務執行順序(如用戶交互 > 動畫 > 數據加載)。

  • 與瀏覽器協作?:利用瀏覽器渲染周期(rAF)和空閑時間(rIC理念)優化性能。

一句話定義:

React Fiber是React 16+的核心重寫算法,通過增量渲染和任務分片實現高性能異步更新。旨在解決傳統同步渲染阻塞主線程導致的卡頓問題。

2. React Fiber 的核心原理

之前的版本中,React使用遞歸的方式處理組件樹的更新,這個過程是同步的,一旦開始就不能中斷,可能導致長時間占用主線程,造成界面卡頓,尤其是在處理復雜組件時。

Fiber是將組件樹拆解為?鏈表結構?Fiber 節點(每個節點對應一個可中斷/恢復的“工作單元”),通過?優先級調度?(如用戶交互任務優先)和?時間切片?(利用瀏覽器空閑時間分批次處理任務),實現異步可中斷的渲染流程。

Fiber 在協調階段(Render Phase)增量構建虛擬樹并標記副作用(如 DOM 更新),在提交階段(Commit Phase)同步執行所有變更,同時通過?雙緩沖機制?(交替使用 current 和 workInProgress 樹)和?副作用鏈表?優化性能,從而支持并發模式(Concurrent Mode),顯著提升復雜應用的響應速度與流暢度。

在 React 的 Fiber 架構中,requestAnimationFrame、?鏈表? 和 ?調度器?三者緊密結合,主要體現在 ?任務調度策略? 和 ?執行效率優化?

2.1. Filber中的鏈表(任務存儲與遍歷?)

Fiber 樹本身的鏈表結構?和?副作用鏈表(effect list)?是?兩個不同的鏈表

2.1.1. Fiber 樹鏈表(主鏈表)?

作用?:

表示組件樹完整結構,用于協調階段(reconciliation)遍歷任務分片

數據結構?:

每個 Fiber 節點通過 child、sibling、return 三個指針構成?樹形鏈表?(深度優先遍歷的線性化結構)。

class FiberNode {child: Fiber | null;    // 第一個子節點sibling: Fiber | null;  // 下一個兄弟節點return: Fiber | null;   // 父節點// ... 其他屬性(type, stateNode 等)
}

特點?:

用于遞歸的?可中斷恢復?(通過保存當前處理的 Fiber 節點指針)。
是 React 處理組件更新的?核心數據結構?。

?與調度器的關系?
每個鏈表節點(FiberNode)包含任務信息優先級標記指針(child/sibling/return)
調度器通過鏈表實現?可中斷恢復?:保存當前節點指針,下次從中斷處繼續

2.1.2. 副作用鏈表(effect list)?

作用?:

收集所有需要執行副作用的 Fiber 節點(如 DOM 操作、生命周期調用),在提交階段(commit phase)批量處理。

?數據結構?:

通過 firstEffect、lastEffect、nextEffect 指針構成的?單向鏈表?。

class FiberNode {firstEffect: Fiber | null; // 鏈表頭lastEffect: Fiber | null;  // 鏈表尾nextEffect: Fiber | null;  // 下一個副作用節點effectTag: Placement | Update | Deletion; // 副作用類型
}

?特點?:

Fiber 樹的?子集?,僅包含需要處理的節點。
協調階段動態構建,提交階段直接遍歷此鏈表執行 DOM 操作

副作用鏈表(effect list)的工作流程?

每個Fiber節點在完成工作后,如果有副作用,會被添加到鏈表中。firstEffect和lastEffect用來指向鏈表的頭和尾,nextEffect是每個節點的指針。在提交階段,React遍歷這個鏈表,依次處理每個副作用,如DOM更新生命周期方法的調用等。這種結構使得React能夠高效地批量處理副作用,而不必在協調階段頻繁操作DOM,從而提高性能。

React Fiber 架構中任務調度與副作用處理的優先級機制:
于優先級,副作用鏈表可能并不直接管理優先級,而是由調度器決定哪些Fiber節點需要先處理。高優先級的更新會導致重新構建副作用鏈表,確保緊急的副作用先執行。例如,用戶輸入觸發的更新可能打斷正在進行的渲染,優先處理相關副作用,然后再處理低優先級的任務。

  • ?中斷與恢復?:高優先級任務可中斷當前協調過程,保留未完成的副作用鏈表,后續恢復時繼續構建。
  • 多優先級鏈表?:React 內部維護多個鏈表(如 pendingPassiveEffects),區分同步與異步(如 useEffect)副作用。
    •   ?同步副作用?:useLayoutEffect 在提交階段同步執行。
      
    •   ?異步副作用?:useEffect 被推入異步隊列,在瀏覽器空閑時處理。
      

在構建鏈表時,React可能采用深度優先的后序遍歷方式確保子節點的副作用在父節點之前處理,這樣在DOM操作時可以正確應用變更。例如,當子節點需要被刪除時,先處理子節點的刪除,再處理父節點的更新,避免父節點更新后子節點不存在導致的錯誤。

最后,需要理解副作用鏈表在React整個渲染流程中的位置。協調階段(render phase)負責找出所有需要變更的節點構建副作用鏈表,提交階段(commit phase)遍歷鏈表執行變更。這種分離使得React可以異步處理渲染,提高響應能力。

2.1.3. 為什么分開設計??

1?.關注點分離?

Fiber 樹負責?任務調度和中斷恢復?(協調階段)。
副作用鏈表負責?高效執行 DOM 操作?(提交階段)。

?2.性能優化?:

提交階段只需遍歷少量副作用節點,避免全樹遍歷。
批量處理 DOM 更新,減少瀏覽器重排/重繪。

?總結?:
?不是同一個鏈表?,但副作用鏈表是 Fiber 樹的衍生結構
Fiber 樹是?全局任務管理?的骨架,副作用鏈表是?局部優化?的結果。
兩者協作實現 React 的?可中斷渲染?和?高效更新?

在這里插入圖片描述

2.2?. requestAnimationFrame(rAF)?:調度時機控制?

?requestAnimationFrame(rAF)? 是瀏覽器提供的原生 API,用于在下一次屏幕刷新(通常是每秒 60 次,即 16.6ms/幀)前執行回調函數。

?作用?

在每一幀渲染前執行高優先級任務(如動畫、UI 更新)

?與調度器的關系?:

React 調度器用 rAF 作為?高優先級任務觸發時機?,確保視覺更新及時
避免 setTimeout 因時間不精確導致的丟幀問題

核心目標:

  • 動畫與視覺更新?:

rAF 確保回調函數在瀏覽器?下一幀渲染前執行?,與屏幕刷新率(60Hz)同步,避免丟幀。

  • React 中的應用?:

高優先級任務對齊?:React 將動畫、布局更新等高優先級任務標記為與 rAF 同步執行。

?避免布局抖動?:在 rAF 回調中批量處理 DOM 讀寫,減少強制布局計算(如 offsetWidth)。

特性requestAnimationFramerequestIdleCallback
?觸發時機?每幀開始前(16.7ms/60FPS)瀏覽器空閑時(無高優先級任務)
?用途?動畫、視覺更新后臺任務(日志、預加載)
?優先級?高(與渲染強相關)低(可被高優先級任務打斷)
?React調度參考?影響高優先級任務分片啟發低優先級任務分片(如并發渲染)
?執行耗時限制?需控制在3-4ms以內默認50ms(通過timeout參數可調)
?兼容性?IE10+需polyfill(如React的scheduler

2.3. React 自研調度器(Scheduler)

是其并發模式(Concurrent Mode)的核心底層機制,相比傳統更新調度方式具有以下顯著優勢:

2.3.1.優先級調度?

? 更精細的任務優先級控制?

  • 5級優先級劃分?:
    Immediate(同步) > UserBlocking(用戶交互) > Normal(默認) > Low(數據加載) > Idle(空閑任務)

協作流程示例?

  • ?用戶點擊按鈕?(Immediate 優先級):
    同步執行回調,更新狀態,標記相關 Fiber 節點。
  • ?觸發動畫?or搜索建議(UserBlocking 優先級):
    將更新任務放入 rAF 隊列,確保下一幀渲染前完成。
  • ?數據加載?(Low 優先級):
    拆分任務為 5ms 的塊,在調度器檢測到空閑時逐步執行。
  • 動態調整?:高優先級任務可中斷低優先級任務(如渲染中途響應用戶點擊)。
2.3.2.避免瀏覽器主線程阻塞
1.時間切片(Time Slicing)的概念

時間切片邏輯?:將任務拆分5ms 的塊,動態檢查剩余時間,通過shouldYield()判斷是否讓出主線程,保證UI響應。優先處理用戶輸入高優先級事件。

用于將渲染任務分解成更小的單元,這樣可以在瀏覽器的空閑時段執行這些任務,避免阻塞用戶交互。這聽起來類似于瀏覽器的requestIdleCallback API,允許在空閑時間執行任務,但React可能自己實現了更精細的控制。

requestIdleCallback(rIC)的理念?

空閑時段處理低優先級任務?:rIC 在瀏覽器空閑時執行非緊急任務(如日志、預加載),避免干擾關鍵渲染和交互。

2.?基于MessageChannel的調度?:

React 自研調度器,通過 MessageChannelsetTimeout ?模擬空閑檢測?
MessageChannel相比setTimeout,利用事件循環的宏任務機制更精準控制執行時機,避免任務堆積導致卡頓。

React Fiber 未直接使用 rIC?:這是因為rIC的瀏覽器兼容性觸發頻率不夠理想。React的調度器會將任務分成小的時間片,并在每個時間片結束時檢查是否有更高優先級的任務需要處理,從而避免長時間阻塞主線程。

2.3.3. 更智能的后臺任務處理?

?空閑期利用?:
通過requestIdleCallback的polyfill(兼容方案),在瀏覽器空閑時執行低優先級任務(如日志上報、預渲染)。

?任務饑餓保護?:
防止低優先級任務因長期無法執行被“餓死”(超過超時時間會強制提升優先級)。

2.3.4. 與React深度集成?

? 協調器(Reconciler)聯動?:

調度器知曉Fiber節點結構,可精準暫停/恢復渲染任務,實現可中斷渲染。

?并發特性基礎?:

支持startTransition、useDeferredValue等API的底層依賴。

對比傳統調度方案?

能力傳統setState更新React調度器
任務中斷? 不可中斷? 高優任務可中斷低優任務
瀏覽器阻塞可能阻塞主線程通過時間切片避免阻塞
優先級控制無差別處理5級動態優先級
后臺任務利用依賴手動實現內置空閑期調度

2.4 雙緩沖機制

2.4.1. 雙緩沖的定義

Fiber 架構的核心機制?,用于在 ?協調階段(Reconciliation)? 和 ?提交階段(Commit)? 之間高效管理組件狀態更新,確保 React 的 ?可中斷渲染? 和 ?一致性更新?

雙緩沖是計算機圖形學中的經典技術,指 ?同時維護兩套數據結構?:

  • 當前緩沖(Current)?:正在渲染或已渲染的 UI 狀態(對應屏幕上顯示的內容)。
  • 工作緩沖(WorkInProgress,WIP)?:正在計算的新狀態(尚未提交到屏幕)。

React 借用這一概念,在 Fiber 架構中維護 ?兩棵 Fiber 樹?:

  • ?current 樹?:當前已渲染的 Fiber 樹(對應真實 DOM)。
  • ?workInProgress 樹?:正在構建的新 Fiber 樹(用于計算更新)。
2.4.2. 雙緩沖的核心流程?

?(1) 協調階段(Reconciliation)?

  • React 從 current 樹克隆出 workInProgress 樹(通過 alternate 指針關聯)。
  • workInProgress 樹上進行 ?Diff 計算?標記需要更新的節點(effectTag)。
  • 如果任務被中斷(如高優先級任務插入),可以丟棄 workInProgress 樹并重新開始,而不會影響 current 樹(已渲染的 UI)。

?(2) 提交階段(Commit)?
當 workInProgress 樹構建完成,React 執行 ?原子性切換?:

root.current = finishedWork; // 切換 current 和 workInProgress

此時:

  • 新的 workInProgress 樹變為 current 樹(對應最新 UI)。
  • 舊的 current 樹變為新的 workInProgress 樹(供下次更新使用)。

通過維護兩棵 Fiber 樹(currentworkInProgress),實現:

  • 計算與渲染分離。
  • 高優先級任務搶占。
  • 無閃爍的 UI 更新。

最終提升復雜應用的流暢度和響應速度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93715.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93715.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shader開發(五)什么是渲染管線

在計算機圖形學中,渲染管線(Rendering Pipeline) 是圖形處理器(GPU)將3D網格數據轉化為屏幕圖像的核心流程。無論是炫酷的游戲畫面還是逼真的動畫場景,這一切都離不開渲染管線的默默工作。對于想要學習著色…

CentOS7 使用Docker安裝MinIO完整教程

目錄 1. MinIO簡介 什么是MinIO? 為什么選擇Docker安裝? 2. 環境準備 檢查Docker狀態 檢查防火墻設置 創建存儲目錄 3. 快速啟動MinIO 基礎啟動命令 驗證啟動狀態 4. 配置持久化存儲 停止并刪除臨時容器 使用數據卷啟動MinIO 驗證數據持久化 5. 訪問MinIO控制臺…

【數據庫】時序數據庫選型指南:從大數據視角看IoTDB的核心優勢

文章目錄前言-官網鏈接一、時序數據管理的時代挑戰二、時序數據庫選型的六大核心維度1. 數據模型設計2. 寫入與查詢性能3. 存儲效率4. 系統擴展性5. 生態兼容性6. 運維復雜度三、IoTDB的技術架構解析1. 存儲引擎創新2. 計算引擎優勢3. 分布式架構設計四、行業解決方案對比1. 能…

【25-cv-08364】Keith攜Hello Angel版權圖發案

Hello Angel版權圖案件號:25-cv-08364起訴時間:2025/7/22原告:Angelea Clark Van Dam原告律所:Keith受理法院:伊利諾伊州北區地方法院原告介紹原告是是一位來自澳大利亞的藝術家,筆名為Hello Angel&#xf…

SkSurface---像素的容器:表面

如果說 SkCanvas 是畫布,是所有繪圖操作的提供者的話,那么 SkSurface 就是畫布的容器,我們稱之為表面,它負責管理畫布對應的像素數據。這些像素數據可以是在內存中創建的,也可以是在 GPU 顯存中創建的。創建一個空白表…

26.(vue3.x+vite)以pinia為中心的開發模板

效果截圖 代碼實現 HelloWorld.vue <template><div style="padding: 20px;">介紹:<br>1:使用class 來減少pinia(store)的代碼量<br>

華為AI Agent智能園藝助手開發案例

一、引言與行業背景 在數字化與智能化日益滲透我們生活的今天&#xff0c;園藝這一傳統而充滿生機的領域&#xff0c;也迎來了智能化的革新。華為AI Agent智能園藝助手通過融合人工智能與園藝專業知識&#xff0c;為用戶提供一站式、個性化的園藝養護解決方案&#xff0c;徹底改…

Linux Flathub軟件管理方法 使用指南

Flathub 使用指南&#xff1a;軟件安裝、管理及常用軟件推薦 一. 什么是 Flathub&#xff1f; Flathub 是 Flatpak 應用程序的主要分發中心&#xff0c;類似于 Linux 上的"應用商店"。它提供了一種跨發行版的軟件打包和分發方式&#xff0c;讓用戶可以在任何 Linux 發…

GitLab 18.2 發布幾十項與 DevSecOps 有關的功能,可升級體驗【二】

沿襲我們的月度發布傳統&#xff0c;極狐GitLab 發布了 18.2 版本&#xff0c;該版本帶來了議題和任務的自定義工作流狀態、新的合并請求主頁、新的群組概覽合規儀表盤、下載安全報告的 PDF 導出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等幾十個重點功能的改進…

??免費語音轉換服務(TTS)全面指南

????1. TTS技術概述?? TTS&#xff08;Text-to-Speech&#xff09;通過AI將文字轉化為自然語音&#xff0c;核心技術包括??深度神經網絡&#xff08;DNN&#xff09;??、??語音韻律建模??和??聲學合成??。其核心優勢在于&#xff1a; ??多語言支持??&a…

正則化都是放在模型的哪個位置呢?

? 什么是“正則化”&#xff1f;在神經網絡中&#xff0c;正則化&#xff08;Regularization&#xff09; 抑制過擬合的技巧 目的是讓模型在訓練集和測試集上都表現得好&#xff08;泛化能力強&#xff09;。&#x1f9e0; 常見的正則化手段包括&#xff1a;方法類型通常放在哪…

Python畢業設計 | 基于協同過濾的智能商品推薦與數據大屏系統(Vue+Flask+Scikit-learn,附源碼+文檔)

個人介紹&#x1f3af; 畢業設計私人教練 專注計算機畢設輔導第 6 年&#xff0c;累計 1v1 帶飛 800 同學順利通關。從選題、開題、代碼、論文到答辯&#xff0c;一條龍陪跑&#xff1b;擅長把導師的 “模糊要求” 變成能落地的技術方案。白天寫方案&#xff0c;晚上改論文&…

基于千問2.5-VL-7B訓練識別人的表情

一、安裝LLaMA-Factory 我們使用LLaMA-Factory來進行微調&#xff0c;安裝LLaMA-Factory來參考文章&#xff1a; 大模型微調工具LLaMA-Factory的安裝流程-CSDN博客 二、下載千問2.5-VL-7B模型 我們使用千問2.5-VL-7B多模態模型來進行微調 通義千問2.5-VL-7B-Instruct 下載…

Android屏幕適配:從dp到px的轉換與今日頭條適配方案詳解

前言 在Android開發中&#xff0c;屏幕適配一直是一個重要且復雜的話題。不同設備有著不同的屏幕尺寸、分辨率和像素密度&#xff0c;如何讓應用在各種設備上都能良好顯示&#xff0c;是每個開發者都需要面對的問題。本文將深入探討Android系統中dp到px的轉換原理&#xff0c;并…

nvim 縮進4空格

要把 Neovim 配置為縮進 4 空格&#xff0c;并適用于所有語言&#xff08;或某些語言如 C/C&#xff09;&#xff0c;你只需要設置這三個核心選項即可&#xff1a;? 通用方式&#xff1a;在 init.lua 或 options.lua 中添加 vim.opt.tabstop 4 -- 一個 <Tab> 等…

pdw估計edw怎么估計

問題一、pdw估計edw怎么估計PDW&#xff08;Pulse Descriptor Word&#xff09;數據是雷達接收到的每一個脈沖的瞬時特征數據&#xff0c;EDW&#xff08;Emitter Descriptor Word&#xff09;是對某一輻射源&#xff08;發射機&#xff09;整體特性的估計。PDW 是每一個脈沖的…

TS語法最佳實踐

switch 的 case不能使用條件表達式JavaScript 允許在 switch 的 case 中使用條件表達式&#xff0c;但這種用法實際上是無效的&#xff0c;因為 case 的值會被隱式地轉換為布爾值。TypeScript 明確禁止這種用法&#xff0c;以避免隱式類型轉換導致的邏輯錯誤。建議使用 if-else…

行業熱點丨仿真歷史數據難以使用?如何利用幾何深度學習破局,加速汽車工程創新

01、AI 驅動研發升級&#xff1a;幾何深度學習創造行業新價值人工智能正加速推動各行業研發能力升級。麥肯錫最新報告顯示&#xff0c;該技術在制藥、化工和航空航天等領域的應用&#xff0c;有望為相關企業創造高達5600億美元的經濟價值。 AI 技術應用的先行者&#xff0c;全球…

JSBridge原理與實現全解析

JSBridge 是用于連接 JavaScript&#xff08;H5&#xff09; 和原生應用&#xff08;iOS/Android&#xff09;的橋梁&#xff0c;允許它們之間相互調用方法。 &#x1f309; 一、JSBridge 雙向通信流程圖 #mermaid-svg-AoDVdJL2VJBnTJ2Q {font-family:"trebuchet ms"…

Mockito:Java單元測試Mock框架

文章目錄一、寫在前面1、簡介2、依賴二、使用1、基本使用2、注解&#xff08;1&#xff09;開啟注解&#xff08;2&#xff09;Mock 注解&#xff08;3&#xff09;DoNotMock 注解&#xff08;4&#xff09;Spy 注解&#xff08;5&#xff09;Captor 注解&#xff08;6&#xf…