【问题标题】:CSS In JS vs Shadow DOMJS 中的 CSS 与 Shadow DOM
【发布时间】:2018-07-23 07:36:33
【问题描述】:

Web 组件使用 shadow dom 进行样式封装。从规范中您知道 shadow root 内的样式是局部作用域的。当您多次实例化同一个 web 组件时,会对内存产生什么影响?例如:您将自定义按钮 Web 组件实例化 10 次。

例子

#Shadow-root
<style>
.outer {
  border: 2px solid brown;
  border-radius: 1em;
  background: red;
  font-size: 20pt;
  width: 12em;
  height: 7em;
  text-align: center;
}
.inner {
  color: white;
  font-family: sans-serif;
  padding: 0.5em;
}
.name {
  color: black;
  background: white;
  font-family: "Marker Felt", cursive;
  font-size: 45pt;
  padding-top: 0.2em;
}
</style>
<div/>

我可能会导入 style.css 或像上面那样放置一些内联的东西。自定义元素可能有道具,并且基于道具,组件行为会不断变化。现在,如果这样的组件重复 50 次,那么我会看到内联样式也会重复 50 次。浏览器是否在实例之间进行任何优化?

如果样式被重复,那么 js 中的 css 不是比 shadow dom 更好的封装解决方案吗?您可以使用一个不错的 jss 生成插件来真正优化整个 dom 中使用的 css。

【问题讨论】:

标签: shadow-dom jss


【解决方案1】:

如果样式被重复,那么js中的css不是比shadow dom更好的解决方案吗?

无论 CSS 全局放置在何处或在 Shadow DOM 内,它始终应用于所有 DOM 树(因此复制到所有匹配的 DOM 元素)。

当你多次实例化同一个 webcomponent 时,会对内存产生什么影响?

所以我怀疑使用唯一的全局 CSS 标签会优化任何东西。至少发生 50 次时不会。也许是的,有数百人。

它还取决于浏览器的实现,因此非常依赖于供应商,并且可能会随着新浏览器版本的发布而变化。

=> 我只能建议您测试/基准测试您的特定用例。

【讨论】:

  • 在我给出的示例中,样式标签内容为 20 行......这是一个相对较小的组件。但有些组件可以承载 100 到 500 行的样式。例如:一些 ant-design 输入组件样式.. 这不是使 dom 膨胀吗?我不需要在 css-in-js 中使用唯一的类名。
  • 也许吧,但它并不特定于自定义元素和影子 dom。每个 html 元素都是如此:CSS 样式应用于每个元素。为了优化样式渲染,您最好专注于 CSS 样式的良好实践,即:选择一些生成最少重新计算的规则。这不是大小问题,而是质量问题:-/
  • 也许我必须更具体一些。 js 1 输入控件样式中的 css 为 500 行 css 。 10 个输入控件样式 = 500 行。但是在 shadow dom 1 输入控件中使用内联样式 =500 行。 10 个输入控件 = 10 * 500 = 5000 行。对浏览器性能没有影响吗?对于带有阴影 dom 和内联样式的 web 组件,浏览器是否需要更多地理解 4950 行?
  • 消耗 CPU 的不是解析 5000 行 CSS 代码,而是重新计算设计糟糕的复杂 CSS 布局,不管有没有 Shadow DOM。
  • 我认为这里的重点不是关于好 css 或坏 css 。我的问题是关于技术的,技术方法正在增加的开销。
猜你喜欢
  • 2017-06-20
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2014-05-23
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多