第十二節:原理深挖-React Fiber架構核心思想

鏈表結構、時間切片(Time Slicing)
優先級調度實現(如用戶輸入>網絡請求)

React Fiber架構深度解析:從鏈表到優先級調度的革命性升級


一、Fiber架構核心設計思想

React Fiber是React 16+的底層協調算法重構,旨在解決傳統虛擬DOM diff算法(Stack Reconciler)的三大痛點:

  1. 不可中斷的遞歸遍歷:深度優先遍歷導致主線程長時間被占用
  2. 優先級機制缺失:所有更新任務平等競爭執行權
  3. 渲染與瀏覽器繪制沖突:容易導致掉幀卡頓

二、鏈表數據結構實現可中斷遍歷

傳統虛擬DOM樹結構:

// 樹形結構示例
const vdomTree = {type: 'div',children: [{ type: 'h1', children: [...] },{type: 'ul', children: [...]}]
}

Fiber節點鏈表結構:

// Fiber節點核心屬性
const fiberNode = {tag: FunctionComponent, // 組件類型stateNode: ComponentInstance, // 實例return: parentFiber,    // 父節點child: firstChildFiber, // 首個子節點sibling: nextSibling,   // 兄弟節點alternate: currentFiber,// 雙緩存指針effectTag: Placement,   // 副作用標記expirationTime: 5000,  // 過期時間memoizedState: {},     // 狀態存儲// ... 其他屬性
}

鏈表遍歷過程
請添加圖片描述

關鍵優勢
? 通過child/sibling/return指針實現非遞歸遍歷
? 任意節點可保存遍歷進度(類似生成器函數)
? 雙緩存技術(alternate指針)實現無閃爍更新


三、時間切片(Time Slicing)實現原理

執行機制

// 簡化的調度偽代碼
function workLoop(deadline) {while (currentFiber && deadline.timeRemaining() > 1ms) {currentFiber = performUnitOfWork(currentFiber);}if (currentFiber) {requestIdleCallback(workLoop);}
}function performUnitOfWork(fiber) {beginWork(fiber); // 開始處理當前Fiberif (fiber.child) return fiber.child;while (fiber) {completeWork(fiber); // 完成當前Fiberif (fiber.sibling) return fiber.sibling;fiber = fiber.return; // 回溯到父節點}
}

性能對比

操作類型傳統模式(16ms幀周期)Fiber模式(5ms切片)
1000節點更新卡頓明顯(60ms阻塞)平滑更新(分20幀完成)
用戶輸入響應延遲200ms以上50ms內響應
動畫流暢度掉幀率>30%掉幀率<5%

四、優先級調度算法實現

React內部定義6級優先級(數值越小優先級越高):

優先級類型數值范圍典型場景
ImmediatePriority1用戶輸入、動畫
UserBlockingPriority2鼠標懸停提示
NormalPriority3網絡請求結果處理
LowPriority4分析日志上報
IdlePriority5預加載不可見內容

調度過程示例
請添加圖片描述

關鍵實現代碼

