理解虛擬 DOM:前端開發中的高效渲染利器

????????在前端開發中,我們經常聽到 虛擬 DOM(Virtual DOM) 這個概念。它是 React、Vue 等框架的核心機制之一,用來提升性能和簡化開發。那么,虛擬 DOM 到底是什么?為什么要用它?又是如何工作的呢?本文將帶你系統地理解虛擬 DOM。


??1.什么是 DOM

????????在瀏覽器中,DOMDocument Object Model 是 HTML 的結構化表示。它本質上是一棵樹,節點對應頁面上的元素。例如:

<div id="app"> <h1>Hello</h1> <p>World</p> </div>

對應的 DOM 樹大致是:

- div#app 
- h1 (Hello) 
- p (World)

????????DOM 提供了強大的 API,可以操作頁面。但缺點是:真實 DOM 操作非常昂貴,頻繁修改會導致頁面性能下降。


2.什么是虛擬 DOM

????????虛擬 DOM 并不是瀏覽器原生提供的,而是框架用 JavaScript 對象 來模擬 DOM 結構的一層抽象。比如上面的 HTML 可以用虛擬 DOM 表示為:

const vdom ={ 
type: 'div', 
props: { id: 'app' }, 
children: [ 
{ type: 'h1', props: {}, children: ['Hello'] }, 
{ type: 'p', props: {}, children: ['World'] } 
] 
};

可以看到:

  • type 表示標簽類型

  • props 存儲屬性(id、class 等)

  • children 表示子節點

這就是虛擬 DOM —— 真實 DOM 的一個輕量級 JS 對象副本


3.為什么需要虛擬 DOM?

  1. 提升性能

    1. 真實 DOM 操作慢:每次修改 DOM 都會引起回流(reflow)和重繪(repaint)。

    2. 虛擬 DOM 用 JS 對象計算變化,再一次性更新真實 DOM,減少開銷。

  2. 跨平臺

    1. 虛擬 DOM 不依賴瀏覽器 DOM,可以映射到不同平臺,如 小程序、原生移動端、服務端渲染 等。

  3. 聲明式 UI

    1. 開發者只需要描述“狀態”,框架通過虛擬 DOM 來決定“如何更新 DOM”。

  4. 中間層的作用

    1. 虛擬 DOM 作為 UI 與底層平臺之間的中間層,屏蔽了底層差異。開發者只需要操作統一的虛擬 DOM 層,框架可以根據平臺不同輸出到瀏覽器 DOM、原生組件或其他渲染目標,從而實現“一份代碼,多端運行”。


  1. 虛擬 DOM 的工作流程

虛擬 DOM 的核心機制是 Diff 算法 + Patch 過程

  1. 創建虛擬 DOM

    1. 初始渲染時,框架會把模板/JSX 轉換成虛擬 DOM。

  2. Diff 算法對比

    1. 當狀態改變時,生成新的虛擬 DOM。

    2. 對比新舊虛擬 DOM,找出差異。

  3. Patch 更新真實 DOM

    1. 僅更新有變化的部分,而不是整個頁面。

例如:

  • 初始:

    <p>Hello</p>

  • 更新后:

    <p>Hi</p>

虛擬 DOM 對比結果:只有 Hello → Hi 變了,于是只修改文本節點,而不是重新渲染整個 <p>


  1. React/Vue 中的虛擬 DOM

  • React:使用 React.createElement 或 JSX 生成虛擬 DOM。React16 之后引入 Fiber 架構,優化調度性能。

  • Vue 2:通過 render 函數生成虛擬 DOM。

  • Vue 3:借助 Proxy + 編譯優化,減少不必要的虛擬 DOM 對比,性能更強。


  1. 虛擬 DOM 的誤區

  2. 虛擬 DOM 并不總是比手動操作 DOM 快

    1. 少量節點操作時,直接操作 DOM 可能更快。

    2. 虛擬 DOM 優勢在于復雜應用中降低維護成本。

  3. 虛擬 DOM ≠ 必須

    1. Svelte 就是一個“無虛擬 DOM”框架,它通過編譯時優化,直接生成高效的 DOM 更新代碼。


  1. 總結

