使用 PM2 部署 React SSR 应用,如何实现动态路由和页面数据预取

阅读时长 12 分钟读完

前言

React SSR(Server-Side Rendering)可以提高网站的性能,使搜索引擎更好地索引网站内容,同时还可以提供更好的用户体验。在 React SSR 应用中,动态路由和页面数据预取是非常重要的功能。本文将介绍如何使用 PM2 部署 React SSR 应用,并实现动态路由和页面数据预取。

PM2 简介

PM2 是一个 Node.js 应用程序的进程管理器,它可以帮助您管理和监控 Node.js 应用程序的运行。PM2 可以让您轻松地启动、停止、重启和监控多个 Node.js 进程,同时还提供了日志记录、错误处理和负载均衡等功能。

React SSR 应用的部署

在部署 React SSR 应用之前,首先需要安装 Node.js 和 npm。然后,使用 npm 安装所需的依赖项:

其中,react、react-dom、express、webpack、webpack-cli、webpack-dev-middleware、webpack-hot-middleware、babel-loader、@babel/core、@babel/preset-env、@babel/preset-react、@babel/node、nodemon、pm2 和 compression 是必需的依赖项。

接下来,创建一个名为 server.js 的文件,该文件将作为 React SSR 应用的入口点,代码如下:

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

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

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

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

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

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

在上面的代码中,我们创建了一个 express 应用程序,并使用 express.static 中间件将 public 目录作为静态文件目录。然后,我们定义了一个通配符路由,该路由将用于捕获所有的请求。在路由处理程序中,我们使用 ReactDOMServer.renderToString 将 React 组件渲染为 HTML 字符串,并将其插入到一个包含 JavaScript 脚本的 HTML 模板中。最后,我们将应用程序绑定到端口 3000 上,并在控制台输出一条消息。

接下来,创建一个名为 App.js 的文件,该文件将包含 React 组件的代码,代码如下:

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

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

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

在上面的代码中,我们使用 Switch 和 Route 组件定义了三个路由:/、/about 和 404 页面。这些路由将分别渲染 Home、About 和 NotFound 组件。

接下来,创建一个名为 Home.js 的文件,该文件将包含 Home 组件的代码,代码如下:

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

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

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

在上面的代码中,我们定义了一个简单的 Home 组件,该组件只包含一个标题。

接下来,创建一个名为 About.js 的文件,该文件将包含 About 组件的代码,代码如下:

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

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

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

在上面的代码中,我们定义了一个包含标题和段落的 About 组件。

最后,创建一个名为 NotFound.js 的文件,该文件将包含 404 页面的代码,代码如下:

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

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

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

在上面的代码中,我们定义了一个包含标题和段落的 404 页面组件。

现在,我们已经完成了 React SSR 应用的代码编写。接下来,我们将使用 PM2 部署应用程序。

使用 PM2 部署应用程序

在部署应用程序之前,我们需要使用 webpack 打包应用程序。在项目根目录下创建一个名为 webpack.config.js 的文件,代码如下:

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

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

在上面的代码中,我们定义了一个 webpack 配置,其中包含了一个入口点、一个输出目录和一个 JavaScript 加载器。该配置将使用 babel-loader 和 @babel/preset-env、@babel/preset-react 来转换 ES6 和 JSX 语法。我们将在 public 目录中生成一个名为 bundle.js 的文件。

接下来,在命令行中执行以下命令来运行 webpack:

运行完毕后,我们将在 public 目录中生成一个名为 bundle.js 的文件。

现在,我们已经准备好使用 PM2 部署应用程序了。在命令行中执行以下命令来启动应用程序:

在上面的命令中,我们使用 pm2 start 命令来启动应用程序,--name 参数用于指定应用程序的名称,--watch 参数用于监视文件变化并重新启动应用程序。

现在,我们已经成功地使用 PM2 部署了 React SSR 应用程序。接下来,我们将介绍如何实现动态路由和页面数据预取。

实现动态路由

在 React SSR 应用程序中,我们可以使用 react-router-dom 库来实现动态路由。在 App.js 文件中,我们已经定义了三个路由:/、/about 和 404 页面。这些路由将分别渲染 Home、About 和 NotFound 组件。

但是,如果我们需要实现更复杂的路由,例如带参数的路由,该怎么办?例如,我们希望在 /users/:id 路由中显示用户的详细信息。在这种情况下,我们需要使用 react-router-dom 库中的 Route 组件的 path 属性和 component 属性。例如,我们可以将以下代码添加到 App.js 文件中:

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

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

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

在上面的代码中,我们定义了一个带有参数的 /users/:id 路由,并将其渲染为 User 组件。

在 User.js 文件中,我们可以使用 useParams 钩子来获取路由参数。例如,我们可以将以下代码添加到 User.js 文件中:

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

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

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

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

在上面的代码中,我们使用 useParams 钩子来获取路由参数,并将其显示在页面上。

现在,我们已经成功地实现了动态路由。接下来,我们将介绍如何实现页面数据预取。

实现页面数据预取

在 React SSR 应用程序中,页面数据预取可以提高网站的性能,使页面加载更快。例如,在 /users/:id 路由中,我们需要获取用户的详细信息,然后将其显示在页面上。在这种情况下,我们可以使用 react-helmet-async 库来实现页面数据预取。

在 User.js 文件中,我们可以使用 useAsyncEffect 钩子来获取用户的详细信息。例如,我们可以将以下代码添加到 User.js 文件中:

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

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

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

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

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

在上面的代码中,我们使用 useAsyncEffect 钩子来获取用户的详细信息。useAsyncEffect 钩子类似于 useEffect 钩子,但它可以处理异步操作。在钩子的回调函数中,我们使用 fetch 函数来获取用户的详细信息,并将其保存在 state 变量中。然后,我们使用 react-helmet-async 库来设置页面标题。最后,我们将用户的详细信息显示在页面上。

现在,我们已经成功地实现了页面数据预取。当用户访问 /users/:id 路由时,我们将在服务器上获取用户的详细信息,并将其保存在 HTML 中。这样,当用户访问该页面时,他们将立即看到用户的详细信息,而不需要等待网络请求。

结论

在本文中,我们介绍了如何使用 PM2 部署 React SSR 应用程序,并实现动态路由和页面数据预取。使用 PM2 可以帮助您轻松地管理和监控 Node.js 应用程序的运行,同时还提供了日志记录、错误处理和负载均衡等功能。动态路由和页面数据预取是 React SSR 应用程序中非常重要的功能,可以提高网站的性能,使页面加载更快。如果您正在开发 React SSR 应用程序,那么本文将为您提供有价值的学习和指导。

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

纠错
反馈