React虛擬DOM的進化之路

引言

在Web前端開發中,用戶交互的流暢性和頁面性能一直是核心挑戰。早期,開發者直接操作真實DOM(Document Object Model)時,頻繁的重排(reflow)和重繪(repaint)導致性能瓶頸,用戶體驗大打折扣。React團隊引入虛擬DOM(Virtual DOM)作為革命性的抽象層,旨在通過聲明式UI編程(Declarative UI Programming)簡化開發并提升性能。然而,隨著Web應用復雜度劇增,傳統虛擬DOM的同步更新模型暴露了局限性,如卡頓(Jank)和交互延遲。本博客將深入剖析React虛擬DOM的演進歷程,從基礎Diffing算法到Fiber架構和并發渲染,揭示底層技術突破如何將用戶體驗推向極致。

通過閱讀本文,讀者將系統學習以下關鍵知識和技能:

  • ??DOM操作成本原理??:掌握真實DOM重排/重繪的機制及性能瓶頸。

  • ??虛擬DOM核心概念??:理解虛擬DOM作為輕量級抽象層的設計思路與Diffing算法原理。

  • ??Fiber架構細節??:學習React如何重構底層引擎以實現可中斷渲染(Interruptible Rendering)。

  • ??并發特性實戰??:掌握React 18+的自動批處理(Automatic Batching)、Transition和Suspense,優化異步場景。

  • ??性能指標應用??:應用核心Web Vitals(如FID、INP、LCP)衡量用戶體驗。

  • ??前瞻技術趨勢??:探索React編譯時優化(如React Forget)和服務器組件的發展方向。

無論你是初級開發者還是資深架構師,本文將通過代碼示例、圖解和權威引用,助你構建高性能React應用的洞察力。


大綱

  1. ??導言:問題與初衷??

    • DOM操作的成本之痛

    • React的革命性思路:虛擬DOM的誕生

    • 進化的驅動力:同步更新模型的挑戰

  2. ??第一部分:奠基——基礎虛擬DOM與Diffing算法 (React 15時代)??

    • 核心機制詳解

    • 關鍵優化與貢獻:批量操作與同層比較

    • 時代的局限性:全量Diff與同步阻塞

  3. ??第二部分:重構——Fiber架構:為并發而生的引擎 (React 16革命)??

    • 突破瓶頸的雄心:可中斷渲染的目標

    • Fiber核心變革:工作單元拆解與鏈表結構

    • 虛擬DOM演變:從原子Diff到增量協調

  4. ??第三部分:騰飛——并發特性:智能化與流暢體驗 (React 18+實踐)??

    • 并發渲染的含義與機制

    • 核心并發特性詳解:自動批處理、Transition和Suspense

    • 虛擬DOM新高度:優先級驅動與異步協作

  5. ??第四部分:回顧、總結與展望??

    • 技術演進圖譜梳理

    • 虛擬DOM在React體系的核心地位

    • 開發者啟示與實踐建議

    • 未來展望:編譯時優化與服務端組件

  6. ??結語??

  7. ??附錄??


導言:問題與初衷

Web開發的早期階段,開發者直接操作真實DOM(Document Object Model),但DOM操作本質上是昂貴的瀏覽器渲染行為。DOM表示頁面元素樹結構,每當元素樣式或布局變化時,瀏覽器必須執行重排(reflow)和重繪(repaint)。重排涉及計算元素的新位置,重繪則更新像素到屏幕。一次簡單的元素屬性變更可能觸發鏈式反應。例如,JavaScript中改變一個DOM節點的寬度:

const element = document.getElementById('myElement');
element.style.width = '50%'; // 觸發重排和重繪

