首页 > 其他分享 >Real DOM 和 Virtual DOM 的区别?

Real DOM 和 Virtual DOM 的区别?

时间:2024-06-21 13:59:52浏览次数:10  
标签:Real 真实 DOM Virtual 重绘 React 虚拟 节点

一、是什么

Real DOM,真实 DOM,意思为文档对象模型,是一个结构化文本的抽象,在页面渲染出的每一个结点都是一个真实 DOM 结构,Virtual Dom,本质上是以 JavaScript 对象形式存在的对 DOM 的描述

创建虚拟 DOM 目的就是为了更好将虚拟的节点渲染到页面视图中,虚拟 DOM 对象的节点与真实 DOM 的属性一一照应

React 中,JSX 是其一大特性,可以让你在 JS 中通过使用 XML 的方式去直接声明界面的 DOM 结构

// 创建 h1 标签,右边千万不能加引号
const vDom = <h1>Hello World</h1>; 
// 找到 <div id="root"></div> 节点
const root = document.getElementById("root"); 
// 把创建的 h1 标签渲染到 root 节点上
ReactDOM.render(vDom, root); 

上述中,ReactDOM.render() 用于将你创建好的虚拟 DOM 节点插入到某个真实节点上,并渲染到页面上

JSX 实际是一种语法糖,在使用过程中会被 babel 进行编译转化成 JS 代码,上述 VDOM 转化为如下:

const vDom = React.createElement(
  'h1',
  { className: 'hClass', id: 'hId' },
  'hello world'
)

可以看到,JSX 就是为了简化直接调用 React.createElement() 方法:

  • 第一个参数是标签名,例如 h1、span、table…

  • 第二个参数是个对象,里面存着标签的一些属性,例如 id、class 等

  • 第三个参数是节点中的文本

通过 console.log(VDOM),则能够得到虚拟 VDOM 消息

所以可以得到,JSX 通过 babel 的方式转化成 React.createElement 执行,返回值是一个对象,也就是虚拟 DOM

二、区别

两者的区别如下:

  • 虚拟 DOM 不会进行排版与重绘操作,而真实 DOM 会频繁重排与重绘
  • 虚拟 DOM 的总损耗是“虚拟 DOM 增删改+真实 DOM 差异增删改+排版与重绘”,真实 DOM 的总损耗是“真实 DOM 完全增删改+排版与重绘”

以前文章举过的例子:

传统的原生 apijQuery 去操作 DOM 时,浏览器会从构建 DOM 树开始从头到尾执行一遍流程

当你在一次操作时,需要更新 10 个 DOM 节点,浏览器没这么智能,收到第一个更新 DOM 请求后,并不知道后续还有 9 次更新操作,因此会马上执行流程,最终执行 10 次流程

而通过 VNode,同样更新 10 个 DOM 节点,虚拟 DOM 不会立即操作 DOM,而是将这 10 次更新的 diff 内容保存到本地的一个 js 对象中,最终将这个 js 对象一次性 attachDOM 树上,避免大量的无谓计算

三、优缺点

真实 DOM 的优势:

  • 易用

缺点:

  • 效率低,解析速度慢,内存占用量过高
  • 性能差:频繁操作真实 DOM,易于导致重绘与回流

使用虚拟 DOM 的优势如下:

  • 简单方便:如果使用手动操作真实 DOM 来完成页面,繁琐又容易出错,在大规模应用下维护起来也很困难

  • 性能方面:使用 Virtual DOM,能够有效避免真实 DOM 数频繁更新,减少多次引起重绘与回流,提高性能

  • 跨平台:React 借助虚拟 DOM,带来了跨平台的能力,一套代码多端运行

缺点:

  • 在一些性能要求极高的应用中虚拟 DOM 无法进行针对性的极致优化
  • 首次渲染大量 DOM 时,由于多了一层虚拟 DOM 的计算,速度比正常稍慢

参考文献

标签:Real,真实,DOM,Virtual,重绘,React,虚拟,节点
From: https://blog.csdn.net/weixin_50367873/article/details/139802472

