Next.js 中使用 styled-components 遇到的坑

阅读时长 10 分钟读完

在前端开发中,样式是一个必不可少的元素。而随着 React 的兴起,styled-components 这个新兴的样式库也逐渐成为了前端开发中不可或缺的一部分。Next.js 是一款 React 的服务端渲染框架,而使用 styled-components 进行样式设计时也会遇到一些坑,本文将会介绍这些坑以及如何优雅地避免他们。

坑点一:样式闪动

Next.js 的服务端渲染模式与客户端渲染模式之间的转换通常会导致样式闪动问题,这是因为客户端渲染时需要请求资源,因此界面在加载时需要一段时间,这段时间内元素可能会处于未渲染状态,从而项目加载完毕后出现样式变化的情况。

解决方法:我们可以使用styled-components提供的 ServerStyleSheet 类,在服务端生成样式可以避免这个问题,同时这也是 styled-components 推荐的做法。

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

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

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

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

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

这里,我们使用了 ServerStyleSheet 类和 BeforeDocument,我们把所有样式都应用到Body之前。这样,我们就可以避免样式闪动的问题。

坑点二:页面渲染时间

Next.js 通常都有较快的服务端渲染性能,但是当我们同时使用 styled-components 时,它可能会增加页面渲染时间,从而降低性能,提升用户体验。

解决方法:我们可以通过使用 styled-components 中提供的 babel-plugin-styled-components插件,将样式文件进行优化,减少页面加载时间,提高整体性能优化。

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

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

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

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

这样我们就可以减少页面加载时间,提高整体性能优化。

坑点三:服务端渲染样式

在 Next.js 服务端渲染样式需要我们编写一个 decorators 文件来实现服务端渲染,因为服务端CSS也需要渲染,识别和注入。

解决方法:我们需要在 pages/_document.js 文件内进行样式服务渲染,同时我们可以使用 styled-components 提供的 createGlobalStyle方法,在全局呈现我们编写的样式。

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

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

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

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

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

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

在这里,我们使用了 createGlobalStyle 方法,并把样式渲染后的内容注入到 getInitialProps 函数中返回的内容中,这样就可以在服务端给页面应用我们编写的样式了。

结论

在使用 styled-components 进行样式设计时,Next.js 的服务端渲染框架让我们面临一些诸如样式闪动,服务端渲染样式等问题,需要我们进行一些细节处理,才能够达到一份优秀的前端开发。本文介绍了针对这些问题的解决方法以及如何正确地使用 styled-components。我相信这些方法可以帮助读者更好地使用 Next.js 进行开发。

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

纠错
反馈