npm 包 redux-universal-renderer 使用教程

阅读时长 15 分钟读完

redux-universal-renderer 是一个用于服务端渲染 React 应用的 npm 包,它结合了 reduxreact-router 库,可以让你轻松地将数据初始化到 React 组件中并在服务器上为它生成静态 HTML。

本文将介绍如何使用 redux-universal-renderer 实现服务器端渲染 React 应用,并提供深入指导和示例代码。

安装

使用以下命令在项目中安装 redux-universal-renderer:

使用

初始化 Redux Store

首先,我们需要在服务器端初始化 Redux Store。

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

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

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

创建渲染器

接下来,我们需要创建一个渲染器函数,它可以接收一个 URL 并返回一个 Promise 对象。

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

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

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

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

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

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

在这个渲染器函数中,我们首先创建了一个 Redux Store,然后遍历路由配置并查找匹配当前 URL 的路由。如果找到了一个匹配路由,并且该路由拥有 loadData 函数,则将该函数返回的 Promise 存储在 promises 数组中。

当所有的 Promise 都被解决时,我们调用 renderToString 方法将 React 应用转换为字符串,并将其存储在 markup 变量中。最后我们通过 Promise.resolve 将 markup 返回给调用者。

连接到 Express

最后,我们需要将我们的渲染器函数与 Express 整合起来。

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

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

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

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

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

在这个示例代码中,我们创建了一个 Express 应用并启用静态文件服务。然后我们定义了一个处理所有路由的中间件,并将请求的 URL 传递给我们的渲染器函数。最后我们将 React 应用的 HTML 输出到浏览器。

深入指导

Redux Store 的初始化

我们的渲染器函数中使用了一个新的 configureStore 函数。configureStore 函数根据我们在服务器端预加载的数据来初始化 Redux Store。这很重要,因为在客户端和服务器端,我们希望使用同一个 Store 来保持整个应用的状态一致。

React Router 的配置

我们的渲染器函数中还使用了一个 routes 配置数组。这个数组应包含一个对象数组,每个对象都有一个以下属性:

  • path:URL 的路径。
  • component:用于渲染该 URL 路径的 React 组件。
  • exact:为 true 时,只有当前 URL 完全匹配 path 时才会渲染组件。
  • loadData:用于预加载组件所需数据的函数。

如果传递给 renderToString 的 React 组件中包含具有相应路径的路由,则 React Router 将出发该组件的渲染,并使用 loadData 函数在服务器端获取所有必需的数据。

使用 React 技术栈

在这个示例代码中,我们使用了以下 React 技术栈:

这里的元素是服务端服务器端,因为我们要在 server 端生成首屏数据,而这里包括的 React 组件和 React 生态系统是前端通用的,因此您可以自由地使用它们。

示例代码

为了帮助你更好地理解所有这些概念,以下是一个完整的示例代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

只需执行以下两个步骤即可!

  1. npm install
  2. npm run start

启动服务端并访问 http://localhost:3000!

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

纠错
反馈