React 與 Vue 虛擬 DOM 實現原理深度對比:從理論到實踐

在現代前端開發中,React 和 Vue 作為最流行的兩大框架,都采用了虛擬 DOM(Virtual DOM)?技術來優化渲染性能。虛擬 DOM 的核心思想是通過 JavaScript 對象模擬真實 DOM,減少直接操作 DOM 的開銷,從而提高頁面渲染效率。

盡管 React 和 Vue 都使用虛擬 DOM,但它們的實現方式、優化策略和適用場景存在顯著差異。本文將深入探討兩者的異同,并結合代碼示例分析其底層機制,幫助開發者更好地理解并選擇合適的框架。

1. 虛擬 DOM 的基本概念

1.1 什么是虛擬 DOM?

虛擬 DOM 是一個輕量級的 JavaScript 對象,用于描述真實 DOM 的結構。例如:

// 虛擬 DOM 示例
const vdom = {type: 'div',props: { className: 'container' },children: [{ type: 'h1', props: {}, children: 'Hello World' },{ type: 'p', props: {}, children: 'This is a virtual DOM.' }]
};

1.2 虛擬 DOM 的工作流程

  1. 生成虛擬 DOM:組件渲染時,框架生成新的虛擬 DOM 樹。

  2. Diff 對比:比較新舊虛擬 DOM 樹的差異(Diff 算法)。

  3. Patch 更新:僅將變化的部分應用到真實 DOM(避免全量渲染)。

2. React 的虛擬 DOM 實現

2.1 JSX 與虛擬 DOM 生成

React 使用?JSX?描述 UI,JSX 會被 Babel 轉換為?React.createElement?調用,生成虛擬 DOM:

// JSX 代碼
const element = <div className="container">Hello React</div>;// 編譯后
const element = React.createElement('div',{ className: 'container' },'Hello React'
);

2.2 Diff 算法(React Reconciliation)

React 采用?雙端 Diff 算法(React 16+ 引入?Fiber 架構),核心優化策略:

  • 同級比較:只比較同一層級的節點,減少遞歸深度。

  • Key 優化:列表更新時,key?幫助 React 識別哪些元素可以復用。

示例:列表 Diff

// 沒有 key 時,React 可能低效更新
<ul>{items.map(item => <li>{item}</li>)}
</ul>// 使用 key 優化
<ul>{items.map(item => <li key={item.id}>{item.text}</li>)}
</ul>

2.3 更新機制

React 默認采用?全量 Diff,即父組件更新會導致所有子組件重新渲染,除非手動優化:

  • React.memo(函數組件)

  • shouldComponentUpdate(類組件)

// 使用 React.memo 避免不必要的渲染
const MemoComponent = React.memo(({ data }) => {return <div>{data}</div>;
});

2.4 Fiber 架構

React 16 引入?Fiber,將 Diff 過程拆分為可中斷的小任務,避免長時間阻塞主線程。

3. Vue 的虛擬 DOM 實現

3.1 模板編譯與虛擬 DOM

Vue 使用?模板語法(或 JSX),在編譯階段優化虛擬 DOM 生成:

<!-- Vue 模板 -->
<template><div class="container"><h1>Hello Vue</h1><p>{{ message }}</p></div>
</template>

編譯后,Vue 會生成?render?函數:

// 編譯后的 render 函數
function render() {return h('div', { class: 'container' }, [h('h1', null, 'Hello Vue'),h('p', null, this.message)]);
}

3.2 Diff 算法優化

Vue 的 Diff 算法在 React 的基礎上進一步優化:

  • 靜態節點提升:編譯時標記靜態節點,Diff 時直接跳過。

  • 動態節點標記(patchFlag):僅對比動態變化的節點。

示例:靜態節點優化

<template><div><h1>Static Title</h1>  <!-- 靜態節點,僅首次渲染 --><p>{{ dynamicText }}</p>  <!-- 動態節點,Diff 時對比 --></div>
</template>

3.3 響應式驅動的更新

Vue 的虛擬 DOM 與?響應式系統?深度集成,數據變化時自動觸發更新:

