关于 CSS-in-JS 的不同观点

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

有些人完全讨厌 CSS-in-JS 的想法。仅仅这个名字就令人反感。坚决反对。样式不属于 JavaScript,它属于 CSS,一个已经存在并且浏览器对其进行了优化的东西。关注点分离。其他任何做法都是可笑的错误,是没能从过去的错误中吸取教训的标志(比如 <font> 标签等等)。

有些人完全喜欢 CSS-in-JS 的想法。模板和功能的同处一地,就像大多数 JavaScript 框架一样,对他们来说已经证明是成功的,所以将样式包裹起来似乎很自然。Vue 的 单文件组件 就是一个典型例子。

这里有一个视频 关于 CSS-in-JS,是我和 Dustin Schau 一起做的,如果你需要入门的话。)

Brent Jackson 认为你绝对应该学习它,但也提出了一些关于它能做什么和不能做什么的实用观点。

CSS-in-JS 能做什么?

  • 允许你用 JavaScript 语法编写 CSS
  • 将样式与组件放在一起
  • 利用原生 JS 语法特性
  • 利用 JS 生态系统中的任何东西

CSS-in-JS *不能*让你不必理解什么

  • 样式如何应用到 DOM
  • 继承是如何工作的
  • CSS 属性是如何工作的
  • CSS 布局是如何工作的

CSS-in-JS 并不能免除你学习 CSS 的责任。至少大部分情况下是这样的。

我听说过 很多 关于 CSS-in-JS 的 反对意见,诸如“你们这些人之所以使用 CSS-in-JS 是因为你们不懂 CSS”或者“你们这样做是因为你们害怕级联。我已经知道如何为 CSS 设定作用域了”。我发现这些言论更像是跨过通道的指指点点,并不是特别有用。

Laura buns 有一篇非常棒的两面性文章,标题为 “没有网络的网络”,其中一部分是关于 React 和 CSS-in-JS 的。

我讨厌 React,因为它默认的 CSS-in-JS 方法鼓励你编写完全自包含的一次性组件,而不是尝试将网站 UI 作为一个整体构建。

你不需要仅仅因为使用 React 就使用 CSS-in-JS,但它很流行,这是一个非常有趣且公平的批评。如果你为所有内容设定作用域,是不是会让自己面临更高的不一致性风险?

到目前为止,我一直是 CSS 模块的粉丝,因为它在 CSS-in-JS 中尽可能地轻量级,*只*处理作用域和同处一地,仅此而已。我将其与 Sass 一起使用,这样我们就可以访问帮助保持一致性的 mixin 和变量,但我可以理解它如何可能导致过于依赖一次性组件的危险境地。

然而,它们将是一次性的可丢弃组件。可代码分割的一次性组件。一切都在平衡中存在。

Laura 接着说她喜欢 CSS-in-JS 方法提供的一些强大功能和灵活性。

我喜欢 CSS-in-JS 的方式,它提供了足够的抽象,让你仍然可以使用像盲目猫头鹰选择器这样的技巧,同时也能让你充分利用 JS 的强大功能来做一些事情,比如容器查询。

Martin Hofmann 创建了一个比较 BEM 和 Emotion 的网站,它查看了一个小的“警报”组件。我喜欢它是一个没有感情(字面意思,不是指库)的比较,它查看了语法。BEM 有一些优势,尤其是不需要任何工具并且可以轻松地共享到任何 Web 项目中。但 Emotion 的方法在许多方面都更简洁,并且看起来更容易处理。

我希望看到更多关于这些技术的没有感情的比较。选项 A 在这三件事上做得很好,但在那里和那里很痛苦,而选项 B 在其他事情上做得很好,并解决了其他一些痛点。

我们最近 链接了 Scott Jehl 的文章,该文章探讨了异步加载 CSS 的问题。Scott 的开场白是

为了提高页面性能和弹性,我们可以做的最有影响力的事情之一就是以一种不会延迟页面渲染的方式加载 CSS。

值得注意的是,全面的 CSS-in-JS 方法可以自然地获得这种能力,因为样式被捆绑到 JavaScript 中。它是以成本为代价捆绑的。对性能的成本。但是,如果我们消除了其他阻塞渲染的事情,我们就可以收回一些成本。这很有趣,至少值得更多的数据。

我可能会因为这个被痛批,但我对试图将 CSS-in-JS 归咎于提高行业入门门槛的讨论不太感兴趣。这是一个需要认真考虑的大问题,但我们并不是在谈论关闭 CSS 并强迫每个人使用其他语言。我们谈论的是针对特定类型项目和特定规模的利基库。

我认为,如果你… 那么值得看看 CSS-in-JS 的想法。

  • 无论如何,你都在处理一个组件繁重的 JavaScript 项目。
  • 你已经在将模板、功能和数据查询放在一起。
  • 你认为你可以在不损害用户体验的情况下利用它,比如在其他地方获得速度提升。
  • 你的团队对所需的技术感到满意,也就是说,你没有排斥人才。

Max Stoiber 是一个毫不掩饰的粉丝。他在这个主题上的文章 谈到了这种风格给他带来的信心以及他节省查找所需内容的时间,这两件事我发现都是真的。但他也认为这种方法专门针对 JavaScript 框架应用程序。

如果你正在使用 JavaScript 框架构建一个带有组件的 Web 应用程序,那么 CSS-in-JS 可能是一个不错的选择。特别是如果你所在的团队中的每个人都理解基本的 JavaScript。

我很想在评论中听到你们的看法。你是否已经想通了所有这些问题?疯狂地爱着?咬牙切齿地讨厌?我非常有兴趣听到真实项目中的成功案例或失败案例。