虛擬 DOM 的本質:

  • 用 JavaScript 對象來描述 UI

  • 通過 Diff 算法找到最小化更新路徑

  • 作為中間層屏蔽平臺差異,實現多端渲染

  • 高效、跨平臺地更新真實 DOM

它的意義不只是性能優化,更是讓前端開發以 聲明式編程 的方式進行,讓我們只關心“結果”,而不用關心“過程”。

未來,隨著編譯型框架的發展(如 Svelte、SolidJS),虛擬 DOM 可能不再是唯一的選擇,但在目前的生態下,它仍然是主流方案。

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

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

相關文章

GraphRAG數據可視化

GraphRAG數據可視化

vue/react項目如何跳轉到一個已經寫好的html頁面

如果是一個你copy的別人的網站&#xff0c;某些頁面是已經可以直接使用的&#xff0c;但是有些頁面需要在vue/react項目中重新二次調整加工&#xff0c;這個時候&#xff0c;就需要將html文件和vue/react項目結合&#xff0c;當某些頁面可以直接使用&#xff0c;就直接跳轉到這…

MYSQL-表的約束(下)

目錄 自增長 唯一鍵 外鍵 自增長 MySQL自增長&#xff08;Auto-Increment&#xff09; 是一種字段屬性&#xff0c;用于為表中的記錄自動生成唯一的連續整數&#xff0c;常作為主鍵或唯一標識字段使用&#xff0c;避免手動輸入重復值。 核心特性 1. 自動賦值&#xff1a…

《UE5_C++多人TPS完整教程》學習筆記44 ——《P45 傾斜與側向移動(Leaning And Strafing)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P45 傾斜與側向移動&#xff08;Leaning And Strafing&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&…

使用docker搭建嵌入式Linux開發環境

文章目錄1、前言2、安裝docker3、編寫容器管理腳本4、創建容器1、前言 在日常開發全志、rk等不同平臺時&#xff0c;大多數時候只有一個編譯主機&#xff0c;但不同sdk所需要的編譯環境可能不同。所以本文將記錄使用docker為每個平臺創建獨立的開發環境。 2、安裝docker # 1…

【開題答辯全過程】以基于Android的校園跳蚤市場交易系統的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【學習筆記】GB 42250-2022標準解析

隨著數字化轉型的加速推進和網絡安全威脅的日益復雜化&#xff0c;網絡安全專用產品作為保護關鍵信息基礎設施的第一道防線&#xff0c;其安全性和可靠性受到國家的高度重視。GB 42250-2022《信息安全技術 網絡安全專用產品安全技術要求》作為一項強制性國家標準&#xff0c;于…

QML開發踩坑記:從MVVM到QWidget的掙扎

如題&#xff1a;最近這一周在開發的時候被qml不友好的前端框架打敗了。首先&#xff0c;我沒深入&#xff08;系統的&#xff09;學習過前端的內容&#xff0c;就是在學習Qt的時候了解到了qwidget&#xff0c;后來發現美化不太足的樣子&#xff0c;外加AI十分推崇基于QML的MVV…

[Mysql數據庫] 知識點總結5

1. 什么是“最少權限原則”&#xff1f;答&#xff1a;應用最少權限原則就是僅為用戶授予高效地完成任務所需的權限&#xff0c;除此之外的任何權限均不能授 予&#xff0c;這可以降低用戶修改或查看&#xff08;無意或惡意&#xff09;他們無權修改或查看的數據的機率&#xf…

儲能變流器學習之MPPT

MPPT最大功率點追蹤技術詳解 引言 在可再生能源系統中&#xff0c;最大化能量捕獲效率是核心目標。無論是光伏發電系統還是儲能變流器&#xff08;PCS&#xff09;&#xff0c;最大功率點追蹤&#xff08;MPPT&#xff09; 技術都是實現這一目標的關鍵。本文將深入探討MPPT技術…

qData 數據中臺完整功能介紹 —— 商業版與開源版功能對比

