gpt4 book ai didi

dom - Shadow DOM 是否像 React.js 中的 Virtual DOM 一样快?

转载 作者:IT王子 更新时间:2023-10-29 02:49:09 29 4
gpt4 key购买 nike

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

最佳答案

它们是不同用途的不同事物,因此比较性能没有意义。

虚拟 DOM

虚拟 DOM 旨在避免对 DOM 进行不必要的更改,这在性能方面代价高昂,因为对 DOM 的更改通常会导致页面重新呈现。 Virtual DOM 还允许收集要同时应用的多个更改,因此并非每个更改都会导致重新渲染,而是在将一组更改应用到 DOM 后重新渲染只会发生一次。

影子 DOM

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

样式封装Shadow DOM 还可以防止样式被意外应用到设计者不打算应用的元素,例如,因为您正在使用的 CSS 或组件库更改了一个选择器,该选择器现在应用到使用相同 CSS 类名的其他元素。添加到组件的样式限定在该组件范围内,防止样式渗出或渗入。

Shadow DOM 和性能

尽管 shadow DOM 首先与性能无关,但它也具有性能影响。因为样式是有范围的,所以浏览器可以假设某些更改只影响页面的有限区域(自定义元素的影子 DOM),这可以将重新渲染限制在此类组件的区域,而不是重新渲染整个页面。

这就是 >>> 的原因, /deep/ , 和 ::shadow允许跨影子 DOM 边界应用样式的 CSS 组合器已被弃用,并且很快就会从 Chrome 中删除(其他浏览器从未有过它们 AFAIK)。这些组合器的存在阻止了上一段中提到的那种优化。

Angular2 利用了两个世界的优势。

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

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

关于dom - Shadow DOM 是否像 React.js 中的 Virtual DOM 一样快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36012239/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com