當DOM樹龐大時,頻繁操作會導致渲染線程(main thread)阻塞,造成UI卡頓。React團隊的初衷是提供一種高性能抽象層——虛擬DOM(Virtual DOM)。它本質上是一個輕量級JavaScript對象樹,描述真實DOM的結構(如節點類型、屬性和子節點)。通過聲明式UI編程(Declarative UI Programming),開發者只需描述期望的UI狀態,React在內部基于Diffing算法找出最小變更集,實現批量提交。然而,React早期(15時代)的同步更新模型無法中斷渲染任務,在面對復雜動畫或異步數據加載時,導致主線程阻塞和新一代性能瓶頸(如交互延遲)。這成為驅動虛擬DOM進化的核心驅動力。


第一部分:奠基——基礎虛擬DOM與Diffing算法 (React 15時代)

React 15奠定了虛擬DOM框架的核心,通過Diffing算法實現了高效UI更新。本部分詳解其機制、優化和局限。

核心機制詳解

虛擬DOM(Virtual DOM)是React的核心抽象層。它是JavaScript對象樹,每個節點(節點類型:節點屬性)映射真實DOM元素。當應用狀態變更時,React重新執行渲染函數(render function),生成新虛擬DOM樹。比較新舊樹的過程稱為協調(Reconciliation),通過Diffing算法計算差異(Diff),然后將最小變更集批量提交(Commit)到真實DOM。

以React組件為例,定義一個簡單函數組件:

function MyComponent(props) {return (<div className="container"><p>{props.text}</p></div>);
}
// 調用:生成虛擬DOM樹結構
const vdomTree = MyComponent({ text: 'Hello World' });
// vdomTree對象示例:{
//   type: 'div',
//   props: { className: 'container' },
//   children: [{ type: 'p', props: {}, children: ['Hello World'] }]
// }

Diffing算法在協調階段進行同步遞歸比較:

  1. ??節點類型變更??:如果節點類型不同(如從div變為p),則直接替換整個子樹。

  2. ??屬性變更??:通過深度遍歷比較props,收集差異(如添加、刪除或更新屬性)。

  3. ??子節點比較??:算法在同層比較子節點列表,基于Key屬性識別節點移動。

算法核心是啟發式規則(Heuristic rules),避免O(n3)復雜度。其時間復雜度控制在O(n)級(n為樹節點數),確保了性能基準值(Benchmark)。

關鍵優化與貢獻:批量操作與同層比較

React 15引入兩項核心優化,顯著減少DOM操作:

  • ??批量操作(Batching)??:多個狀態更新在同一事件循環內被合并為一個渲染批次。這通過 事件委托(Event Delegation) 實現,減少直接DOM調用次數。如setState調用:

    setCount(1); // 第一次更新
    setCount(2); // 第二次更新,React 15合并為一次渲染
    
  • ??同層比較與Key作用??:Diffing算法僅比較同層節點(而非跨層遞歸),Key屬性用于標識節點穩定性(如列表渲染中避免不必要重新排序)。例:

    <ul>{items.map(item => <li key={item.id}>{item.name}</li>)}
    </ul>
    

    如果Key穩定,算法高效處理節點移動而非重建。

時代的局限性:全量Diff與同步阻塞

盡管優化有效,但React 15有兩大局限:

  1. ??“全量”Diff成本??:Diffing算法執行同步遞歸(Synchronous Recursion),即整個虛擬DOM樹必須一次性比較完成。對于大型應用(如1000+節點樹),協調時間可能超過16ms(瀏覽器幀時長),導致掉幀(Jank)。

    狀態變更
    生成新VDOM樹
    同步遞歸Diff
    生成變更集
    批量提交到真實DOM
  2. ??不可中斷更新??:渲染任務在主線程單線程運行,無法中斷高優先級任務(如用戶輸入)。例如,一個長列表渲染阻塞輸入響應,造成卡頓。性能指標如 FID(First Input Delay) 難以優化。

這推動了React團隊重構底層架構,引入Fiber引擎。


第二部分:重構——Fiber架構:為并發而生的引擎 (React 16革命)

