利用 Babel 优化 React 项目中的 CSS-in-JS

在 React 项目中,我们通常使用 CSS-in-JS 的方式来管理组件的样式,其中最流行的库莫过于 styled-components 了。但是,由于 styled-components 生产出来的 CSS 样式是 inline 的,会产生一些性能问题。那么如何优化这个问题呢?我们可以借助 Babel 的插件对 styled-components 进行处理。

styled-components 的性能问题

styled-components 默认会把生成的 CSS 样式嵌入到每个组件创建的标签内,导致每次组件渲染时都要进行样式注入,从而降低渲染效率。

举个例子,假设我们有两个同样的组件:

------ ----- ---- --------
------ ------ ---- --------------------

----- ------ - --------------
  -------- ---- -----
  ----------------- -----
  ------ -----
  -------------- ----
  ------- -----
--

------ ------- -------- ----- -
  ------ -
    -----
      ------------- ------------
      ------------- ------------
    ------
  --
-

利用 Chrome 开发者工具的 Performance 面板可以看到,页面每次渲染都会重复生成一遍样式。

这个问题还会随着项目规模的增大而愈发明显。

利用 Babel 优化

因此,我们需要想办法把样式提取出来,然后在全局中引用,从而减少重复的样式生成。这里介绍一种基于 Babel 的解决方案。

我们可以使用 Babel 插件来替换掉 styled-components 的默认行为,在组件渲染时注入统一的 CSS 类名。这样,我们就可以把样式提取到全局了,并避免了无谓的样式注入。

下面是具体的实现步骤。

安装依赖

首先,我们需要安装两个必要的依赖:

--- ------- ---------- ------------------------------ ------------ ----------

其中,babel-plugin-styled-components 是我们要用到的 Babel 插件,style-loadercss-loader 则是处理样式文件的 Webpack loader。

配置 Babel 插件

在 Babel 配置文件 .babelrc 中添加插件,同时把 styled-components 换成 @emotion/styled,因为 @emotion/styled 的性能优化更好。

-
  ---------- -
    -
      ---------------------------------
      -
        ----------- ------
        -------------- ------
        --------- -----
        ---------------------------- -----
        ------- ----
      -
    -
  -
-

修改 Webpack 配置

在 Webpack 配置文件中添加 style-loadercss-loader

-------------- - -
  ------- -
    ------ -
      -
        ----- ----------
        ---- ---------------- --------------
      --
    --
  --
--

组件中使用全局样式

重新编写组件,使用全局样式。

------ ----- ---- --------
------ ------ ---- ------------------

----- ----- - ----------
  ------ ----
--

----- ------ - --------------
  -------- ---- -----
  ----------------- -----
  ------ -----
  -------------- ----
  ------- -----
--

-- ----
------ --------------

------ ------- -------- ----- -
  ------ -
    -----
      --------------------
      ------- ------------------------------- ------------
      ------- ------------------------------- ------------
    ------
  --
-

注意到这里我们添加了一个名为 custom-button 的 CSS 类名,用于对应全局样式。

编写全局样式

在项目根目录下创建一个名为 index.css 的文件,添加样式:

-------------- -
  -------- ---- -----
  ----------------- -----
  ------ -----
  -------------- ----
  ------- -----
-

运行项目

重新运行项目,可以看到 Chrome 开发者工具的 Performance 面板中,每个组件只会生成一遍样式。

这里我们可以看到,优化后的性能表现有了很大的提升。

结论

本文介绍了如何借助 Babel 优化 React 项目中的 CSS-in-JS。我们利用 Babel 插件对 styled-components 进行处理,使得组件在渲染时只需要添加注入一个统一的 CSS 类名,而不是每次都生成一遍重复的样式。这样,我们就可以把样式提取到全局,并避免了无谓的样式注入,从而显著提升组件渲染的性能。

如果你也在处理类似的性能问题,不妨试试这个方法。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672f0485eedcc8a97c8c04b7