React底層原理詳解

在這里插入圖片描述
React中Element&Fiber對象、WorkInProgress雙緩存、Reconcile&Render&Commit、第一次掛載過程詳解

在面試中介紹React底層原理時,需遵循邏輯清晰、層次分明、重點突出的原則,結合技術深度與實際應用場景。以下是結構化回答模板:


1. 總述React的核心機制

“React的底層設計圍繞高效渲染狀態管理展開,主要通過虛擬DOM、Fiber架構、合成事件和Hooks機制實現。這些技術共同解決了傳統DOM操作性能低下、組件化開發復雜性問題,同時支持現代應用的并發需求。”


2. 分點展開核心原理

(1)虛擬DOM與Diff算法
  • 核心邏輯
    • JSX編譯為虛擬DOM(輕量JavaScript對象),通過React.createElement構建樹結構。
    • Diff算法對比新舊虛擬DOM,計算最小變更集(如節點類型變化、屬性更新)。
    • 通過key優化列表對比效率,避免不必要的節點重建。
  • 應用價值
    • 減少直接DOM操作,提升渲染性能(例:在復雜表單中減少重渲染次數)。
    • 跨平臺能力的基礎(如React Native渲染原生組件)。
(2)Fiber架構與并發模式
  • 核心邏輯
    • 將渲染任務拆分為多個Fiber節點(鏈表結構),支持任務中斷與恢復。
    • 優先級調度:高優先級任務(如用戶輸入)搶占低優先級任務(如數據加載)。
    • 雙緩存技術:內存中構建新Fiber樹,完成后替換當前樹,確保渲染連續性。
  • 應用價值
    • 實現并發渲染(React 18+的useTransition),提升復雜應用的流暢性。
    • 避免長任務阻塞主線程,優化首屏加載時間(例:大列表分片渲染)。
(3)合成事件系統
  • 核心邏輯
    • 事件委托到根節點(如document),統一管理所有事件監聽。
    • 合成事件對象池復用,減少內存開銷(需注意e.persist()的使用場景)。
    • 兼容多瀏覽器事件模型,提供一致API。
  • 應用價值
    • 優化事件處理性能(例:避免為每個列表項單獨綁定事件)。
    • 簡化跨平臺事件邏輯(如React Native與Web事件統一)。
(4)狀態管理與Hooks
  • 核心邏輯
    • setState批量更新:合并多次狀態變更,減少渲染次數。
    • Hooks通過鏈表結構管理狀態(如useState的順序依賴)。
    • 依賴收集(useEffect):僅當依賴變化時觸發副作用。
  • 應用價值
    • 避免過度渲染(例:用React.memo+useCallback優化子組件)。
    • 復雜狀態邏輯解耦(例:自定義Hooks封裝數據請求)。

3. 結合項目經驗舉例

“在之前開發的儀表盤項目中,我通過以下方式應用這些原理:

  • 虛擬DOM優化:對動態圖表組件使用shouldComponentUpdate跳過無效渲染。
  • Fiber架構優勢:使用Suspense+lazy實現代碼分片加載,縮短首屏時間。
  • Hooks實踐:封裝useDataFetching Hook統一處理異步請求狀態,減少重復代碼。”

4. 總結設計思想

“React的設計核心是聲明式編程函數式思想,通過抽象底層細節(如DOM操作),讓開發者專注于UI邏輯。同時,其架構(如Fiber)不斷演進,平衡性能與開發體驗,這是React能持續引領生態的關鍵原因。”


5. 面試加分技巧

  • 對比其他框架
    “相比Vue的響應式數據綁定,React強調不可變數據和顯式狀態管理,更適合大型應用的可預測性需求。”
  • 延伸技術趨勢
    “React Server Components進一步將邏輯向服務端遷移,未來可能結合邊緣計算優化性能。”
  • 主動引導問題
    “您是否想了解我如何處理某個具體場景下的性能問題?(如長列表渲染)”

