React css 解决方案对比

之前在写 react 时,我用过好几种的 css 解决方案。原生的 inline-style,经常用 ant-design 配套的 less,以及还用过 sass,和最近我经常用的 style-components,还有更多出名的 css 方案如 postcss 等等。

这一段里面主要涉及几个概念,css 预处理器css modulescss-in-js

less 和 sass 都是 css 预处理器,他们都是对原生 css 的增强,支持一些特性,如 css 嵌套、变量、屏蔽浏览器语法差异等等。 less 是将 .less 文件最终编译成 css 文件,在我们实际项目中还是得配合 css-loader 来使用 css-modules。

css-modules

A CSS Module is a CSSfile in which all class names and animation names are scoped locally by default.

css-in-js

CSS-in-JS refers to a collection of ideas to solve complex problems with CSS. Since it is NOT a particular library, different libs might solve a different subset of problems and use different approaches, depending on their implementation details.

每出一种新的方案必然是未了解决之前的痛点而生的,亦或者说每种新的 css 方案都有更适合自己的应用场景,所以要熟悉不同方案的差异,方便我们技术选型时选择适合我们自己的。

在此之前我们需要了解一下 css-modules,我最开始将 css-modules 概念和 css-in-js 概念混淆了。其实基本所有的 css-in-js 实现都实现了 css-modules。

css-modules

有四种 css-modules 整合方案,我主要用的是第一种:

  1. Webpack The css-loader has CSS Modules built-in. Simply activate it by using the ?modules flag. We maintain an example project using this at css-modules/webpack-demo.
  2. Browserify
  3. JSPM
  4. NodeJS
import React from "react";
import styles from "./table.css";

export default class Table extends React.Component {
  render() {
    return (
      <div className={styles.table}>
        <div className={styles.row}>
          <div className={styles.cell}>A0</div>
          <div className={styles.cell}>B0</div>
        </div>
      </div>
    );
  }
}
<!--render 之后的-->
<div class="table__table___32osj">
  <div class="table__row___2w27N">
    <div class="table__cell___1oVw5">A0</div>
    <div class="table__cell___1oVw5">B0</div>
  </div>
</div>;

css-in-js

css-in-js 的优点:

  • css-in-js 在 react 中有非常多的方案,所有的样式全部组件化,符合 react 的设计思想
  • code split 的时候能按照 js 逻辑分隔,不用额外的 css 分隔
  • webpack 能减少一堆 css 相关的 loader

原生

原生的方案就是 inline-style,将样式写在一个 JavaScript object 里面,唯一的好处就是在 style 写法的基础上 value 可以使用变量。

styled-components

styled-components 所有语法都是标准 css 语法,同时支持 scss 嵌套等常用语法,覆盖了所有 css 场景。 更适合组件库使用,比如我经常用的 antd 还需要额外的在 webpack 里面配置 css-loader。 最终样式编译存放在 <style></style> 标签里面。

styled-jsx

参考

React 拾遗:从 10 种现在流行的 CSS 解决方案谈谈我的最爱

results matching ""

    No results matching ""