真实节点、虚拟节点与影子节点的区别
本文将深入介绍真实节点、虚拟节点与影子节点是如何协同工作共同创建一个高性能的文档对象模型。
DOM
(Document Object Module
文档对象模型)正如它所描述的那样。网站的 HTML
树由一个名为document
的对象表示。在这个对象中,有一个 HTML
树元素的模型,可以通过document.xxx
方便地访问。
document.head
将返回<head></head>
树的部分,document.body
将返回<body></body>
树的部分,依此类推。- 您还可以使用
document.xxx
的方法来操作DOM
。例如:document.body.style.background = 'red'
将正文的背景颜色更改为红色。
这个 DOM
被称为页面的真实 DOM
。真正的 DOM
本身只能在每次 DOM
发生更改时同时更新整个 DOM
。这使得页面更新变得非常缓慢且昂贵。这就是虚拟 DOM
能诞生的缘故。
虚拟DOM
是真实 DOM
的虚拟表示。该虚拟 DOM
保存在内存中并与真实 DOM
同步。React
等库将真实的 DOM
编译成 Javascript
对象,这是创建更高性能更新的第一步。然后,虚拟 DOM
制作其自身的副本(我们将其称为虚拟 DOM 2
)。当页面上进行更新时,它首先应用于虚拟 DOM 2
。React
然后将虚拟 DOM 2
与原始虚拟 DOM
(真实 DOM
的精确副本)进行比较。React
使用这种比较来快速检测真实 DOM
需要更新的位置,并仅更新这些元素而不是整个 DOM
。这就是神奇的地方,只更新需要更新的内容会更快。
如果我们想查看虚拟 DOM
的运行情况,可以在 Google Chrome
的检查工具中通过Paint flashing
功能查看可视化表示:
选中该框,然后使用该页面,任何 DOM
更改都将用绿色框突出显示。
最后大家比较少听到的就是shadow dom
(影子节点),这允许隐藏的 DOM
树附加到常规 DOM
树中的元素。可以使用Web API创建自定义元素,这些元素仅由影子 DOM
控制。重要的是要记住,真实 DOM
和影子 DOM
是有界限。真实节点和影子节点之间的界限可以通过以下几种方式跨越:
-
可继承的样式、
-
CSS
属性 -
Constructable Stylesheets特性
-
:part
(:theme
并非所有浏览器都支持)样式 -
如果我们在检查工具中调试查看
HTML
元素,并且在页面上正确查看时没有看到列出的内容,那么它可能位于影子DOM
中。最好的例子是视频播放器。在页面上,您可以直观地看到内部UI
:播放按钮、跳过按钮等,但在真实DOM
中看不到它。它由Shadow DOM
控制。
尽管影子节点可能难以捉摸,但如果我们需要的话,实际上是可以显示影子节点!在 Google Chrome
的检查工具中:转到设置,选择首选项,然后转到元素部分。选择Show user agent shadow DOM
以在检查工具的“元素”选项卡中与真实节点一起显示任何影子节点。