回答原則

  • 邏輯鏈條清晰:從問題(如DOM性能)→ 解決方案(虛擬DOM)→ 實際價值(性能提升)。
  • 技術術語準確:明確區分“Fiber架構”與“并發模式”等概念。
  • 控制詳略節奏:對重點原理(如Diff算法)深入細節,其他點到為止。

React底層原理詳解”。首先,我需要仔細閱讀所有我搜索到的資料,找出與React底層原理相關的內容。證據中有很多是關于React Native的,但用戶的問題是關于React本身的,所以需要區分開。不過有些證據可能兩者都有涉及,比如提到React和React Native的底層原理相同,都是使用虛擬DOM驅動渲染,只是目標不同。

和提到了虛擬DOM和diff算法,這些都是React的核心機制。詳細說明了虛擬DOM如何提升性能,而則具體描述了JSX如何轉換為JavaScript對象,進而通過React.createElement生成虛擬DOM結構。這里需要結合起來說明React的JSX編譯過程和虛擬DOM的作用。

然后,提到Fiber架構,尤其是React 18的并發模式。Fiber是React的核心架構,它將渲染任務拆分成小單元,支持中斷和恢復,以提高性能和響應能力。需要解釋Fiber的工作原理,比如任務分片、優先級調度等,并結合中的說明,指出并發模式帶來的優勢。

合成事件方面,和提到React的事件系統是合成事件,它統一處理事件,解決瀏覽器兼容性問題,并且事件委托到root節點,減少內存消耗。還提到原生事件先于React事件執行,以及合成事件的好處,如優先級分類。

狀態管理方面,和涉及useState的底層實現和setState的批量更新策略。提到React不會立即更新DOM,而是批量處理state變化,通過diff算法優化性能。這可能涉及到Fiber架構中的狀態更新機制,以及如何調度這些更新。

另外,和提到React的渲染流程分為render階段和commit階段,Fiber的雙緩存技術,這些需要詳細說明。同時,指出React和React Native底層原理相同,虛擬DOM驅動不同平臺的渲染,這里可以簡要對比兩者的異同。

還需要注意證據中的時間信息,比如是React 18的內容,而討論的是React 18的Fiber架構,這可能涉及較新的特性,如并發渲染。但用戶提供的當前日期是2025年,所以需要以最新的資料為主,但證據中大部分可能還是基于舊版本的內容,需要綜合處理。

總結一下,React的底層原理主要包括:

  1. 虛擬DOM和diff算法:通過JSX生成虛擬DOM樹,diff算法比較變化,減少直接操作真實DOM的次數。
  2. Fiber架構:實現任務分片和并發渲染,提高性能。
  3. 合成事件系統:統一事件處理,優化性能。
  4. 狀態更新和批量處理:異步更新state,合并多次更新。
  5. 組件生命周期和Hooks:如useState、useEffect的底層機制。

需要將這些點結合證據中的具體描述,引用對應的證據編號。例如,虛擬DOM部分引用;Fiber架構引用8、12、22;合成事件引用9、17;狀態管理引用15、18等。

最后,確保回答結構清晰,分點詳細說明,每個部分都正確引用我搜索到的資料的編號。

React的底層原理涉及多個核心機制,結合虛擬DOM、Fiber架構、事件系統等關鍵技術實現高效渲染與狀態管理。以下是詳細解析:


1. 虛擬DOM與Diff算法

React通過JSX語法將組件轉換為虛擬DOM樹(JavaScript對象),而非直接操作真實DOM。這一過程由React.createElement()完成,描述元素的標簽、屬性和子節點。例如:

// JSX轉換為虛擬DOM結構
React.createElement("div", { className: "app" }, React.createElement("h1", null, "Hello React")
);

虛擬DOM的優勢

  • 性能優化:通過Diff算法對比新舊虛擬DOM樹的差異,僅更新變化部分,減少真實DOM操作次數。
  • 跨平臺能力:虛擬DOM抽象了渲染邏輯,使React可驅動不同平臺(如Web、Native)的UI渲染。