export default {data() {return { count: 0 };},methods: {increment() {this.count++; // 自動觸發虛擬 DOM 更新}}
};

3.4 細粒度更新

Vue 3 的?composition API?進一步優化更新粒度:

import { ref } from 'vue';export default {setup() {const count = ref(0);return { count }; // 只有 count 變化時,相關組件才更新}
};

4. React vs Vue 虛擬 DOM 對比

4.1 虛擬 DOM 生成方式

框架描述方式編譯優化
ReactJSX(全量生成)無優化
Vue模板(靜態分析)靜態節點提升、動態標記

4.2 Diff 算法

框架Diff 策略優化手段
React雙端 Diff + Fiber 調度依賴?key?手動優化
Vue雙端 Diff + 靜態標記自動跳過靜態節點

4.3 更新粒度

框架更新方式優化方法
React組件級(全量 Diff)React.memouseMemo
Vue組件級(響應式驅動)自動依賴追蹤

4.4 適用場景

  • React:適合需要精細控制渲染邏輯的大型應用(如復雜交互、狀態管理)。

  • Vue:適合快速開發、追求開箱即用優化的項目(如企業后臺、電商頁面)。

5. 性能實測對比

5.1 初始渲染速度

  • Vue 通常更快(靜態節點提升減少 Diff 計算)。

  • React 需要手動優化(如?React.memo)。

5.2 列表更新效率

// React:依賴 key 優化
{items.map(item => <Item key={item.id} data={item} />)}// Vue:自動優化,但仍推薦 key
<template v-for="item in items" :key="item.id"><Item :data="item" />
</template>

5.3 高頻更新場景

  • Vue 的響應式系統通常更高效(自動追蹤依賴)。

  • React 需要結合?useMemouseCallback?優化。

結論

對比維度ReactVue
虛擬 DOM 生成JSX(全量)模板(靜態優化)
Diff 算法雙端 Diff + Fiber雙端 Diff + 靜態標記
更新機制手動優化(memo)自動依賴追蹤
適用場景復雜交互、狀態管理快速開發、企業應用

最終建議

  • 如果你喜歡靈活控制渲染邏輯,選擇?React

  • 如果你希望減少手動優化,選擇?Vue

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

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

相關文章

WordPress AI 原創文章自動生成插件 24小時全自動生成SEO原創文章 | 多語言支持 | 智能配圖與排版

為什么選擇Linkreate AI內容生成插件&#xff1f; ? 全自動化工作流程 - 從關鍵詞挖掘到文章發布一站式完成 ? 多語言支持 - 輕松覆蓋全球市場&#xff08;中/英等多語種&#xff09; ? 智能SEO優化 - 自動生成搜索引擎友好的內容結構 ? AI智能配圖 - 每篇文章自動匹配高質…

GPU加速-系統CUDA12.5-Windows10

誤區注意 查看當前系統可支持的最高版本cuda&#xff1a;nvidia-smi 說明&#xff1a; 此處顯示的12.7只是驅動對應的最高版本&#xff0c;不一定是 / 也不一定需要是 當前Python使用的版本。但我們所安裝的CUDA版本需要 小于等于它&#xff08;即≤12.7&#xff09;因此即使…

IOT項目——DIY 氣象站

開源項目&#xff1a;ESP32 氣象站 作者&#xff1a;GiovanniAggiustatutto 原文鏈接&#xff1a;原文 開源項目&#xff1a;太陽能 WiFi 氣象站 V4.0 作者&#xff1a;opengreenenergy 原文鏈接&#xff1a;原文 DIY 氣象站 簡介1-制版2-物料 溫度設備塔風向標風速計雨量計框…

5G助力智慧城市的崛起——從概念到落地的技術實踐

5G助力智慧城市的崛起——從概念到落地的技術實踐 引言&#xff1a;智慧城市中的“隱形脈絡” 隨著城市化的快速推進&#xff0c;傳統的城市管理方式已經難以滿足人口增長和資源優化的需求。智慧城市的概念應運而生&#xff0c;通過技術創新實現智能化、可持續發展的城市生態…

【Linux】web服務器的部署和優化

目錄 nginx的安裝與啟用--/usr/share/nginx/html默認發布目錄 nginx的主配置文件--/etc/nginx/nginx_conf nginx的端口 nginx默認發布文件--index.html nginx默認發布目錄 nginx的訪問控制 基于IP地址的訪問控制 基于用戶認證的訪問控制 nginx的虛擬主機--/etc/nginx/…

結合五層網絡結構講一下用戶在瀏覽器輸入一個網址并按下回車后到底發生了什么?

文章目錄 實際應用第一步&#xff1a;用戶在瀏覽器輸入 www.baidu.com 并按下回車1. 瀏覽器觸發域名解析&#xff08;DNS查詢&#xff09; 第二步&#xff1a;DNS請求的逐層封裝與傳輸1. 應用層&#xff08;DNS協議&#xff09;2. 傳輸層&#xff08;UDP協議&#xff09;3. 網絡…

深入理解N皇后問題:從DFS到對角線優化

N皇后問題是一個經典的算法問題&#xff0c;要求在NN的棋盤上放置N個皇后&#xff0c;使得它們互不攻擊。本文將全面解析該問題的解法&#xff0c;特別聚焦于DFS算法和對角線優化的數學原理。 問題描述 在NN的國際象棋棋盤上放置N個皇后&#xff0c;要求&#xff1a; 任意兩個…

Java面試場景篇:分布式鎖的實現與組件詳解

互聯網大廠Java求職者面試&#xff1a;分布式鎖的實現與組件 在一場緊張而又充滿挑戰的面試中&#xff0c;Java架構師馬架構正面對著一位經驗豐富的面試官。以下是他們之間關于分布式鎖實現方式及相關問題的對話。 第一輪提問 面試官&#xff1a;請介紹一下分布式鎖的概念。…

關于使用 讀光-文字檢測-DBNet行檢測模型-中英-通用領域,版本問題

關于使用 讀光-文字檢測-DBNet行檢測模型-中英-通用領域&#xff0c;版本問題 pip install modelscopeSuccessfully installed certifi-2025.4.26 charset-normalizer-3.4.1 colorama-0.4.6 idna-3.10 modelscope-1.25.0 requests-2.32.3 tqdm-4.67.1 urllib3-2.4.0 pip insta…

刷刷刷刷刷RCE

云曦歷年考核 25年春開學考 RCCCE 開啟題目進行代碼審計 GET傳參傳入一個參數cmd&#xff0c;但對參數內容給了黑名單進行過濾 $blacklist /bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|"|\>|\<|\%|\$/i; ls、cat等都…

2024江西ICPC部分題解

題目列表 A - Maliang Learning PaintingC - LiarG - Multiples of 5H - ConvolutionJ - Magic MahjongK - Magic Tree A - Maliang Learning Painting 題目來源&#xff1a;A - Maliang Learning Painting 思路分析 這是個簽到題&#xff0c;直接輸出abc即可 #include<b…

Pytorch圖像數據轉為Tensor張量

PyTorch的所有模型&#xff08;nn.Module&#xff09;都只接受Tensor格式的輸入&#xff0c;所以我們在使用圖像數據集時&#xff0c;必須將圖像轉換為Tensor格式。PyTorch提供了torchvision.transforms模塊來處理圖像數據集。torchvision.transforms模塊提供了一些常用的圖像預…

為什么vllm能夠加快大模型推理速度?

vLLM加速大模型推理的核心技術原理可分解為以下關鍵創新點&#xff1a; 一、?內存管理革命&#xff1a;PagedAttention? KV Cache分頁機制? 將傳統連續存儲的KV Cache拆分為非連續內存頁&#xff0c;類似操作系統內存分頁管理&#xff0c;消除內存碎片并實現動態分配。13B…

第十一章 多態

多態是面向對象開發過程中一個非常重要的概念。 11.1 多態概述 11.1.1 什么是多態 多態&#xff08;polymorphism&#xff09;&#xff0c;從字面理解是“多種形態&#xff0c;多種形式”&#xff0c;是一種將不同的特殊行為泛化為當個特殊記號的機制。 多態從實現的角度可劃…

RNN——循環神經網絡

一.基本結構 1.目標&#xff1a;處理序列數據&#xff08;時間序列&#xff0c;文本&#xff0c;語音等&#xff09;&#xff0c;捕捉時間維度上的依賴關系 核心機制&#xff1a;通過隱藏狀態&#xff08;hidden State&#xff09;傳遞歷史信息&#xff0c;每個時間步的輸入包…

性能提升手段--池化技術

看到hadoop代碼里有ByteBufferPool,使用池子來避免頻繁創建、銷毀ByteBuffer,減輕GC壓力,提高性能。 順便總結一下池化技術 一、什么是池化技術??? ??池化(Pooling)?? 是一種資源管理策略,通過??預先創建并復用資源??(如數據庫連接、線程、內存對象等)來提…

數據安全和合規性市場分析

一、什么是數據安全和合規性 在數據安全和合規性方面&#xff0c;存在著一系列重要的法律、法規和行業標準&#xff0c;這些規定了組織如何收集、存儲、處理和保護個人數據及其他敏感信息。企業之所以要遵守這些規定&#xff0c;是出于多方面的考量&#xff0c;既有法律責任&a…

【每日八股】復習計算機網絡 Day4:TCP 協議的其他相關問題

文章目錄 昨日內容復習已經建立了 TCP 連接&#xff0c;客戶端突然出現故障怎么辦&#xff1f;什么時候用長連接&#xff1f;短連接&#xff1f;TCP 的半連接隊列與全連接隊列&#xff1f;什么是 SYN 攻擊&#xff1f;如何避免&#xff1f;TIME_WAIT 的作用&#xff1f;過多如何…

React:<></>的存在是為了什么

1. <></> 是什么&#xff1f; <></> 是 React 的Fragment&#xff08;片段&#xff09;語法糖&#xff0c;等價于 <React.Fragment></React.Fragment>。 2. 它的作用 主要作用&#xff1a; 允許你在組件里返回多個元素&#xff0c;而不需…

cron定時任務

cron定時任務 一、Cron表達式的定義 基礎結構 Cron表達式是由空格分隔的6或7個字段組成的字符串&#xff0c;格式為&#xff1a; 秒 分 時 日 月 星期 [年]其中&#xff0c;年通常可以被省略 字段說明&#xff1a; 秒&#xff08;0-59&#xff09; 秒字段表示每分鐘的哪一…