样式组件与 SASS (SCSS) 或 LESS

IT技术 css reactjs sass styled-components reflow
2021-04-10 23:14:44

我遇到了一个 ReactJS Boilerplate,它有很好的代表并且是社区驱动的。样式部分更多地强调样式化组件 CSS,但从未停止切换到传统的 CSS 样式方法。尽管这引起了我的兴趣,是什么让 Styled-Component CSS 脱颖而出以及为什么需要采用它。

我对样式化组件 CSS 的理解

  1. 组件驱动的理念。您的 CSS 现在也是一个组件。-这很酷!
  2. 加载你需要的东西,当你需要的时候,有点懒惰的 CSS
  3. 主题提供者、皮肤、module化和动态 - 这也可以通过其他库来实现
  4. 组件 DOM 及其样式的服务器端构建。

我的问题是:

  1. 浏览器进化为将 CSS 与 Javascript 解析分开来解析,为什么我们试图偏离这一点而将所有内容都放在 Javascript 中?

  2. Styled-component CSS 将其 javascript 库发送到客户端,它实际上在运行时解析样式,并<style />在每个组件按需加载时放入标签。这意味着额外的负载和逻辑最终会影响浏览器的执行周期。为什么需要这个?

    (上面的问题我的意思是对于每个加载的组件,通过style标签/多个样式标签 - 重新发明 CSS 解释器计算、创建和插入相应的 CSS

  3. <style />在 head 标签中连续计算的样式文本是否会导致浏览器回流/重绘?

  4. 我从中获得了哪些性能优势?

  5. 使用附加库/选项,例如用于动态类名的Post-CSSSCSS 类名散列,这几乎解决了每个人所说的问题。为什么还是SC?

社区,如果我错了,请为我清除空气或纠正我。


一些关于重绘或 DOM 重排的好文章,当 CSS 样式被修改时,浏览器的性能开销如何。

2个回答

我已经使用SCSS( SASS) 多年了,并且还Styled-Components用于一些项目,一些大型项目。

我喜欢两者,Styled-Components对我来说,感觉就像向前迈出了一步:

样式化组件 - 优点

  1. 完全造型隔离;防止在团队中工作时潜在的错误,当一个团队成员永远不能覆盖另一个团队成员的风格时。(除非多个地方共享相同的样式组件)
  2. 无需手动处理类名,因为它们会自动生成(恕我直言,选择名称的组件比类名更容易)
  3. 我发现JSX文件本身中使用CSS更容易(多年来反对我的判断)

  4. 在样式中轻松使用 javascript 变量(消除对 2 组主题变量的需要)

样式组件 - 缺点

  1. 每个样式组件都是另一个包装函数,许多样式组件意味着更多的功能,这意味着效率较低,因为所有代码都需要“编译”等等。
  2. 最大的缺点:对样式的更改需要重新编译包,并且应用程序的状态可能会重置。

只能在某些情况下而不是全部情况下这样看待缺点。


SCSS/LESS优点可以被视为与上面列出的缺点相反,同时还有一些缺点,例如在使用变量时混合和更快的开发(恕我直言)。定义局部选择器变量可能会变得“丑陋”:

比较这些简化的例子:

SCSS 例子:

.icon{
  $size: '20px';
  width: $size;
  height: $size;
  margin-left: $size/2;
}

Styled-Components 本地范围示例:

const Icon = styled.i(props => {
  const size = 20; // easier to use Number instead of String for calculations 
  return `
    width: ${size}px;
    height: ${size}px;
    margin-left: ${size/2}px;
`});

显然,变量可以在Icon样式化包装器之外定义,然后在内部使用,但这不会使其孤立,因为样式化组件 CSS 可能由样式化的子组件组成,看起来更像 CSS:

const Header = styled.header`
   > ul{
     ...
   }

   li{
     ...
   }

   img{...}

   navigation{...}
`

并非总是希望将每个单独的 HTML 元素提取到其自己的样式组件中。它主要用于在应用程序中重复或可能重复的组件。

关于SASS混合,它们可以转换为javascript函数,所以这里SASS没有太大的优势。

总体而言,使用 Styled-Components 既有趣又容易,但有一个副作用,即样式和框架/组件之间的耦合更紧密,而且显然会造成一些性能损失(实际上并不会减慢您的速度,但仍然如此)。

在这篇文章中写了更多关于使用 Styled-Components 的高级变量
2021-06-21 23:14:44

浏览器进化为将 CSS 与 Javascript 解析分开来解析,为什么我们试图偏离这一点而将所有内容都放在 Javascript 中?

当您混合使用 Javascript 和 HTML(即 JSX),然后混合使用 CSS(JSS 或其他)时,您将组件变成一个适合单个文件的可靠module。您不再需要将样式保存在单独的文件中。

然后,功能魔法发生了:由于 JSX 是返回“HTML”的原始数据的纯函数(不是真的),同样的方式 CSS-in-JS 是返回“CSS”的纯函数或原始数据(也不是真的) )。从这一点来看,我认为关于 JSXCSS-in-JS 都值得一