2. Fiber架構與并發模式

React 16引入Fiber架構,核心目標是實現任務的可中斷與優先級調度,支持并發渲染。

  • 任務分片:將渲染任務拆分為多個“Fiber節點”,每個節點包含組件類型、狀態、副作用等信息。
  • 優先級調度:通過expirationTime標記任務優先級,高優先級任務(如用戶交互)可中斷低優先級任務(如數據加載)。
  • 雙緩存技術:在內存中構建新的Fiber樹,完成后替換當前樹,避免渲染過程中的頁面閃爍。

并發模式(React 18+):

  • 允許渲染過程被中斷并恢復,提升應用響應速度,如實現流暢的過渡動畫。

3. 合成事件系統

React通過 合成事件(SyntheticEvent) 統一處理事件,解決瀏覽器兼容性問題。

  • 事件委托:所有事件綁定到根節點(如document),而非每個子元素,減少內存消耗。
  • 事件池機制:合成事件對象會被復用,事件回調執行完畢后屬性會被清空,需通過e.persist()保留引用。
  • 執行順序:原生事件(如addEventListener)先于React合成事件執行。

4. 狀態管理與更新機制

React通過批量更新優化狀態變更的性能:

  • 異步更新setState或Hooks的狀態更新會被合并,避免頻繁觸發渲染。
  • Diff策略:在Fiber的render階段計算虛擬DOM差異,commit階段一次性提交變更到真實DOM。

Hooks底層原理

  • 鏈表結構:Hooks(如useState)通過鏈表順序記錄狀態,確保在多次渲染中正確獲取值。
  • 依賴收集useEffect通過依賴數組跟蹤變化,僅在依賴更新時執行副作用。

5. 組件通信與生命周期

  • 組件間通信:支持父子組件Props傳遞、Context跨層級通信、全局狀態管理(如Redux)。
  • 生命周期階段
    • 掛載階段constructorrendercomponentDidMount
    • 更新階段shouldComponentUpdate(性能優化關鍵) → rendercomponentDidUpdate
    • 卸載階段componentWillUnmount清理資源。

6. React與React Native的關系

  • 共同原理:均基于虛擬DOM驅動UI更新,但渲染目標不同——React渲染HTML DOM,React Native調用原生組件。
  • 通信機制:React Native通過Bridge與原生平臺通信,JavaScriptCore解析JS代碼,JSON傳遞UI變更。

總結

React通過虛擬DOM、Fiber架構、合成事件等機制,在保證開發效率的同時優化性能。其底層設計(如并發模式)使應用更響應迅速,而狀態管理與組件通信機制則提供了靈活的架構擴展能力。理解這些原理有助于解決復雜場景的性能問題,并深入掌握React生態技術棧。

細節

好的,我需要回答用戶關于“React底層原理圖解”的問題,并且根據我搜索到的資料生成詳細且完整的回答。首先,我需要整理所有我搜索到的資料,找出與React底層原理相關的內容,尤其是涉及虛擬DOM、Diff算法、Fiber架構的部分。

用戶我搜索到的資料共有18條,其中大部分討論了React的虛擬DOM、Diff算法和Fiber架構。例如,都詳細介紹了Fiber架構和Diff算法。則重點講解了虛擬DOM和Diff算法的實現。還有一些資料如涉及React的核心機制和源碼解析。

接下來,我需要將這些信息整合成一個結構清晰的回答。根據用戶的要求,回答需要包含圖解說明,但由于當前是文本形式,需要用文字描述結構,并分點詳細解釋各個部分。同時,每個引用需要標注對應的資料編號。

