ShadowDOM的坑
CSS 隔离问题
- 可继承 ShadowDOM提供了样式隔离, 但是 ShadowDOM 还是会继承外部 Document Body 定义的可继承
style
, 可以使用all: initial
隔离 - 组件库 组件库的样式可能由于 CSS 隔离无法被应用
- Tailwind 等基于
rem
的 CSS 解决方案 由于rem
是可继承的, 因此, Tailwind 中的相对值都会应用最外部的rem
- 可继承 ShadowDOM提供了样式隔离, 但是 ShadowDOM 还是会继承外部 Document Body 定义的可继承
open & close
- 如果将模式设置为
open
, 那么主文档可以通过访问组件的.shadowRoot
属性来访问组件内部的 ShadowDOM, 这意味着开发者可以在主文档中修改组件内部的代码. - 如果将模式设置为
close
, 那么主文档将无法通过.shadowRoot
属性访问组件内部的 ShadowDOM.
因此, 当我们在
closed
模式的 ShadowDOM 中使用了某些组件库, 这些组件库如果没有在 ShadowDOM 内部的监听, 那么这些监听大概率会失效- 如果将模式设置为
事件冒泡被重定向
为了保护内部 Element 不被外部获取, 当事件触发冒泡时, 外部 EventHandler 无法获取到内部 target, 例如下面例子中两个按钮分别在 closed 与 open ShadowDOM, 但是外部的 onClick 获取到的 target 都是被重定向后的 Container
CSP 问题
ShadowDOM 内部的元素依然遵守外部 document 定义的 CSP 规则, 无法通过 meta 修改 CSP