學習篇之React Fiber概念及原理

什么是React Fibber?

React Fiber 是 React 框架的一種底層架構,為了改進 React 的渲染引擎,使其更加高效、靈活和可擴展。

傳統上,React 使用一種稱為堆棧調和遞歸算法來處理虛擬 DOM 的更新,這種方法在大型應用或者頻繁更新的情況下可能會產生性能問題。React Fiber 則是基于一種增量渲染的思想,它將更新任務分解成小的、可中斷的單元,使得 React 在更新時可以更靈活地控制和切換任務,提高應用的響應性。

React Fiber 的核心特點包括:

  1. 增量渲染: React Fiber 將更新任務拆分成多個小任務單元(稱為 “fiber”),并使用優先級調度器來處理這些任務,以提高響應性和用戶體驗。

  2. 優先級調度: Fiber 引入了優先級概念,使 React 能夠根據任務的優先級來決定任務的執行順序,確保高優先級任務得到及時處理。

  3. 中斷與恢復: React Fiber 允許在渲染過程中中斷任務,然后在適當的時機恢復執行,從而避免了阻塞的情況。

  4. 任務取消: Fiber 具備任務取消的能力,可以取消不必要的更新,提高性能。

React Fiber 架構的引入使得 React 更適用于構建大型、復雜的應用,同時也為引入一些新的功能(如異步渲染、懶加載等)提供了基礎。需要注意的是,從用戶角度看,React Fiber 并不會引入顯著的變化,它是在底層實現上進行的優化,但這些優化在一些場景下可能會顯著地提升應用的性能。
在代碼中fiber其實fiber就是一個類似雙向鏈表的數據結構。如下圖:
在這里插入圖片描述

FiberNode

在 React Fiber 架構中,“FiberNode”(也稱為 “Fiber”)是一個重要的概念,它代表了 React 中虛擬 DOM 樹中的一個節點。FiberNode 是一個 JavaScript 對象,用于描述組件、元素或者其他 DOM 節點在虛擬 DOM 樹中的信息。

每個 FiberNode 包含了組件的狀態、屬性、樣式等信息,以及與其他節點的關系和更新狀態。在 React Fiber 中,FiberNode 是實現增量渲染和協調的關鍵數據結構。通過 FiberNode,React 可以追蹤組件樹的變化、處理更新以及優先級調度等操作。
,它包含了節點的類型、屬性、關系和狀態等信息,是實現增量渲染和協調的關鍵。

FiberNode 的一些重要屬性和信息包括:

  • type: 表示節點的類型,可以是函數組件、類組件、原生 DOM 元素等。
  • key 和 props: 節點的唯一標識符和屬性,用于對比不同渲染周期的節點。
  • alternate: 用于雙緩存技術,表示與當前 FiberNode 相對應的上一次渲染的 FiberNode。
  • child、sibling 和 return: 用于表示節點的子節點、兄弟節點和父節點的關系。
  • effectTag 和 effect: 表示節點的操作類型(插入、更新、刪除等)和需要執行的副作用。
  • stateNode: 與節點對應的實際 DOM 元素、組件實例等。

通過這些屬性,React Fiber 可以構建一棵虛擬 DOM 樹,并在渲染過程中對其進行協調、更新和處理。FiberNode 的設計使得 React 能夠實現增量渲染和中斷恢復等特性,從而提高應用的性能和響應性。

舉個例子來理解理解:

function App() {return (<div><h1>Hello, world!</h1><p>This is a simple example.</p></div>);
}

在 React Fiber 中,每個組件、元素和 DOM 節點都對應一個 FiberNode。以下是對應上述組件的 FiberNode 結構的簡化示意:

// 節點類型、標簽和屬性
const appFiber = {type: "div",key: null,props: {children: [{ type: "h1", key: null, props: { children: "Hello, world!" }, ... },{ type: "p", key: null, props: { children: "This is a simple example." }, ... }]},stateNode: null, // 與實際 DOM 節點關聯child: h1Fiber, // 子節點 Fibersibling: null, // 兄弟節點 Fiberreturn: null, // 父節點 FibereffectTag: null, // 用于表示更新操作類型effect: null, // 用于存儲副作用操作,如 DOM 更新alternate: null // 對應上一次渲染的 FiberNode
};const h1Fiber = {type: "h1",key: null,props: { children: "Hello, world!" },stateNode: null, // 與實際 DOM 節點關聯child: null,sibling: pFiber,return: appFiber,effectTag: null,effect: null,alternate: null
};const pFiber = {type: "p",key: null,props: { children: "This is a simple example." },stateNode: null, // 與實際 DOM 節點關聯child: null,sibling: null,return: appFiber,effectTag: null,effect: null,alternate: null
};

在這個示例中,appFiber 代表 <div> 組件的 FiberNode,h1FiberpFiber 分別代表 <h1><p> 元素的 FiberNode。每個 FiberNode 包含了類型、屬性、關系、狀態等信息,這些信息用于構建虛擬 DOM 樹并協調更新。

通過 childsiblingreturn 屬性,FiberNodes 之間建立了層次關系。通過 effectTageffect 屬性,React Fiber 可以追蹤更新操作和副作用操作。

為什么不用 generator 或 async/await?

在 React Fiber 架構中,為什么不使用 Generator 或 async/await 這些異步編程的特性主要涉及到性能和控制的問題。以下是一些原因:

  1. 細粒度控制: React Fiber 需要在渲染過程中對任務執行順序進行細粒度的控制,以實現優先級調度、中斷恢復等特性。使用 Generator 或 async/await 等語言特性,無法提供足夠細致的控制,難以實現這種精細的任務管理。

  2. 異步中斷與恢復: React Fiber 需要能夠在渲染過程中中斷任務,并在適當的時候恢復。Generator 和 async/await 難以在任務中途中斷,并在稍后恢復。而 Fiber 架構通過分割任務成可中斷的小單元,實現了中斷與恢復的能力。

  3. 性能和內存消耗: Generator 和 async/await 通常會引入更多的異步調度開銷,可能導致額外的性能損失和內存消耗。React Fiber 為了提高性能,需要更高效地管理任務的執行順序,從而減少不必要的開銷。

  4. 更細致的優化: React Fiber 通過任務的優先級調度,可以更好地處理高優先級任務,使得用戶操作的響應更迅速。這種優化在異步 Generator 或 async/await 中可能難以實現。

雖然 Generator 和 async/await 是在處理異步邏輯時非常有用的工具,但在 React Fiber 這種需要精細控制任務調度、中斷和恢復的情況下,它們的限制可能會導致無法實現所需的功能。因此,React Fiber 架構選擇了自己的方式來管理任務和優先級,以實現更高效、更精確的渲染和協調。

總結

今天分享的是才學習到的知識點,React框架東西很多,仍在那里探索中,爭取每天進步一點點。

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

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

相關文章

最強自動化測試框架Playwright(7)- 使用cookie避免重復登錄

playwright在稱為瀏覽器上下文的隔離環境中執行測試。這種隔離模型提高了可重復性&#xff0c;并防止了級聯測試失敗。測試可以加載現有的經過身份驗證的狀態。這消除了在每次測試中進行身份驗證的需要&#xff0c;并加快了測試執行速度。 每次測試前登錄 以下示例登錄到 Git…

談談什么是云計算?以及它的應用

作者&#xff1a;Insist-- 個人主頁&#xff1a;insist--個人主頁 作者會持續更新網絡知識和python基礎知識&#xff0c;期待你的關注 目錄 ?編輯 一、什么是云計算 二、云計算的優勢與劣勢&#xff1f; 1、云計算的優勢 ①提高資源利用率 ②提升效率 ③降低成本 2、云…

python編程基礎與案例集錦,python編程入門經典