首先,React的底層原理可以分為幾個核心部分:虛擬DOM、Diff算法、Fiber架構、調度機制和渲染流程。每個部分都需要詳細展開,結合資料中的信息進行說明。

  1. 虛擬DOM:這是React高效渲染的基礎。資料中提到虛擬DOM是真實DOM的輕量級副本,通過JavaScript對象表示,能夠減少直接操作DOM的開銷。都強調了虛擬DOM的作用和生成過程。

  2. Diff算法:React通過Diff算法比較新舊虛擬DOM樹的差異,僅更新變化的部分。詳細描述了Diff算法的策略,如分層比較、組件類型判斷和key值優化。需要說明Diff算法的三大策略,以及如何將時間復雜度優化到O(n)。

  3. Fiber架構:這是React實現異步渲染和任務調度的核心。解釋了Fiber的數據結構、任務拆分、優先級調度和雙緩沖技術。需要描述Fiber節點如何構成鏈表結構,支持可中斷和恢復的任務處理。

  4. 調度機制:Fiber架構下的調度器如何管理任務優先級,利用requestIdleCallback或自定義調度器分配時間片。提到調度器如何確保高優先級任務優先執行,避免阻塞主線程。

  5. 渲染流程:分為協調階段和提交階段。協調階段生成Fiber樹并標記副作用,提交階段更新DOM。詳細描述了這一過程,包括構建WorkInProgress樹和提交更新。

在組織內容時,需要確保每個部分都有足夠的細節,并引用對應的資料。例如,在解釋Fiber架構時,引用來說明其解決的問題和實現方式;在討論Diff算法時,引用來支持分層比較和key的作用。

同時,需要注意用戶要求回答盡量詳實,信息量大,因此每個子部分可能需要進一步細分。例如,在Fiber架構下,可以分點講解Fiber節點的結構、任務拆分、雙緩沖技術等。

最后,總結部分需要綜合所有內容,強調React如何通過這些機制提升性能,并引用我搜索到的資料中的結論,如提到的未來發展和優化方向。

需要確保回答中的每個要點都有對應的資料引用,例如在提到虛擬DOM時引用,在Diff算法部分引用等。同時,語言需要連貫,避免冗余,按照用戶我搜索到的資料準確概括,不添加未提及的信息。

React 底層原理圖解(文字結構化解析)


一、核心架構分層(基于 Fiber 的異步渲染體系)

React 底層架構可分為 虛擬 DOM 層協調器(Reconciler)層渲染器(Renderer)層,其協作流程如下:

JSX → 虛擬 DOM → Fiber 樹 → Diff 算法 → 副作用標記 → DOM 更新

二、虛擬 DOM 與內存計算模型
  1. 虛擬 DOM 的本質
    • 虛擬 DOM 是 JavaScript 對象({ type, props, children }),與真實 DOM 解耦,用于描述界面狀態。
    • 優勢
  • 批量更新:合并多次狀態變更,減少 DOM 操作次數。
  • 跨平臺:通過抽象層適配不同渲染目標(Web/RN/Canvas)。
  1. 生成過程
    • JSX 通過 Babel 轉換為 React.createElement() 調用,生成虛擬 DOM 樹。
    • 示例代碼:
      // JSX
      <div className="container"><span>Hello</span></div>
      // 轉換為
      React.createElement('div', { className: 'container' }, React.createElement('span', null, 'Hello')
      );
      

三、協調器(Reconciler)與 Fiber 架構
  1. Fiber 節點結構
    每個組件對應一個 Fiber 節點,包含鏈表指針和狀態信息:

    {tag: FunctionComponent,  // 組件類型stateNode: ComponentInstance, // 組件實例return: parentFiber,     // 父節點child: firstChildFiber,  // 子節點sibling: nextSiblingFiber, // 兄弟節點alternate: currentFiber, // 指向當前樹的對應節點(雙緩沖)effectTag: Placement/Update/Deletion, // 副作用標記memoizedState: hooks鏈表 // Hooks 狀態存儲
    }
    
  2. Fiber 樹的構建與雙緩沖機制

    • Current Tree:當前渲染的 Fiber 樹。
    • WorkInProgress Tree:構建中的新樹,完成后替換 Current Tree。
    • 優勢:避免部分更新導致的中間狀態可見,實現原子性提交。
  3. 任務調度與時間切片

    • 可中斷性:將渲染任務拆分為多個 Fiber 單元,通過 requestIdleCallback 或自定義調度器分配執行時間。
    • 優先級策略
  • 同步任務(用戶輸入):立即執行。
  • 高優先級(動畫):下一幀執行。
  • 低優先級(數據請求):空閑時執行。

