React 的样式化组件 vs jss vs 情感

Posted

技术标签:

【中文标题】React 的样式化组件 vs jss vs 情感【英文标题】:Styled-component vs jss vs emotion for React 【发布时间】:2019-04-18 07:08:21 【问题描述】:

我试图了解(作为 CTO)之间的最佳选择

jss 情感 样式化组件。

我会尽量不要让这个问题“太宽泛”或“离题”,因为这是一个非常主观的话题。如果没有人回答整个问题,我会尝试自己回答(在这里)这个问题,我会问非常封闭的问题:

他们三个如何“编译成”(外部css、<style>标签、style=属性)? 他们三个如何才能与 CRA 顺利集成(无需过多调整且无需弹出)? OpenSource POV(年龄、社区、插件、支持)怎么样? 性能怎么样?

请我不希望这个问题结束,所以我不想要一些代码风格的意见,我想避免主观的 POV。

【问题讨论】:

这是我第一次听说jssemotion。样式组件似乎越来越受欢迎 备案 JSS 已被materialUI采用 @theFreedomBanana 并且在 v5 中一直是 deprecated。我很困惑为什么,我喜欢 JSS,material-ui 使用它的方式允许我在不知道它们的 DOM 结构的情况下定位组件的内部。我爱它。不过,我敢肯定,这一定是有原因的。 【参考方案1】:

一个非常简短的答案(一般来说还有很多)

    CSS 模板字符串

SC 在运行时使用 CSS 解析模板字符串。 Emotion 有一个 babel 插件,可以以一种可以在运行时更快地呈现最终 CSS 的格式准备这些解析的东西。 JSS 目前只支持basic template strings,否则使用对象(有计划增加对模板字符串的更好支持)

    更新样式规则

当你更新动态样式时,SC 和 Emotion 会生成新的 CSS 规则,JSS 会更新现有规则(注意你可以在开发工具的样式选项卡中看到更新的规则,但在样式标签中看不到):reproduction

    对 React 的依赖

SC 只是反应。 Emotion 有一种可以在没有反应的情况下使用的语法(css``)。 JSS 有单独的包:jss(核心,无反应),react-jss(HOC 注入类),styled-jss(SC 类 API)。

    插件

目前只有 JSS 支持插件。

    静态提取

    目前只有 Emotion 支持完全静态提取。 JSS 也在努力。 如果您将样式放入单独的文件(something.styles.js)并使用 webpack 插件提取它们(虽然没有动态值),那么您现在可以使用 JSS 进行静态提取。

    性能

http://necolas.github.io/react-native-web/benchmarks/

    它们都使用样式标签生成实际的 CSS。

【讨论】:

AFAIK,如果你正在编写一个 lib,那么 styled-components 应该被列为 peerDependencies,你知道 styled-jss 是否也是这种情况?【参考方案2】:

正如上面的答案,我也没有听说过jss和emotion。可能是因为它们与 React 结合起来并不常见。我自己使用过常规 CSS、内联样式、CSS 模块以及现在最新的样式化组件。

我喜欢 Styled 组件,因为它易于使用。所以回答(部分)你的问题是。

    参见图片。这就是它与 Styled Components 一起编译的方式。它创建了独特的类。 不需要弹出。只需从 npm 导入并使用 认为它变得越来越流行,社区似乎也喜欢它。总是有不同的意见,也有很多人不喜欢在组件中混合样式和 JS 代码。 确实没有检查性能,但似乎很快。 =)

【讨论】:

只想提一下,在 1) 使用 babel-plugin 样式化组件可以使类名看起来更好,你甚至可以使用这个插件而不使用 babel 宏从 cra 中弹出.只需包含 styled-components/macro。

以上是关于React 的样式化组件 vs jss vs 情感的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在另一个 JSS 样式的组件中定位嵌套的 JSS 样式的组件? [JSS-nested/Styled-JSS/Material UI (React)]

如何使用 JSS 为没有类的输入标签设置样式

在 react 中用情感为 props 传递的组件设置样式

如何在 material-ui 样式/JSS 中选择 id?

情感风格的组件和 React.forwardRef 不能一起工作

React 测试库:测试样式(特别是背景图片)