// 更新優先級標記
function scheduleUpdate(fiber, expirationTime) {const update = {expirationTime,priorityContext: getCurrentPriority(),// ...};fiber.updateQueue.push(update);requestWork(root, expirationTime);
}// 優先級比較函數
function compareExpirationTimes(a, b) {if (a === b) return 0;return a < b ? -1 : 1; // 數值越小優先級越高
}

五、Fiber架構實戰優化技巧
  1. 避免阻塞主線程
// 錯誤示例:同步計算大數據
const data = computeHugeData(); // 阻塞50ms// 正確方案:切分任務
import { unstable_scheduleCallback } from 'scheduler';
unstable_scheduleCallback(LowPriority, () => {const data = computeHugeData();
});
  1. 優先級搶占處理
// 輸入框即時搜索優化
const [text, setText] = useState('');
const deferredText = useDeferredValue(text); // React 18+ API// 高優先級更新:用戶輸入
<input value={text} onChange={e => setText(e.target.value)} />// 低優先級更新:結果渲染
<SearchResults query={deferredText} />

六、Fiber架構性能數據對比
測試場景React 15(Stack)React 18(Fiber)提升幅度
萬級節點更新1200ms460ms62%
輸入延遲(P99)210ms38ms82%
首屏渲染時間2.4s1.1s54%

通過Fiber架構,React實現了從"同步渲染引擎"到"異步可中斷調度器"的質變。開發者應重點理解:
? 鏈表結構如何實現遍歷中斷
? 時間切片如何利用空閑周期
? 優先級調度如何保證交互響應
掌握這些原理,才能編寫出真正高性能的React應用。

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

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

相關文章

你學會了些什么211201?--http基礎知識

概念 HTTP–Hyper Text Transfer Protocol&#xff0c;超文本傳輸協議&#xff1b;是一種建立在TCP上的無狀態連接&#xff08;短連接&#xff09;。 整個基本的工作流程是&#xff1a;客戶端發送一個HTTP請求&#xff08;Request &#xff09;&#xff0c;這個請求說明了客戶端…

MCU開發學習記錄8 - 基本定時器學習與實踐(HAL庫) - 定時器DMA循環模式修改ARR值、定時器中斷方式修改ARR值 - STM32CubeMX

名詞解釋&#xff1a; TRGO&#xff1a;Trigger Out General Purpose Output ARR&#xff1a;Auto-reload PSC&#xff1a;Prescaler CNT&#xff1a;Counter EGR&#xff1a;event generation register 本文將介紹基本定時器的概念、相關函數以及STM32CubeMX生成定時器的配置…

考研系列-計算機網絡沖刺考點匯總(上)

寫在前面 本文將總結王道408考研課程的計算機網絡沖刺考點的第一章到第三章內容&#xff08;計算機網絡體系結構、物理層、數據鏈路層&#xff09;。【圖片較多&#xff0c;加載需要時間&#xff0c;可以提前打開加載~~】 第一章、計算機網絡體系結構 注意&#xff1a;PCI(頭部…

設計模式每日硬核訓練 Day 14:組合模式(Composite Pattern)完整講解與實戰應用

&#x1f504; 回顧 Day 13&#xff1a;橋接模式小結 在 Day 13 中&#xff0c;我們學習了橋接模式&#xff08;Bridge Pattern&#xff09;&#xff1a; 用于將“抽象”與“實現”分離&#xff0c;適用于雙維度變化場景&#xff08;如圖形類型 渲染方式&#xff09;。它強調…

訊聯桌面TV版apk下載-訊聯桌面安卓電視版免費下載安裝教程

在智能電視的使用過程中&#xff0c;一款好用的桌面應用能極大提升我們的使用體驗。訊聯桌面 TV 版就是這樣一款備受關注的應用&#xff0c;它可以讓安卓電視擁有更個性化、便捷的操作界面。今天&#xff0c;就為大家詳細介紹訊聯桌面 TV 版 apk 的免費下載安裝教程。 一、下載…

Nginx知識點

Nginx發展歷史 Nginx 是由俄羅斯程序員 Igor Sysoev 開發的高性能開源 Web 服務器、反向代理服務器和負載均衡器 &#xff0c;其歷史如下&#xff1a; 起源與早期開發&#xff08;2002 - 2004 年&#xff09; 2002 年&#xff0c;當時 Igor Sysoev 在為俄羅斯門戶網站 Rambl…

uview1.0 tabs組件放到u-popup中在微信小程序中滑塊樣式錯亂

解決思路 重新計算布局信息&#xff1a;在彈窗顯示后重新調用 init 方法來計算組件的布局信息。使用 nextTick&#xff1a;保證在視圖更新之后再進行布局信息的計算。 <u-tabs ref"tabsRef" ></u-tabs> makeClick(){this.makeShowtruethis.$nextTick…

騰訊一面-軟件開發實習-PC客戶端開發方向

1.自我介紹就不多贅述了 2. 請介紹一下你的項目經歷 - 介紹了專輯鑒賞項目&#xff0c;前端使用html語言編寫&#xff0c;后端基于http協議使用C語言進行網頁開發。此外&#xff0c;還提及項目中涉及處理多線程問題以及做過內存池管理項目。 3. 項目中HTTP協議是使用庫實現的…

[數據可視化] Datagear使用心得:從數據整備到可視化聯動實踐

Datagear 是一款功能強大的數據可視化與報表工具&#xff0c;在日常數據分析與展示過程中&#xff0c;能有效幫助用戶構建交互式報表與面板。本文結合實際使用場景&#xff0c;總結了在 Datagear 平臺上關于元數據整備、Board 面板設計、圖表嵌入等方面的使用經驗&#xff0c;供…

【音視頻】MP4解封裝

一、概述 實現了讀取mp4文件&#xff0c;提取出h264和aac文件&#xff0c;可以直接播放 二、實現過程 準備文件 在build路徑下添加mp4文件 同時&#xff0c;添加main函數參數&#xff0c;表示輸入文件和輸出文件 打開文件 打開輸入文件&#xff0c;初始化格式上下文 char…

idea2024.1雙擊快捷方式打不開

idea2024.1突然雙擊快捷方式打不開&#xff0c;使用管理員運行也打不開 在安裝的idea路徑下的bin目錄下雙擊打開idea.bat文件&#xff0c;要是打不開使用txt格式打開&#xff0c;打開后在最后一行加上pause&#xff0c;之后保存。 看看報錯信息是不是有一個initializedExcept…

【錯誤記錄】Windows 命令行程序循環暫停問題分析 ( 設置 “ 命令記錄 “ 選項 | 啟用 “ 丟棄舊的副本 “ 選項 | 將日志重定向到文件 )

文章目錄 一、報錯信息二、問題分析1、Windows 命令行的緩沖區機制2、命令記錄設置 三、解決方案1、設置 " 命令記錄 " 選項2、將日志重定向到文件 一、報錯信息 Java 程序中 , 設置 無限循環 , 每次循環 休眠 10 秒后 , 再執行程序邏輯 , 在命令行中打印日志信息 ; …

STM32H5開發陀螺儀LSM6DSV16X(1)----輪詢獲取陀螺儀數據

STM32H5開發陀螺儀LSM6DSV16X.1--輪詢獲取陀螺儀數據 概述視頻教學樣品申請源碼下載硬件準備參考程序通信模式管腳定義IIC通信模式速率新建工程工程模板保存工程路徑芯片配置工程模板選擇時鐘設置UART配置UART屬性配置設置e2studio堆棧e2studio的重定向printf設置R_SCI_UART_Op…

Android端使用無障礙服務實現遠程、自動刷短視頻

最近在做一個基于無障礙自動刷短視頻的APP&#xff0c;需要支持用任意藍牙遙控器遠程控制&#xff0c; 把無障礙服務流程大致研究了一下&#xff0c;從下面3個部分做一下小結。 1、需要可調整自動上滑距離和速度以適配不同的屏幕和應用 智能適配99%機型&#xff0c;滑動參數可…

Spark和Hadoop的區別和聯系

Hadoop 和 Spark 的區別 1. 架構 Hadoop&#xff1a;基于 HDFS&#xff08;分布式文件系統&#xff09;和 MapReduce&#xff08;分布式計算框架&#xff09;。HDFS 負責數據的分布式存儲&#xff0c;而 MapReduce 是其主要的計算框架&#xff0c;通過 Map 和 Reduce 任務進行…

【版本控制】idea中使用git

大家好&#xff0c;我是jstart千語。接下來繼續對git的內容進行講解。也是在開發中最常使用&#xff0c;最重要的部分&#xff0c;在idea中操作git。目錄在右側哦。 如果需要git命令的詳解&#xff1a; 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先關閉項目&#xf…

論文閱讀:2023 arxiv A Survey of Reinforcement Learning from Human Feedback

A Survey of Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2312.14925 https://www.doubao.com/chat/3506943124865538 速覽 這篇論文是關于“從人類反饋中進行強化學習&#xff08;RLHF&#xff09;”的綜述&#xff0c;核心是講如何讓AI通過人類反…

單片機 + 圖像處理芯片 + TFT彩屏 進度條控件

進度條控件使用說明 概述 本進度條控件基于單片機 RA8889/RA6809 TFT開發&#xff0c;提供了簡單易用的進度顯示功能。控件支持多個進度條同時顯示、自定義顏色、邊框和標簽等特性&#xff0c;適用于需要直觀顯示進度信息的各類應用場景。 特性 支持多個進度條同時顯示可…

數據處理: OPTICS聚類及Python實現

1. 基本原理 OPTICS&#xff08;Ordering Points To Identify the Clustering Structure&#xff09;是一種基于密度的聚類算法&#xff0c;可視為DBSCAN的改進版本。它能夠識別不同密度的簇&#xff0c;并自動發現數據中的層次化聚類結構&#xff0c;適用于復雜分布的數據集…

PyCharm 在 Linux 上的完整安裝與使用指南

PyCharm 在 Linux 上的完整安裝與使用指南—目錄 一、PyCharm 簡介二、下載與安裝1. 下載 PyCharm2. 安裝前的依賴準備3. 安裝步驟方法 1&#xff1a;通過 Snap 安裝&#xff08;推薦&#xff09;方法 2&#xff1a;手動安裝&#xff08;從官網下載 .tar.gz 文件&#xff09;方…