四、Diff 算法與高效更新策略
  1. Diff 算法的三大優化策略

    • 層級比較(Tree Diff) :僅比較同層級節點,跨層級移動直接重建。
    • 組件類型判斷:不同類型組件直接替換(如 <div><span>)。
    • Key 值優化:通過唯一 Key 標識節點,減少無意義比對。
  2. Diff 過程詳解

    • 單節點 Diff:通過 mapRemainingChildren 跟蹤舊節點,尋找可復用的 Fiber。
    • 多節點 Diff
  3. 遍歷新子節點,匹配舊子節點索引。

  4. 記錄移動/刪除操作,生成副作用鏈表。


五、渲染流程分階段解析
  1. 協調階段(Render Phase)

    • 深度優先遍歷:從根 Fiber 開始,遞歸處理子節點,生成副作用列表。
    • 生命周期觸發:執行 getDerivedStateFromPropsshouldComponentUpdate 等。
  2. 提交階段(Commit Phase)

    • DOM 操作批處理:根據副作用列表一次性更新真實 DOM。
    • 生命周期鉤子:觸發 componentDidMountcomponentDidUpdate

六、性能優化關鍵設計
  1. 并發模式(Concurrent Mode)

    • 通過 createRoot 啟用,允許中斷低優先級任務,優先處理用戶交互。
    • Suspense:延遲加載組件,優化首屏渲染。
  2. Hooks 與狀態管理

    • Fiber.memoizedState:鏈表結構存儲 Hook 狀態,確保順序穩定性。
    • 批量更新:事件循環內合并多次 setState,減少渲染次數。

七、架構演進對比(Stack Reconciler vs Fiber)
特性Stack ReconcilerFiber Reconciler
任務執行方式遞歸(不可中斷)循環鏈表(可中斷/恢復)
優先級支持多優先級任務調度
內存占用較低(無額外數據結構)較高(維護雙緩沖 Fiber 樹)
適用場景簡單應用復雜交互與動畫場景

八、源碼級流程圖解
1. 初始化:ReactDOM.render(<App />, root)├─ 創建 FiberRoot(當前樹根)├─ 調度首次渲染(scheduleUpdateOnFiber)2. 協調階段├─ beginWork():處理組件渲染,生成子 Fiber├─ completeWork():創建 DOM 節點,收集副作用└─ 循環直至所有節點處理完成(可中斷)3. 提交階段├─ commitBeforeMutationEffects:生命周期預處理├─ commitMutationEffects:DOM 增刪改└─ commitLayoutEffects:生命周期后處理

九、設計哲學與未來方向
  • 增量渲染:將大型任務拆解為微小單元,避免阻塞主線程。
  • 服務端組件:分離服務端/客戶端邏輯,減少客戶端負載(React Server Components)。
  • 編譯優化:通過編譯器(如 React Forget)自動優化 Hook 依賴與渲染邏輯。

通過虛擬 DOM 抽象、Fiber 架構的任務調度和 Diff 算法的精準比對,React 實現了高效渲染與流暢交互。其底層設計體現了 時間切片優先級調度副作用批處理 三大核心思想,為復雜應用提供了堅實的基礎架構支持。

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

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

相關文章

qt5的中文亂碼問題,QString、QStringLiteral 為 UTF-16 編碼

qt5的中文亂碼問題一直沒有很明確的處理方案。 今天處理進程間通信時&#xff0c;也遇到了qt5亂碼問題&#xff0c;一邊是設置的GBK&#xff0c;一邊設置的是UTF8&#xff0c;單向通信約定采用UTF8。 發送端保證發的是UTF8字符串&#xff0c;因為UTF8在網絡數據包中沒有字節序…