相关文章

  • Web渗透:XSS-DOM-based XSS
    DOM-basedXSS(基于DOM的跨站脚本攻击)是一种XSS攻击类型,其特点是恶意脚本通过操作文档对象模型(DOM)直接在客户端执行,而无需经过服务器的处理。这种攻击主要利用客户端JavaScript代码中的漏洞,使得攻击者能够在浏览器中注入并执行恶意代码。DOM的基本概念文档对象模型(DOM,Document......
  • VirtualBox Ubuntu 22.04 Server联网、与主机互联
    使用VirtualBox7.0安装了两个Ubuntu22.04Server虚拟机,想要实现:主机与虚拟机互联虚拟机之间互联,且互联的IP应为静态虚拟机可以联网解决方法每个虚拟机配置两个虚拟网卡:一个为桥接网络模式,用于联网以及与主机互联一个为仅主机模式,用于配置静态IP并实现虚拟机之间互联......
  • JavaScript之DOM
    DOMDOM,全称DocumentObjectModel文档对象模型。JS中通过DOM来对HTML文档进行操作。只要理解了DOM就可以随心所欲的操作WEB页面,改变页面的内容、结构、样式。文档文档表示的就是整个的HTML网页文档对象对象表示将网页中的每一个部分都转换为了一个对象(通过修改对象去修......
  • 虚拟DOM与DOM diff
    虚拟DOM什么是虚拟DOM一个能代表DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其它属性。有关DOM的谣言DOM操作慢,而虚拟DOM快?这句话无异于说刘翔比姚明矮。DOM操作慢是相对于JS原生API,如数组操作。任何基于DOM的库(Vue/React)都不可能在操作DOM时......
  • JQuery基础28_DOM操作3
    一、属性内容操作1、html():获取/设置元素的标签体内容 <a><font>内容</font></a>--><font>内容</font>2、text():获取/设置元素的标签体纯文本内容<a><font>内容</font></a>-->内容3、val():获取/设置元素的value属性值<!DOCTYPEhtml>......
  • javaScript获取dom元素的常见方法
    前端开发都知道在react、vue等框架没问世之前,开发人员要实现用户对网页元素进行操作时,其中就包括dom元素的选择,不可避免的就是要获取到目标元素再接着编写功能代码。废话少说让我们来看看javaScript获取dom元素的常见方法元素js获取dom元素的方法常有以下几种:1.两个......
  • vscode create python project virtual environment
     python3-mvenvvenvpipinstallrequests   #encoding:utf-8#版权所有2024涂聚文有限公司#许可信息查看:#描述:python3-mvenvvenv#pipinstallrequests#pipinstallboost###Author:geovindu,GeovinDu涂聚文.#IDE:vscodep......
  • Unreal RecastNavigation 开源项目详解
    0前言Recastnavigation是一个游戏AI导航库,像Unity,UE引擎中都集成了这个开源项目,HALO中使用的也是这个开源库。导航最重要的就是为NPC寻路,以及其他的寻路需求。需要注明的是,这个寻路库虽然厉害。但是他的核心是平面寻路。也就是重力方向一直朝着-Y方向。如果是星球地形,既重......
  • 西门子学习笔记12 - BYTE-REAL互相转化
    这是针对于前面MQTT协议的接收和发送数组只能是BYTE数组做出的对应的功能块封装。1、BYTE-REAL转化1、把byte数组转成字符串形式2、把字符串转成浮点数2、REAL-BYTE转化1、把浮点数转成字符串2、把字符串转成Byte数组......
  • 搭建Python虚拟环境(二):venv和virtualenv
    下面继续详细介绍各种创建虚拟环境的方式使用venv创建Python虚拟环境在Python开发中,虚拟环境是一个非常重要的概念。它允许我们为每个项目创建独立的环境,这样可以避免不同项目之间的依赖包冲突。venv是Python用于创建虚拟环境的标准库之一。本文将详细介绍如何使用v......