Shadow DOM在React.js中是否像Virtual DOM一样快?

Hmo*_*omH 77 dom web-component shadow-dom virtual-dom

在我的项目中实现Shadow DOM会使它们像React使用的虚拟DOM一样快吗?

Gün*_*uer 111

虚拟DOM

虚拟DOM是关于避免对DOM进行不必要的更改,这在性能上是昂贵的,因为对DOM的更改通常会导致重新呈现页面.Virtual DOM还允许同时收集要应用的多个更改,因此并非每次更改都会导致重新呈现,而是仅在对DOM应用一组更改后重新呈现一次.

影子DOM

Shadow dom主要是关于实现的封装.单个自定义元素可以实现或多或少复杂的逻辑,并结合或多或少的复杂DOM.可以通过导入将任意复杂度的整个Web应用程序添加到页面中,<body><my-app></my-app>但也可以将更简单的可重用和可组合组件实现为自定义元素,其中内部表示隐藏在阴影DOM中<date-picker></date-picker>.

样式封装 Shadow DOM也是为了防止样式被意外地应用于设计者不想要的元素,例如因为您使用的CSS或组件库改变了现在应用于使用相同CSS类名的其他元素的选择器.添加到组件的样式将限定为该组件,并防止出现样式或样式.

影子DOM和性能

尽管影子DOM首先与性能无关,但它也具有性能影响.因为样式是作用域的,所以浏览器可以对某些更改进行假设,以仅影响页面的有限区域(自定义元素的阴影DOM),这可以限制重新渲染到此类组件的区域,而不是重新渲染整个页面.

这就是原因>>>,/deep/::shadowCSS组合程序,这使得跨影子DOM边界应用样式,已过时,受到从Chrome很快删除(其他浏览器永远得不到据我所知).仅仅存在这些组合器就可以防止前一段中提到的那种优化.

Angular2利用两个世界的优势.

它使用单向数据流并仅在模型上运行更改检测.如果检测到变化它会导致DOM通过更新绑定更新,并作出这样结构的指令*ngFor,*ngIf...更新DOM.因此,DOM仅在模型实际更改时更新.

Angular2使用shadow DOM(ViewEncapsulation.Native目前不是默认值)来利用浏览器提供的样式封装功能,或者(当前默认)只是通过重写添加到组件的样式来模拟样式封装,作为一种解决方法直到本机shadow DOM和CSS变量(用于动态全局样式更改)变得广泛可用.

  • ......而DOM并不慢.你是.https://korynunn.wordpress.com/2013/03/19/the-dom-isnt-slow-you-are/ (6认同)
  • 我认为 @GünterZöchbauer 试图解释的是,这有点像苹果与橘子之间的对比:shadow DOM 会让项目更快吗?经常是的。就像 React 中的虚拟 DOM 一样?不,他们做不同的事情。DOM 更改可能会触发昂贵的重新渲染。缓冲虚拟 DOM 中的更改并将其一次性标记到真实 DOM 上有助于实现这一目标,还有其他好处。Shadow DOM 不会屏蔽或批量浏览器的更改。它像私有类一样封装了树的分支。这限制了处理范围(因此具有更好的性能)并具有重要的安全(和逻辑)优势 (2认同)

lux*_*lux 61

不,Shadow DOM和Virtual DOM是不相关的,虽然有点类似名称:

虚拟DOM:由于差异原因,反应保留DOM的两个副本(原始和更新)的概念.在渲染之前,React会对两个对象进行区分,以确定它是否应该将更新应用于实际的DOM树.这导致性能提升,因为我们只更新需要它的视图部分,而不是整个屏幕.

Shadow DOM: W3C提出的Web组件规范的一部分,它基本上允许将较小的DOM元素和CSS样式封装到单个DOM元素中:

Shadow DOM元素示例

<video width="300" height="150" />
Run Code Online (Sandbox Code Playgroud)

但是,<video>实际上封装了以下元素:

<div>
   <input type="button" style="color: blue;">Play
   <input type="button" style="color: red;">Pause
   <source src="myVideo.mp4">
</div>
Run Code Online (Sandbox Code Playgroud)

因此,通过使用Shadow DOM,我们能够隐藏web元素的实现细节,并且只将必要的信息传递给子元素(即height,width),这可能令人困惑,非常类似于传递props给组件的ReactJS习惯用法.

提供的信息:

  • @Hmoo_oomH 我的理解是,Shadow DOM 更多的是为了可读性——因为我们将复杂 Web 元素的实现细节隐藏在高阶元素(例如`&lt;video&gt;`)后面,但不期望性能提升。 (3认同)