解鎖瀏覽器內置API,助力跨標簽/跨頁面數據通信

1 BrodcastChanner 概念 BroadcastChannel接口表示給定源的任何瀏覽上下文都可以訂閱的命名頻道。它允許同源的不同瀏覽器窗口、標簽頁、frame 或者 iframe 下的不同文檔之間相互通信。消息通過message事件進行廣播&#xff0c;該事件在偵聽該頻道的所有BroadcastChannel對象上…

Mysql-如何理解事務?

一、事務是什么東西 有些場景中&#xff0c;某個操作需要多個sql配合完成&#xff1a; 例如&#xff1a; 李四這個月剩下的前不夠交房租了&#xff0c;找張三借1000元急用&#xff1a; &#xff08;1&#xff09;給張三的賬戶余額 減去1000元 updata 賬戶表 set money money -…

《deepseek FlashMLA :高效的 MLA 解碼內核》:此文為AI自動翻譯

FlashMLA GitHub - deepseek-ai/FlashMLA FlashMLA 是適用于 Hopper GPU 的高效 MLA 解碼內核&#xff0c;針對可變長度序列服務進行了優化。 當前發布&#xff1a; BF16、FP16塊大小為 64 的分頁 kvcache 快速開始 安裝 python setup.py install 基準 python tests/test_fl…

Windows對比MacOS

Windows對比MacOS 文章目錄 Windows對比MacOS1-環境變量1-Windows添加環境變量示例步驟 1&#xff1a;打開環境變量設置窗口步驟 2&#xff1a;添加系統環境變量 2-Mac 系統添加環境變量示例步驟 1&#xff1a;打開終端步驟 2&#xff1a;編輯環境變量配置文件步驟 3&#xff1…

藍橋杯 之 填空題-位運算與循環

文章目錄 循環握手問題門牌制作-循環小球反彈幸運數藝術與籃球跑步 位運算3個1美麗的2024 位運算 可以關注這個Lowbit(x) 如何判斷最低位是否是1&#xff1f; num&1 1就說明num最低位是1 循環 循環 握手問題 握手問題 思路分析&#xff1a; 可以直接計算出來&#xff…

Java進階——反射機制超全詳解

反射能在運行時動態操作類和對象的能力&#xff0c;極大地增強了程序的靈活性。但是反射的使用也伴隨著性能開銷和安全風險。本文將由博主帶你一起深入探討 Java 反射的核心概念、關鍵類和方法&#xff0c;以及在日常開發中的應用場景。 本文目錄 一、反射的核心概念1. 運行時類…

OAK相機的抗震性測試

在工業環境中&#xff0c;雙目視覺相機必須具備與工作環境同等的堅固性。鑒于部分客戶會將我們的相機應用于惡劣環境&#xff08;例如安裝在重型機械上&#xff09;&#xff0c;我們依據EN 60068-2-6:2008標準對相機進行了振動耐受性測試。 測試涉及的相機型號包括&#xff1a…

Express MVC

1. 安裝依賴 npm init -y npm install express npm install --save-dev typescript ts-node ejs types/node types/express tsc --init 2. 項目目錄結構如下&#xff0c;沒有的手動創建 /my-app/src/modelsuser.ts/viewsindex.ejsuserList.ejs/controllersuserController.ts…

apache-maven-3.2.1

MAVEN_HOME D:\apache-maven-3.2.1 PATH D:\apache-maven-3.2.1\bin cmd mvn -v <localRepository>d:\localRepository</localRepository> setting.xml <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Soft…

合并兩個有序鏈表:遞歸與迭代的實現分析

合并兩個有序鏈表&#xff1a;遞歸與迭代的實現分析 在算法與數據結構的世界里&#xff0c;鏈表作為一種基本的數據結構&#xff0c;經常被用來解決各種問題。特別是對于有序鏈表的合并&#xff0c;既是經典面試題&#xff0c;也是提高編程能力的重要練習之一。合并兩個有序鏈…