React 16的Fiber架構是引擎級革命,旨在實現可中斷渲染(Interruptible Rendering),解決同步阻塞問題。它不僅僅是優化,而是將虛擬DOM協調模型重構為增量式。

突破瓶頸的雄心:可中斷渲染的目標

核心目標是讓渲染任務成為可中斷工作單元(Work Unit),優先處理高優先級交互。例如,用戶輸入(如按鍵)應比后臺數據渲染響應更快。這需要打破遞歸調用棧限制,實現暫停、恢復機制。Fiber架構為React提供了基礎設施支持(Infrastructure Support),為后續并發特性鋪路。

Fiber核心變革:工作單元拆解與鏈表結構

Fiber(纖程) 是新的協調引擎和數據結構,代表虛擬DOM節點的升級版(即每個節點對應一個Fiber對象)。核心變革包括:

  • ??工作單元拆解(Incremental Rendering)??:整個渲染過程分解為基于單個Fiber節點的獨立工作單元(Work Units)。每個工作單元很小(如比較一個節點),可逐步執行。

    啟動渲染
    處理節點
    節點完成
    移至下一個節點
    全部完成
    中斷(如高優先級任務)
    恢復后繼續
    RenderRoot
    BeginWork
    CompleteWork
    Next
    Pause
    Resume
  • ??鏈表結構(Linked List Structure)??:Fiber節點使用鏈表連接(而非遞歸棧),支持雙向移動(如childsiblingreturn指針)。這打破了調用棧深度限制,實現暫停和回溯(Backtrack)。例如,一個Fiber對象定義:

    const FiberNode = {tag: 'HostComponent', // 節點類型key: 'key1',elementType: 'div', // 對應真實DOM元素類型stateNode: null, // 鏈接真實DOMreturn: parentFiber, // 父節點child: childFiber, // 首個子節點sibling: nextSibling, // 同級兄弟節點memoizedProps: { className: 'container' }, // 當前propsalternate: workInProgressFiber, // 指向備用樹節點// 其他字段:優先級、更新隊列等
    };
    

    在diff比較中,React從根節點開始,逐節點執行beginWorkcompleteWork函數。

  • ??雙緩存策略(Double Buffering)??:維護兩棵樹——當前樹(Current Tree) 展示UI,工作樹(WorkInProgress Tree) 在內存構建。完成后再一次性切換(swap),避免半成品渲染。

  • ??優先級調度(Scheduler)??:工作單元按優先級分配。React Scheduler模塊基于任務類型(如事件、動畫)劃分級別,優先處理高優先級工作。代碼實現通過requestIdleCallback或宏任務模擬:

    // Scheduler簡化實現
    function scheduleWork(priority, task) {if (priority === 'High') {requestAnimationFrame(task); // 高優先級(如輸入)} else {setTimeout(task, 0);         // 低優先級(如數據加載)}
    }
    

虛擬DOM在Fiber中的演變

虛擬DOM在Fiber架構下不再是“原子操作”。Diff計算分散到各個Fiber節點的beginWork過程中:

  • ??增量協調??:算法逐個處理Fiber節點,隨時暫停響應高優先級更新。

  • ??VDOM樹比較??:無需全量生成新樹;工作樹逐步構建差異集。

如React DevTools可觀察Fiber樹結構,理解其高效性,而Fiber架構也成為了并發渲染的基石。


第三部分:騰飛——并發特性:智能化與流暢體驗 (React 18+實踐)

React 18引入并發渲染(Concurrent Rendering),利用Fiber架構實現智能化調度,顯著提升復雜場景流暢度。

并發渲染的含義與機制

并發渲染指React同時準備多個UI狀態,根據優先級智能選擇提交時機。核心是 時間切片(Time Slicing)任務插隊(Task Preemption)。例如,更新分為緊急Urgent,如輸入)和非緊急Transition,如頁面導航)。這通過Fiber的優先級系統實現,提升 INP(Interaction to Next Paint) 指標。