大家好&#xff0c;本文將圍繞python編程基礎與案例集錦展開說明&#xff0c;python編程入門與案例詳解是一個很多人都想弄明白的事情&#xff0c;想搞清楚python入門程序例子需要先了解以下幾個事情。 【程序1】 題目&#xff1a;輸入一行字符&#xff0c;分別統計出其中英文字…

『CV學習筆記』Opencv和PIL Image以及base64編碼互相轉化

Opencv和PIL Image以及base64編碼互相轉化 文章目錄 一. opencv&PIL.Image&Skimage1.1. opencv-python讀取透明圖片(帶alpha通道)1.2. opencv、PIL.Image、Skimage讀取的彩色圖片維度區別1.3. opencv、PIL.Image轉換二. base64和cv2 imge互相轉換三. base64和PIL imge互…

射頻入門知識-混頻器-1

5.4混頻電路-視頻_嗶哩嗶哩_bilibili ???????

【算法題】螺旋矩陣II (求解n階Z形矩陣)

一、問題的提出 n階Z形矩陣的特點是按照之(Z)字形的方式排列元素。n階Z形矩陣是指矩陣的大小為nn&#xff0c;其中n為正整數。 題目描述 一個 n 行 n 列的螺旋(Z形)矩陣如圖1所示&#xff0c;觀察并找出填數規律。 圖1 7行7列和8行8列的螺旋(Z形)矩陣 現在給出矩陣大小 n&…

數據結構入門:棧

目錄 前言 1. 棧 1.1棧的概念及結構 1.2 棧的實現 1.2.1 棧的定義 1.2.2 棧的初始化 1.2.3 入棧 1.2.4 出棧 1.2.5 棧的元素個數 1.2.6 棧頂數據 1.2.7 棧的判空 2.棧的應用 2.1 題目一&#xff1a;括號匹配 2.1.1 思路 2.1.2 分析 2.1.3 題解 總結 前言 無論你是計算機科學專…

CVE漏洞復現-CVE-2021-22555 Linux Netfilter 權限提升漏洞

CVE-2021-22555 Linux Netfilter 權限提升漏洞 漏洞描述 近日&#xff0c;互聯網公開了Linux Netfilter權限提升漏洞的POC及EXP&#xff0c;相關CVE編號&#xff1a;CVE-2021-22555。該漏洞在kCTF中被用于攻擊kubernetes pod容器實現虛擬化逃逸&#xff0c;該漏洞已在Linux內…

用chatGPT從左右眼圖片生成點云數據

左右眼圖片 需求 需要將左右眼圖像利用視差生成三維點云數據 先問問chatGPT相關知識 進一步問有沒有現成的軟件 chatGPT提到了OpenCV&#xff0c;我們讓chatGPT用OpenCV寫一個程序來做這個事情 當然&#xff0c;代碼里面會有一些錯誤&#xff0c;chatGPT寫的代碼并不會做模…

Arduino驅動MQ2模擬煙霧傳感器(氣體傳感器篇)

目錄 1、傳感器特性 2、硬件原理圖 3、控制器和傳感器連線圖 4、驅動程序 MQ2氣體傳感器,可以很靈敏的檢測到空氣中的煙霧、液化氣、丁烷、丙烷、甲烷、酒精、氫氣等氣體,與Arduino結合使用,可以制作火災煙霧報警、液化氣、丁烷、丙烷、甲烷、酒精、氫氣氣體泄露報警等相…

面試題. 字符串壓縮

字符串壓縮。利用字符重復出現的次數&#xff0c;編寫一種方法&#xff0c;實現基本的字符串壓縮功能。比如&#xff0c;字符串aabcccccaaa會變為a2b1c5a3。若“壓縮”后的字符串沒有變短&#xff0c;則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母&#xff08;a…

【JavaEE進階】Spring 更簡單的讀取和存儲對象