一、qData 數據中臺概覽 在數字化轉型的大背景下&#xff0c;數據已經成為企業最核心、最具價值的資產。qData 數據中臺&#xff0c;作為企業數據治理與應用的關鍵平臺&#xff0c;憑借高性能與創新理念脫穎而出。它秉持 “高效、安全、靈活、開放” 的設計原則&#xff0c;致力…

Xshell 自動化腳本大賽技術文章大綱

一、引言1.1 大賽背景與意義介紹 Xshell 在運維、開發等領域的廣泛應用&#xff0c;強調自動化腳本對于提升效率、減少錯誤的重要性。闡述大賽旨在激發用戶創新&#xff0c;挖掘 Xshell 自動化腳本更多潛力&#xff0c;促進技術交流與共享。1.2 目標受眾明確文章面向熟悉基本 L…

Python 數據分析學習筆記:Pandas 邏輯運算

&#x1f539; DA9&#xff1a;2020年畢業且使用Java的用戶&#x1f4cc; 題目描述篩選出 2020年畢業 且 常用語言為 Java 的用戶&#xff0c;輸出他們的全部信息&#xff0c;并設置顯示選項以完整顯示數據。? 正確代碼import pandas as pd# 讀取數據 Nowcoder pd.read_csv(N…

圖像邊緣檢測

目錄 一.圖像邊緣檢測 1.圖像邊緣檢測概述 2.Sobel算子原理與實現 3.Scharr算子 4.Laplacian算子 5.Canny邊緣檢測&#xff08;重點&#xff09; 6.效果對比 一.圖像邊緣檢測 1.圖像邊緣檢測概述 2.Sobel算子原理與實現 代碼是實現步驟&#xff1a; 邊緣檢測是圖像處…

zookeeper-znode解析

一. 數據模型&#xff1a;ZK擁有一個命名空間就像一個精簡的文件系統&#xff0c;不同的是它的命名空間中的每個節點擁有它自己或者它下面子節點相關聯的數據。ZK中必須使用絕對路徑也就是使用“/”開頭。二. znode&#xff1a;zk目錄樹中每個節點對應一個znode。每個znode維護…

Redis 高可用篇

主從復制是怎么實現的&#xff1f; 如果服務器發生了宕機&#xff0c;由于數據恢復是需要點時間&#xff0c;那么這個期間是無法服務新的請求的&#xff1b;如果這臺服務器的硬盤出現了故障&#xff0c;可能數據就都丟失了。 要避免這種單點故障&#xff0c;最好的辦法是將數據…

C++ 指針與引用面試深度解析

C 指針與引用面試深度解析面試官考察指針和引用&#xff0c;不僅是考察語法&#xff0c;更是在考察你對C中 “別名” (Aliasing) 與 “地址” (Addressing) 這兩種間接訪問機制的理解&#xff0c;以及你對 “代碼安全” 和 “接口設計” 的思考深度。第一部分&#xff1a;核心知…

LinuxC語言線程的同步與互斥

一.線程的同步與互斥1. 基礎概念:1.1 互斥&#xff1a;對共享資源的訪問&#xff0c;同一時刻只允許一個訪問者進行訪問&#xff0c;互斥具有唯一和排他性&#xff0c;互斥無法保證對共享資源的訪問順序1.2 同步: 在互斥的基礎上&#xff0c;實現對共享資源的有序訪問。2. 互斥…

Centos 7.6離線安裝docker

在內網環境下&#xff0c;一般不能聯網在線部署&#xff0c;這時候就需要以離線的方式安裝docker。本節內容主要總結一下在CentOS 7.6環境中離線安裝docker的步驟。 1、下載docker安裝包 https://pan.baidu.com/share/init?surlPaUllQZ-dwpgJ7quA5IkcQ&pwd4sfc 2、上傳到服…

生成式推薦模型的長序列特征:離線存儲

文章目錄長序列特征的例子1. Event-level features2. Sequence-level featuresAggregation FeaturesSession-based FeaturesTemporal Order Features3. User-level features4. Interaction features (between user and item/context)how to store the long term user behaviro …