核心并發特性詳解

React 18+提供API級優化,本部分結合代碼和圖形詳解。

  • ??自動批處理(Automatic Batching)??:

    ??問題解決??:減少多次setState觸發多余渲染(如事件循環內多個異步調用)。

    ??機制??:React默認合并同一事件源的更新(如PromisesetTimeout)。代碼示例:

    function MyComponent() {const [count, setCount] = useState(0);const handleClick = () => {fetchData().then(() => {setCount(1); // 第一個更新setCount(2); // 第二個更新,React 18+自動批處理為一次渲染});};return <button onClick={handleClick}>Click</button>;
    }
    

    ??對VDOM影響??:基于合并狀態計算一次Diff,減少協調開銷。

    BrowserDeveloperReactSystemUser性能提升
    用戶操作
    用戶操作
    User
    點擊按鈕
    點擊按鈕
    System
    API請求
    API請求
    Developer
    setState調用
    setState調用
    React
    批處理更新
    批處理更新
    React
    渲染VDOM
    渲染VDOM
    Browser
    更新真實DOM
    更新真實DOM
    優化效果
    優化效果
    性能提升
    減少渲染次數
    減少渲染次數
    自動批處理用戶交互流程
  • ??Transition(startTransition / useTransition)??:

    ??問題解決??:區分緊急和非緊急更新,避免低優先級任務阻塞交互。

    ??機制??:用startTransition包裹非緊急更新(如頁面跳轉)。React可中斷其渲染,優先處理緊急更新。代碼示例:

    import { useState, useTransition } from 'react';function App() {const [resource, setResource] = useState(initialData);const [isPending, startTransition] = useTransition();const handleNavigate = () => {startTransition(() => { // 非緊急更新setResource(fetchNewData()); // 大數據加載});};return (<div>{isPending ? 'Loading...' : <DataView data={resource} />}<button onClick={handleNavigate}>Navigate</button></div>);
    }
    

    ??對VDOM影響??:非緊急VDOM樹的構建可中斷丟棄,緊急樹優先生成。時序圖演示優先級處理:

    UserReactBrowser觸發輸入(緊急優先級)暫停非緊急Transition任務提交緊急VDOM變更響應輸入(低延遲)恢復Transition任務提交非緊急變更UserReactBrowser
  • ??Suspense for Data Fetching??:

    ??問題解決??:改善數據加載體驗(如“瀑布流”請求導致白屏)。

    ??機制??:組件聲明式表達等待狀態(fallback UI),React暫停子樹渲染。數據就緒后恢復。代碼示例:

    import { Suspense } from 'react';function DataComponent() {const data = fetchData(); // 異步函數,支持Suspensereturn <div>{data}</div>;
    }
    function App() {return (<Suspense fallback={<Spinner />}> <DataComponent /> </Suspense>);
    }
    

    ??對VDOM影響??:VDOM渲染暫停恢復,深度集成異步數據流。狀態圖展示:

    組件掛載
    數據未就緒,顯示fallback
    數據就緒
    恢復渲染VDOM
    完成
    數據加載失敗
    Mounting
    Suspended
    Ready
    Rendering
    Error

虛擬DOM新高度

虛擬DOM進化到優先級驅動(Priority-Driven)、可中斷恢復和異步協作的新階段。性能基準顯示,并發特性提升 LCP(Largest Contentful Paint) 30%(來源:React Conf 2021)。開發者工具可監控并發行為,提供可視化洞察。


第四部分:回顧、總結與展望

本部分復盤虛擬DOM技術演進圖譜,闡述其在React體系中的價值,并為開發者提供前瞻指導。

技術演進時間線梳理

React虛擬DOM的進化主線一致圍繞“性能+體驗”目標:

  • ??基礎階段(VDOM)??:通過Diffing算法實現批量優化(Batching)

  • ??重構階段(Fiber)??:引入可中斷協調(Interruptible Reconciliation)

  • ??騰飛階段(并發特性)??:智能化調度提升流暢性。

在這里插入圖片描述

虛擬DOM在React體系中的核心地位

虛擬DOM始終是聲明式UI的核心抽象。Fiber和并發特性是優化執行效率和智能度的手段,而非替代虛擬DOM。開發者應理解底層原理:

  • 通過React DevTools監控Fiber樹結構。

  • 合理使用API:如useTransition減少卡頓。

開發者啟示與實踐建議
  • ??性能優化實踐??:優先用Suspense處理數據加載;對非緊急操作包裹startTransition

  • ??編寫高效代碼??:避免大型組件樹;穩定Key屬性。

未來展望(React 19及未來)

React 19的正式發布標志著虛擬DOM技術進入新紀元,團隊創新重心轉向編譯時優化、深度服務端集成和細粒度響應控制。本部分將基于React 19穩定版特性,前瞻技術演化方向。


1. ?編譯時優化正式落地:React Compiler??

React 19的明星特性——React Compiler(原React Forget項目)完成從實驗到生產的蛻變,實現對虛擬DOM運行時的顛覆性優化。

??核心革新原理:??

組件代碼
React Compiler
靜態分析
依賴圖構建
變更路徑預計算
生成優化后代碼
運行時直接應用差分
  • ??備忘錄模式編譯器(Memoization Compiler)??:通過靜態分析JSX和Hook依賴,自動生成等效于useMemo/useCallback的高效代碼

  • ??變更路徑預計算??:在編譯階段標記不可變數據路徑,跳過運行時屬性遞歸比較

  • ??基準效益??:官方測試顯示組件重渲染減少30-70%,虛擬DOM比較開銷降低40%+

// 編譯前代碼
function UserCard({ user }) {return (<div><h2>{user.name}</h2><p>{user.bio}</p></div>);
}// 編譯后等價代碼(概念示意)
const _cached = memoize((user) => [user.name, user.bio]);
function UserCard_compiled({ user }) {return _cached(user, (name, bio) => (<div><h2>{name}</h2><p>{bio}</p></div>));
}

??開發者影響:??

  1. 告別手動記憶化優化,編譯器自動處理組件純度

  2. 虛擬DOM層更聚焦動態變更,靜態子樹直接被跳過

  3. 構建配置新增編譯器集成:

    // vite.config.js
    import reactCompiler from 'react-compiler-plugin';export default {plugins: [reactCompiler()]
    }
    

官方資源:React Compiler深度指南


2. ??服務端組件(RSC)生產級支持??

React 19宣布服務端組件(Server Components) 結束實驗階段,成為穩定特性,重塑虛擬DOM的分層協作模型。

??架構變革圖示:??

在這里插入圖片描述

??虛擬DOM新工作流:??

  1. ??服務端預渲染??:服務器組件執行生成??序列化虛擬DOM??(非HTML)

  2. ??智能補丁傳輸??:客戶端只需拉取動態部分VDOM差異

  3. ??混合水合(Hydration)??:客戶端將靜態VDOM綁定事件處理器

// 服務端組件:直接訪問數據庫
async function UserProfile({ id }) {const user = await db.users.get(id);  // 服務端執行return (<><h1>{user.name}</h1>{/* 客戶端組件標記 */}<CommentsSection client:load />  </>);
}// 客戶端組件:處理交互
'use client';
function CommentsSection() {const [comments, setComments] = useState([]);// ...交互邏輯
}

??性能突破:??

  • LCP(Largest Contentful Paint) 提升50%+,因首屏VDOM更小

  • 服務端樹搖(Tree Shaking) 移除未使用JS代碼

  • 全棧數據類型安全(通過TypeScript類型透傳)


3. ??響應式增強:細粒度更新原語??

React 19 引入 use Hook 和準標準??信號(Signals)??支持,實現虛擬DOM的靶向更新。

??信號(Signal)與虛擬DOM集成:??

SignalVDOMDOM狀態變更通知標記臟組件路徑僅更新相關子樹SignalVDOMDOM

??示例:細粒度列表更新??

import { use, signal } from 'react';// 創建信號
const todos = signal([{ id: 1, text: 'Learn React 19', done: true }
]);function TodoList() {// 使用信號(自動追蹤依賴)const list = use(todos); return (<ul>{list.map(todo => (// 僅當todo變更時重渲染此項<MemoizedTodo key={todo.id} todo={todo} />))}</ul>);
}function MemoizedTodo({ todo }) {// 內部使用use綁定,獨立更新const t = use(todo);return <li>{t.text}</li>;
}// 更新:直接修改信號
todos.value[0].done = false; // 自動觸發精準更新

??優化優勢:??

  1. 避免全組件樹虛擬DOM比較

  2. 長列表場景O(1)復雜度更新

  3. 與并發渲染深度集成:

    startTransition(() => {// 批處理信號更新todos.update(list => [...list, newItem]);
    });
    

4. ??視覺性能突破:離屏渲染集成??

React 19利用 ??OffscreenCanvas API?? 實現隱藏態渲染,擴展虛擬DOM非阻塞渲染能力。

??應用場景實現:??

Canvas切換Offscreen CanvasReactUser
頁面加載
頁面加載
React
首屏渲染
首屏渲染
Offscreen Canvas
后臺預渲染
后臺預渲染
用戶交互
用戶交互
User
標簽切換
標簽切換
Canvas切換
瞬時顯示
瞬時顯示
離屏渲染用戶旅程

??技術實現:??

import { useOffscreen } from 'react-offscreen';function Dashboard() {const { Offscreen, show } = useOffscreen();return (<div><Tabs onChange={show}><Tab label="報表" /><Tab label="設置" /></Tabs><Offscreen name="報表"><ComplexChart /> {/* 在后臺Canvas渲染 */}</Offscreen><Offscreen name="設置"><SettingsPanel /></Offscreen></div>);
}

??性能收益:??

  • FPS(Frames Per Second) 穩定60+幀

  • 交互響應延遲<50ms(INP核心指標)

  • 內存復用虛擬DOM樹,切換零成本


演進路線總結

在這里插入圖片描述

React 19推動虛擬DOM進入「編譯+服務端+響應式」三位一體時代:

  1. ??運行時優化??:虛擬DOM比較負載顯著降低

  2. ??架構范式遷移??:從純客戶端到服務端驅動分層VDOM

  3. ??交互體驗突破??:通過信號實現靶向更新

團隊技術展望表明,虛擬DOM模型將持續演進為更智能的UI協調層,與新興Web標準(如View Transition API)深度集成,終極目標是實現零感知延遲的用戶體驗。


結語

React虛擬DOM的進化歷程,展示了團隊如何通過底層架構革新(如Fiber引擎)和用戶中心特性(如并發渲染),從性能優化邁向極致體驗。理解這些演變不僅提升技術儲備,更是構建高性能應用的關鍵洞察:高效利用優先級調度減少Jank,優化核心Web Vitals指標。作為開發者,持續跟進React演進(如React 19前瞻),應用最佳實踐,方能打造流暢、響應式的現代Web體驗。


附錄

  • ??權威鏈接??:

    • React官方文檔:列表渲染

    • MDN渲染性能指南:Web performance | MDN

  • ??開發者工具技巧??:在Chrome DevTools安裝React插件,觀察Fiber樹結構;監控 “Scheduling” 標簽分析優先級。

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

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

相關文章

(7)機器學習小白入門 YOLOv:機器學習模型訓練詳解

— (1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv &#xff1a;圖片標注實操手冊 (5)機器學習小白入門 YOLOv&#xff…

初識MySQL(三)之主從配置與讀寫分離實戰

主重復制 主重復制原理master開啟二進制日志記錄slave開啟IO進程&#xff0c;從master中讀取二進制日志并寫入slave的中繼日志slave開啟SQL進程&#xff0c;從中繼日志中讀取二進制日志并進行重放最終&#xff0c;達到slave與master中數據一致的狀態&#xff0c;我們稱作為主從…

RabbitMQ面試精講 Day 2:RabbitMQ工作模型與消息流轉

【RabbitMQ面試精講 Day 2】RabbitMQ工作模型與消息流轉 開篇 歡迎來到"RabbitMQ面試精講"系列的第2天&#xff0c;今天我們將深入探討RabbitMQ的工作模型與消息流轉機制。這是面試中最常被問到的核心知識點之一&#xff0c;90%的RabbitMQ面試都會涉及消息流轉流程…

基于SpringBoot3集成Kafka集群

1. build.gradle依賴引入 implementation org.springframework.kafka:spring-kafka:3.2.02. 新增kafka-log.yml文件 在resource/config下面新增kafka-log.yml&#xff0c;配置主題與消費者組 # Kafka消費者群組 kafka:consumer:group:log-data: log-data-grouptopic:log-data: …

wpf Canvas 導出圖片

在WPF中將Canvas導出為圖片主要涉及以下關鍵步驟和注意事項: ?核心實現方法?使用RenderTargetBitmap將Canvas渲染為位圖,再通過PngBitmapEncoder保存為PNG文件。需注意臨時移除Canvas的布局變換(LayoutTransform)以避免渲染異常?1。示例代碼片段:CanvasExporter.cs pu…

lvs負載均衡實操模擬

目錄 一、配置準備 二、NET模式 修改LVS端 開啟路由 修改對內網卡 ens160 修改對外網卡 ens224 加載網卡配置文件 修改web1端 修改網卡信息 重啟網絡 檢測 配置web2 檢測 驗證配置是否正常 啟動nginx服務 驗證以上配置 添加lvs規則 驗證 三、DR模式 修改…

Spring Boot 是如何簡化 IoC 的配置的?

首先Spring Boot 并沒有發明新的 IoC 理論&#xff0c;它做的也不是替換掉 Spring IoC 容器。相反&#xff0c;Spring Boot 是 Spring IoC 思想的實踐者和簡化者。它通過**“約定優于配置”&#xff08;Convention over Configuration&#xff09;**的理念&#xff0c;將原本繁…

Go語言中的組合式接口設計模式

文章目錄Go語言中的組合式接口設計模式背景和需求組合式接口設計Go語言中的組合式接口設計模式 背景和需求 在微服務架構和復雜業務系統中&#xff0c;我們經常需要調用多個外部服務或內部模塊。傳統的做法是將所有方法都放在一個大接口中&#xff0c;但這種設計會導致接口臃…

React - createPortal

什么是createPortal&#xff1f;注意這是一個API&#xff0c;不是組件&#xff0c;他的作用是&#xff1a;將一個組件渲染到DOM的任意位置&#xff0c;跟Vue的Teleport組件類似。用法 import { createPortal } from react-dom;const App () > {return createPortal(<div…

Cursor的使用

Cursor的使用 Ctrl L 打開歷史對話記錄 Tab智能助手 1.單行/多行補全 已有代碼片段&#xff1a; //需求&#xff1a;寫一個工具類計算數組平均值 public class ArrayUtils {//按tab會完成補全 }按tab鍵- Cursor 自動生成代碼: //需求&#xff1a;寫一個工具類計算數組平均值 p…

17.使用DenseNet網絡進行Fashion-Mnist分類

17.1 DenseNet網絡結構設計import torch from torch import nn from torchsummary import summary #卷積層 def conv_block(input_channels,num_channels):netnn.Sequential(nn.BatchNorm2d(input_channels),nn.ReLU(),nn.Conv2d(input_channels,num_channels,kernel_size3,pad…

網安系列【16】之Weblogic和jboss漏洞

文章目錄一 Weblogic1.1 Weblogic相關漏洞1.2 Weblogic漏洞發現1.3 Weblogic漏洞利用二 Jboss2.1 Jboss漏洞2.2 Jboss識別與漏洞利用一 Weblogic WebLogic 是由 Oracle公司 開發的一款基于Java EE&#xff08;現稱Jakarta EE&#xff09;的企業級應用服務器&#xff0c;主要用…

Unity URP + XR 自定義 Skybox 在真機變黑問題全解析與解決方案(支持 Pico、Quest 等一體機)

在使用 Unity 的 URP 渲染管線開發 XR 應用&#xff08;如 Pico Neo、Pico 4、Quest 2/3 等一體機&#xff09;時&#xff0c;很多開發者遇到一個奇怪的問題&#xff1a;打包后&#xff0c;Skybox&#xff08;天空盒&#xff09;在某些角度下突然變黑&#xff0c;只在轉動頭部后…

Cursor、飛算JavaAI、GitHub Copilot、Gemini CLI 等熱門 AI 開發工具合集

Cursor&#xff1a;代碼編寫的智能伙伴?Cursor 是 Anysphere 公司推出的一款 AI 編程工具&#xff0c;它基于微軟開源代碼編輯器 VS Code 開發&#xff0c;將 AI 技術深度整合到開發人員的工作流程中。Cursor 的功能十分強大&#xff0c;不僅能夠自動用純英文編寫代碼&#xf…

如何安裝歷史版本或指定版本的 git

背景 有的時候&#xff0c;我們需要安裝指定版本的git&#xff0c;或者希望舊一點的&#xff0c;畢竟我就遇到最新的2.50.1在win10安裝后打開就一閃而過&#xff0c;而安裝2.49.1就不會 下載 官網可能比較難找&#xff0c;但是這個github倉庫&#xff1a;https://github.com/gi…

LaCo: Large Language Model Pruning via Layer Collapse

發表&#xff1a;EMNLP_FINDING_2024 機構&#xff1a;Shanghai Jiao Tong University 連接&#xff1a;LaCo: Large Language Model Pruning via Layer Collapse - ACL Anthology 代碼&#xff1a;https://github.com/yangyifei729/LaCo Abstract 基于 Transformer 的大語…

服務器內核級故障排查

目錄 **檢查內核級故障(Oops/Panic)的具體操作步驟****1. 查看完整 `dmesg` 日志(含時間戳)****2. 過濾關鍵錯誤信息****3. 檢查系統日志中的內核消息****4. 分析最近一次啟動的日志****5. 檢查是否有 `vmcore` 轉儲文件****常見內核錯誤示例及含義**補充說明:檢查內核級故…

Flink學習筆記:整體架構

開一個新坑&#xff0c;系統性的學習下 Flink&#xff0c;計劃從整體架構到核心概念再到調優方法&#xff0c;最后是相關源碼的閱讀。 今天就來學習 Flink 整體架構&#xff0c;我們先看官網的架構圖圖中包含三部分&#xff0c;分別是 Client、JobManager 和 TaskManager。其中…

【LeetCode 熱題 100】105. 從前序與中序遍歷序列構造二叉樹——(解法二)O(n)

Problem: 105. 從前序與中序遍歷序列構造二叉樹 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 【LeetCode 熱題 100】105. 從前序與中序遍歷序列構…

完美卸載 Ubuntu 雙系統:從規劃到實施的完整指南

&#x1f4d6; 前言 最近成功完成了一次 Ubuntu 雙系統的完整卸載&#xff0c;從最初的分區刪除到最終解決 GRUB 引導問題&#xff0c;整個過程雖然有些曲折&#xff0c;但最終完美解決。本文將詳細分享整個卸載過程&#xff0c;希望能幫助到有類似需求的朋友。 &#x1f3af…