Styled-component CSS 将其 javascript 库发送到客户端,它实际上在运行时解析样式,并<style />在每个组件按需加载时放入标签。这意味着额外的负载和逻辑最终会影响浏览器的执行周期。

不仅在运行时。因为 CSS-in-JSS 只是一个返回 CSS 的数据函数,所以你可以在任何平台上使用它。以 Node 为例,添加SSR,然后您将style元素在响应正文中传递给浏览器,因此解析就像在传递 CSS 的原始情况下发生的那样。

为什么需要这个?

因为它在开发中很方便,就像 React 或 Redux 一样,就像 jQuery 一样,就像任何其他 lib 一样,它以网络负载和浏览器性能为代价。

你拿图书馆是因为它解决了一个问题。如果似乎没有问题,为什么要使用库,对吗?

<style />在 head 标签中连续计算的样式文本是否会导致浏览器回流/重绘?

这么多的事情,力回流

浏览器很聪明。如果样式没有改变,他们甚至不会尝试重新粉刷。这并不意味着他们不计算差异,这会消耗 CPU 时间。

对样式(重新)计算的范围和复杂性有一个很好的介绍,非常值得阅读以更深入地了解该主题。

因为方便。因为开发人员和开发人员的时间成本高于优化。因为如果继续坚持下去,性能瓶颈无疑会得到解决。因为浏览器只会变得更快、更智能。因为在未来,我们都将只通过网络加载程序,我们将探索软件生态系统,而不是网站。因为您需要覆盖全局样式规则才能与众不同。我不知道。我就是不知道。但正如@Fleischpflanzerl 所说,如果该库不能为您解决问题,请不要使用它。
2021-05-28 23:14:44
imo jsx与虚拟 DOM 齐头并进,这是性能上的胜利。Styled-component 我真的很喜欢它的 Javascript 驱动和编写在js 中的部分,在开发时编写CSS 变得很酷,但我不能权衡我的最终性能。连续式爆炸会导致不必要的回流。浏览器解析静态 CSS 树,您不必在运行时担心其余部分,只需处理模型、逻辑的 JS 和屏幕上可视化数据表示的 JSX。在运行时设计这些视觉元素的样式是不需要的,除非需要。
2021-06-12 23:14:44
@brokenthorn 那么我想你需要完整阅读这篇动机文章 ( styled-components.com/docs/basics#motivation ) 文章,其中清楚地说明了styled-components 是想知道我们如何增强 CSS 以React 组件系统中设置样式的结果行的开始。当然,他们的目标是增强 CSS
2021-06-13 23:14:44
@brokenthorn 我不反对任何库,但我的观点是这个库比 SASS OR LESS 更值得使用,它针对与 Styled Components 相同的问题陈述
2021-06-16 23:14:44
不,他们没有。SASS/LESS 旨在修复仍然是... CSS 的 CSS。SC 是封装的 HTML 和 CSS 片段。CSS 不再级联,您也不需要整个 CSS 框架。
2021-06-16 23:14:44