npm 包 oly-react-ssr 使用教程:构建高效稳定的 React 服务端渲染程序

阅读时长 9 分钟读完

背景和原理

React 作为目前流行的前端框架之一,其自带的虚拟 DOM 和组件化开发方式,让开发者能够更高效地构建、调整 Web 应用的界面。

但在传统的客户端渲染模式下(CSR),首屏加载时间常常被网络状况、资源大小和代码复杂度限制,尤其在低性能设备上,用户体验很容易受到影响。

服务端渲染(SSR)则是将组件在服务器端预先渲染,发送到客户端时只需要传输 HTML、CSS 和 JS,从而减少客户端的计算负担和页面加载时间,提升性能和用户体验。

虽然 React 本身可以配合 Node.js 实现 SSR,但如何在实际项目中做到高效、灵活、稳定,是一个值得深入探讨的问题。

oly-react-ssr 就是一个由国内开发者在 SSR 领域倡导并贡献的 npm 包,旨在提供一个易用、高效的 SSR 框架方案。

其原理核心是利用 express、react、webpack 等常用的模块,将客户端渲染转换为服务端渲染,同时通过 webpack 预编译打包,将开发体验尽可能地接近 CSR 模式。

安装和基础使用

  • 前置依赖:确保已经安装 Node.js 和 npm。
  • 创建一个基于 oly-react-ssr 的新项目,可以通过 npm init 快速创建一个空白的 package.json 文件。
  • 在项目根目录运行以下命令:
  • 在根目录下创建 app.js,引入 oly-react-ssr:
-- -------------------- ---- -------
-- ------
----- ------- - -------------------
----- ------------- - -------------------------

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

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

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

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

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

这是一个最简单的使用示例,ssr 实例化时需要传入四个参数:

  • publicPath: 静态资源路径,通常是 '/'。
  • entry: SSR 服务入口组件,可以是文件或者绝对路径。
  • template: HTML 模板,需要在里面插入 webpack 打包后的 JS 和 CSS。
  • routes: 路由,定义了所有页面的路径和对应的组件。

在 app.use() 中,需要注册 ssr.mandateMiddleware 作为中间件。

最后设置一个自定义路由 /,在该路由匹配时,调用 ssr.render(req, res) 渲染出完整的 HTML 返回给客户端。

进阶应用

添加样式和文件

如果需要添加样式文件,将样式文件引入 entry 中即可,如:

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

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

oly-react-ssr 会自动压缩和打包样式文件到 dist 目录下,同时在 HTML 模板中引入,如:

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

同时,需要在 webpack 配置中添加对应的 loader,如:

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

处理 SEO

由于 SSR 是服务器端渲染,因此可以通过在 HTML 中输出完整的文档头,包括 meta、title、link 等标签,可以更好地支持 SEO。

oly-react-ssr 提供了一个 handleDocument() 方法,用于处理 document 文档,可以通过继承 OlyReactSSR 类,重写该方法实现自定义文档头,如:

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

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

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

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

在子类中可以调用 super.handleDocument() 并传入修改后的 props,即可以在 document 中添加自定义的 meta 标签。

加载数据

React 组件中如果需要加载异步数据,通常需要在 componentDidMount() 中发起网络请求,并在 setState() 中更新数据,这种方式对于 CSR 来说没有问题,但在 SSR 中,客户端和服务器端组件的生命周期不完全相同,在组件渲染之前很难获得异步数据,因此需要在特定的钩子函数中处理数据。

oly-react-ssr 提供了两种处理数据的方式:

1. 通过钩子函数加载数据

用 withLoadData() HOC 将组件装饰一下即可:

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

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

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

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

withLoadData() 将会在服务器端 postMount 和服务器端 render 函数之前自动调用 fetchData(),并将返回的数据传递给组件。

2. 使用 getInitialProps()

getInitialProps() 是 Next.js 的方式,返回一个 Promise,可以支持 class component 和 functional component,是在函数组件 Class 组件中可以使用

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

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

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

与 withLoadData() 相比,getInitialProps() 可以直接在组件内定义,更方便自定义加载方式和处理异步数据的逻辑。

总结

oly-react-ssr 是一个优秀的 SSR 框架,基于 Node.js 平台和 React 技术栈,提供了简单易用、高效稳定、灵活可配置的服务端渲染方案。

在实际开发中,我们可以通过定制样式、自定义文档头、加载异步数据等方式,增强 SSR 的应用效果。

如果你还在考虑 SSR 是否值得尝试,在经过这篇文章的阐述后,相信你已经对 SSR 有了更深入的理解和信心。

享受 SSR 带来的高性能和前端开发的乐趣吧!

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

纠错
反馈