在我目前的angular 7应用程序中,我们正在努力处理库中的组件,这需要一些CSS资源。我们不希望将这些资源应用于所有其余的应用程序,而是应用于一个特定的组件,其子代和孙代。

在我们的研究中,我们发现了以下两个有趣的选择:

encapsulation: ViewEncapsulation.Native

和:
encapsulation: ViewEncapsulation.ShadowDom

结果,他们俩似乎都使用浏览器的影子dom实现。

这些选择之间有什么区别?

最佳答案

几天前,这一直困扰着我,然后我意识到他们会收敛一点,但不能完全收敛。实际上,差异之处在于 the newer version of shadowDOM (v1) 。您可以在angular的代码源中看到 here ,他们为 ViewEncapsulation.ShadowDom 添加了另一个条件:


 case ViewEncapsulation.Native:
 case ViewEncapsulation.ShadowDom:
      return new ShadowDomRenderer(this.eventManager, this.sharedStylesHost, element, type);


     if (component.encapsulation === ViewEncapsulation.ShadowDom) {
          this.shadowRoot = (hostEl as any).attachShadow({mode: 'open'});
        } else {
          this.shadowRoot = (hostEl as any).createShadowRoot();
        }

因此, ViewEncapsulation.ShadowDom 是向 ShadowDOM V1 添加支持的步骤,并且可能弃用 ViewEncapsulation.Native ,如 here: 所述

09-25 12:52