CSS-in-JS 的碎片化但不断演变的状态

Avatar of Ollie Williams
Ollie Williams

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

TLDR: CSS-in-JS 社区已融合到一致的 API 中。

不久前,一位 Facebook 工程师整理了可用 CSS-in-JS 方法的清单。它并不短

aphrodite, babel-plugin-css-in-js, babel-plugin-pre-style, bloody-react-styled, classy, csjs, css-constructor, css-light, css-loader, css-ns, cssobj, cssx-loader, cxs, electron-css, emotion, es-css-modules, freestyler, glamor, glamorous, hiccup-css, hyperstyles, i-css, j2c, jsxstyle, linaria, nano-css, pre-style, radium, react-css-builder, react-css-components, react-css-modules, react-cssom, react-fela, react-free-style, react-inline-css, react-inline-style, react-inline, react-jss, react-look, react-native-web, react-statics-styles, react-styl, react-style, react-styleable, react-stylematic, react-theme, react-vstyle, reactcss, restyles, scope-styles, smart-css, stile-react-media-queries, stilr, stylable, style-it, styled-components, styled-jsx, styletron-react, styling, superstyle, typestyle, uranium

这样一个碎片化的生态系统远非理想。您应该选择哪一个(如果有)?

导致 Javascript 疲劳 - 您最多只需要一个。也可以随意不学习任何一个。

GitHub 星星是一个有用的指标

然而,GitHub 星星并不能说明项目的轨迹 - 也许它们是在很久以前积累的,而该仓库此后已不受欢迎或不再维护。Glamor 有很多未解决的问题,并且一年多来都没有提交。它的作者建议

…它大部分有效,我不会做任何重大更改…如果您需要更现代的东西,我建议使用 emotion,它与 glamor 的 api 大致相同,并且得到了积极维护。

名称相似的 Glamorous 最近已弃用,其作者也建议用户切换到 Emotion

当时,Emotion 拥有一些 Styled Components 没有的功能。从那以后,Styled Components 做了一些重大宣布。

Styled Components 将自己定位为喜欢 CSS 的人的 CSS-in-JS 库。Styled Components 通过利用标记模板文字而广受欢迎 - 允许开发人员以他们已经熟悉的相同语法*编写 CSS*,但在 JavaScript 文件中。虽然这已被证明很受欢迎,但一些开发人员更喜欢[将样式写成JavaScript 对象. Emotion 提供了灵活性 - 开发人员可以选择如何编写他们的样式。Styled Components 最终也随之效仿。

Emotion 还提供了一个css 属性,而 Styled Components 以前没有,直到…

竞争的 CSS-in-JS 库相互借鉴,直到拥有相同的特性集和相同的语法 - Emotion 和 Styled Components 拥有几乎相同的 API。曾经看起来像是一堆竞争的方法和库的混乱现在感觉有点稳定。即使 CSS-in-JS 还没有在依赖项上标准化,它现在已经标准化了一种做事方式 - 只是实现方式不同

Styled Components 是迄今为止最受欢迎的 CSS-in-JS 库,但 Emotion 的使用率正在迅速增长。

https://npmcharts.com/compare/glamor,aphrodite,radium,glamorous,styled-components,jss,emotion?interval=30

两者都被一些大型公司使用。Styled Components 被许多大型公司使用,包括彭博社、Atlassian、Reddit、Target、BBC 新闻、赫芬顿邮报、Coinbase、Patreon、Vogue、Ticketmaster、乐高、InVision 和 Autodesk,仅举几例。

Emotion 拥有较少的知名名称,但最近被纽约时报采用。


虽然这些库似乎确实在 React 用户中最为流行,但它们可以与其他框架一起使用。虽然它们似乎最终融合了相同的特性,但很难说这是否是CSS-in-JS 的终点,或者我们是否会从这里看到持续的演变。