????????在前端開發中,我們經常聽到 虛擬 DOM(Virtual DOM) 這個概念。它是 React、Vue 等框架的核心機制之一,用來提升性能和簡化開發。那么,虛擬 DOM 到底是什么?為什么要用它?又是如何工作的呢?本文將帶你系統地理解虛擬 DOM。
??1.什么是 DOM
????????在瀏覽器中,DOM(Document 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?
提升性能
真實 DOM 操作慢:每次修改 DOM 都會引起回流(reflow)和重繪(repaint)。
虛擬 DOM 用 JS 對象計算變化,再一次性更新真實 DOM,減少開銷。
跨平臺
虛擬 DOM 不依賴瀏覽器 DOM,可以映射到不同平臺,如 小程序、原生移動端、服務端渲染 等。
聲明式 UI
開發者只需要描述“狀態”,框架通過虛擬 DOM 來決定“如何更新 DOM”。
中間層的作用
虛擬 DOM 作為 UI 與底層平臺之間的中間層,屏蔽了底層差異。開發者只需要操作統一的虛擬 DOM 層,框架可以根據平臺不同輸出到瀏覽器 DOM、原生組件或其他渲染目標,從而實現“一份代碼,多端運行”。
虛擬 DOM 的工作流程
虛擬 DOM 的核心機制是 Diff 算法 + Patch 過程:
創建虛擬 DOM
初始渲染時,框架會把模板/JSX 轉換成虛擬 DOM。
Diff 算法對比
當狀態改變時,生成新的虛擬 DOM。
對比新舊虛擬 DOM,找出差異。
Patch 更新真實 DOM
僅更新有變化的部分,而不是整個頁面。
例如:
初始:
<p>Hello</p>
更新后:
<p>Hi</p>
虛擬 DOM 對比結果:只有 Hello → Hi
變了,于是只修改文本節點,而不是重新渲染整個 <p>
。
React/Vue 中的虛擬 DOM
React:使用
React.createElement
或 JSX 生成虛擬 DOM。React16 之后引入 Fiber 架構,優化調度性能。Vue 2:通過
render
函數生成虛擬 DOM。Vue 3:借助 Proxy + 編譯優化,減少不必要的虛擬 DOM 對比,性能更強。
虛擬 DOM 的誤區
虛擬 DOM 并不總是比手動操作 DOM 快。
少量節點操作時,直接操作 DOM 可能更快。
虛擬 DOM 優勢在于復雜應用中降低維護成本。
虛擬 DOM ≠ 必須
Svelte 就是一個“無虛擬 DOM”框架,它通過編譯時優化,直接生成高效的 DOM 更新代碼。
總結
虛擬 DOM 的本質:
用 JavaScript 對象來描述 UI
通過 Diff 算法找到最小化更新路徑
作為中間層屏蔽平臺差異,實現多端渲染
高效、跨平臺地更新真實 DOM
它的意義不只是性能優化,更是讓前端開發以 聲明式編程 的方式進行,讓我們只關心“結果”,而不用關心“過程”。
未來,隨著編譯型框架的發展(如 Svelte、SolidJS),虛擬 DOM 可能不再是唯一的選擇,但在目前的生態下,它仍然是主流方案。