解决在 Next.js 中使用 Styled Components 遇到的问题

阅读时长 9 分钟读完

在 React 中,使用 CSS-in-JS 库 Styled Components 是非常流行的。它可以让我们在组件中编写 CSS,使得组件的样式更加清晰可见,同时也更容易维护。

然而,在使用 Next.js 这样的服务器渲染框架时,我们可能会遇到一些问题,比如不能正确的注入 CSS 样式,导致页面在加载的一瞬间没有样式,给用户带来不好的体验。本文将探讨这些问题,并提供解决方案。

问题描述

在 Next.js 中使用 Styled Components 时,我们需要按照官方文档的指导在 _app.js 中引入 styled-components 并创建 ThemeProvider,以便在组件中使用后者提供的 styled API。

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

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

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

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

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

然而,在 Next.js 中,由于页面的渲染是在服务器端完成的,因此在第一次加载页面时,由于服务器端和客户端使用了不同的 CSS-in-JS 实例,可能会发生 CSS 样式未被正确注入的情况,从而导致页面在加载的一瞬间没有样式。

解决方案

为了解决这个问题,我们需要使用 styled-components 提供的 ServerStyleSheet。 它是一个用于收集组件样式的辅助类,可用于将样式注入到服务器的 HTML 中。下面是解决方案的详细步骤。

安装依赖

首先,我们需要安装 styled-components 包和 babel-plugin-styled-components 包,后者用于优化样式注入。

安装和配置 next-plugin-styled-components

我们还需要安装 next-plugin-styled-components 包,在 Next.js 应用中使用它来完成样式注入。

然后在 next.config.js 文件中配置插件,以便正确地处理样式和其他相关内容。

修改 _app.js

现在我们可以将 ServerStyleSheet 添加到 _app.js 中,并在页面渲染之前收集样式。这样一来,就可以确保样式在第一次加载时得到注入。

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

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

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

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

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

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

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

如上所示,我们使用 ServerStyleSheet 创建了一个 sheet 对象,并使用 originalRenderPage 函数修改 ctx.renderPage,把 <App /> 组件转换成 sheet.collectStyles(<App {...props} />) 的形式。

最后,我们将样式注入到 HTML 中,代码如下所示。

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

现在,我们再次加载页面时,组件中的样式应该已经被正确注入了。

示例代码

下面是一个简单的 Next.js 和 Styled Components 示例代码,用于演示如何在 Next.js 中使用 Styled Components。

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

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

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

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

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

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

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

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

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

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

总结

在本文中,我们了解了在 Next.js 中使用 Styled Components 遇到的一些常见问题,并提供了解决方案。对于以后的开发工作,我们可以非常方便地在 Next.js 中使用 CSS-in-JS 库 Styled Components 来创建漂亮的样式,同时也能保证页面加载时的样式正确注入,从而提升用户体验。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e9f358f6b2d6eab351b029

纠错
反馈