破解密碼防線:滲透測試中的密碼攻擊手法匯總

密碼是網絡安全中的一道重要防線&#xff0c;然而&#xff0c;若密碼策略不嚴密&#xff0c;往往會為攻擊者提供可乘之機。本文將簡要介紹滲透測試中關于密碼的幾種常見攻擊思路和手法。 1. 確認使用默認及常見的賬號密碼 在滲透測試的初期&#xff0c;攻擊者通常會嘗試使用系…

CSS Selectors

當然&#xff0c;理解純CSS選擇器&#xff08;CSS Selectors&#xff09;對于進行UI自動化測試非常重要。CSS選擇器允許您通過元素的屬性、層級關系、類名、ID等來精準定位頁面上的元素。下面我將詳細講解CSS選擇器的常見用法&#xff0c;并結合您的需求提供具體的示例。 1. 基…

【java】@Transactional導致@DS注解切換數據源失效

最近業務中出現了多商戶多租戶的邏輯&#xff0c;所以需要分庫&#xff0c;項目框架使用了mybatisplus所以我們自然而然的選擇了同是baomidou開發的dynamic.datasource來實現多數據源的切換。在使用初期程序運行都很好&#xff0c;但之后發現在調用com.baomidou.mybatisplus.ex…

淺入淺出Selenium DevTools

前言 在自動化測試領域&#xff0c;Selenium一直是主流工具之一。隨著前端技術的不斷發展&#xff0c;瀏覽器的功能也在不斷豐富。 Selenium 3版本前&#xff0c;一套通用的采集流程如上圖所示&#xff1a; 打開Charles&#xff0c;設置Session自動導出頻次及導出路徑Seleniu…

04 路由表的IP分組傳輸過程

目錄 1、路由表的核心結構 2、IP分組傳輸過程和數據包轉發過程 2.1、IP分組傳輸過程 2.2、數據包轉發過程 2.3、IP分組傳輸過程和數據包轉發的區別 3、數據包的變化 3.1、拓撲結構 3.2、傳輸過程詳解&#xff08;主機A → 主機B&#xff09; 3.2.1、主機A發送數據 3.2…

【子網掩碼計算器:Python + Tkinter 實現】

子網掩碼計算器&#xff1a;Python Tkinter 實現 引言代碼功能概述代碼實現思路1. 界面設計2. 功能實現3. 事件處理 子網掩碼計算器實現步驟1. 導入必要的庫2. 定義主窗口類 SubnetCalculatorApp3. 創建菜單欄4. 創建界面組件5. 判斷 IP 地址類別6. 計算子網信息7. 其他功能函…

【練習】【貪心】力扣1005. K 次取反后最大化的數組和

題目 1005 K 次取反后最大化的數組和 給你一個整數數組 nums 和一個整數 k &#xff0c;按以下方法修改該數組&#xff1a; 選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。 重復這個過程恰好 k 次。可以多次選擇同一個下標 i 。 以這種方式修改數組后&#xff0c;返回數組 可…

3dsmax中使用python創建PBR材質并掛接貼圖

前言 筆者處理模型時下載到一個pbr材質庫貼圖包&#xff0c;手動每次創建材質過于麻煩&#xff0c;因此計劃使用自動化腳本根據貼圖名自動創建材質。 3dsmax的原本腳本使用的是maxscript&#xff0c;語法有點奇怪懶得學&#xff0c;發現也支持使用python編寫腳本&#…

Metal學習筆記九:光照基礎

光和陰影是使場景流行的重要要求。通過一些著色器藝術&#xff0c;您可以突出重要的對象、描述天氣和一天中的時間并設置場景的氣氛。即使您的場景由卡通對象組成&#xff0c;如果您沒有正確地照亮它們&#xff0c;場景也會變得平淡無奇。 最簡單的光照方法之一是 Phong 反射模…