文章目錄 一. 存儲Bean對象1. 配置掃描路徑2. 添加注解存儲 Bean 對象2.1 使用五大類注解存儲Bean2.2 為什么要有五大類注解&#xff1f;2.3 有關獲取Bean參數的命名規則 3. 使用方法注解儲存 Bean 對象3.1 方法注解儲存對象的用法3.2 Bean的重命名3.3 同?類型多個 Bean 報錯 …

Spring Boot單元測試與Mybatis單表增刪改查

目錄 1. Spring Boot單元測試 1.1 什么是單元測試? 1.2 單元測試有哪些好處? 1.3 Spring Boot 單元測試使用 單元測試的實現步驟 1. 生成單元測試類 2. 添加單元測試代碼 簡單的斷言說明 2. Mybatis 單表增刪改查 2.1 單表查詢 2.2 參數占位符 ${} 和 #{} ${} 和 …

學點Selenium玩點新鮮~,讓分布式測試有更多玩法

前 言 我們都知道 Selenium 是一款在 Web 應用測試領域使用的自動化測試工具&#xff0c;而 Selenium Grid 是 Selenium 中的一大組件&#xff0c;通過它能夠實現分布式測試&#xff0c;能夠幫助團隊簡單快速在不同的環境中測試他們的 Web 應用。 分布式執行測試其實并不是一…

opencv,opengl,osg,vulkan,webgL,opencL,cuda

OpenCV OpenCV是一個基于BSD許可&#xff08;開源&#xff09;發行的跨平臺計算機視覺和機器學習軟件庫&#xff0c;可以運行在Linux、Windows、Android和Mac OS操作系統上。 它輕量級而且高效——由一系列 C 函數和少量 C 類構成&#xff0c;同時提供了Python、Ruby、MATLAB等…

安卓java A應用切換到B應用,來回切換不執行OnCreate

需求&#xff1a;安卓java如何做到A應用切換到B應用&#xff0c;如果B應用沒啟動就啟動&#xff0c;如果B應用已經啟動就僅僅切換到B應用。B應用再切換回A應用&#xff0c;不要重復執行OnCreate! 在 A 應用中的&#xff1a; 在 A 應用中&#xff0c;如果你希望在切換回 B 應用…

小米平板6Max14即將發布:自研G1 電池管理芯片,支持33W反向快充

明天晚上7點&#xff08;8 月 14 日&#xff09;&#xff0c;雷軍將進行年度演講&#xff0c;重點探討“成長”主題。與此同時&#xff0c;小米將推出一系列全新產品&#xff0c;其中包括備受矚目的小米MIX Fold 3折疊屏手機和小米平板6 Max 14。近期&#xff0c;小米官方一直在…

分布式搜索ElasticSearch-ES(一)

一、ElasticSearch介紹 ES是一款非常強大的開源搜索引擎&#xff0c;可以幫我們從海量的數據中快速找到我們需要的內容。 ElasticSearch結合kibana、Logstash、Beats&#xff0c;也就是elastic stack(ELK)&#xff0c;被廣泛運用在日志數據分析&#xff0c;實時監控等領域。 …

accumulate函數的簡單應用

accumulate函數是C numeric庫中的一個函數&#xff0c;主要用來對指定范圍內元素求和&#xff0c;但也自行指定一些其他操作&#xff0c;如范圍內所有元素相乘、相除等。 使用前需要引用頭文件&#xff1a; #include <numeric>函數共有四個參數&#xff0c;其中前三個為…

Ajax 筆記(二)—— Ajax 案例

筆記目錄 2. Ajax 綜合案例2.1 案例一-圖書管理2.1.1 渲染列表2.1.2 新增圖書2.1.3 刪除圖書2.1.4 編輯圖書 2.2 案例二-背景圖的上傳和更換2.2.1 上傳2.2.2 更換 2.3 案例三-個人信息設置2.3.1 信息渲染2.3.2 頭像修改2.2.3 信息修改2.3.4 提示框 Ajax 筆記&#xff1a; Ajax…