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

背景和原理

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


猜你喜欢

  • npm 包 kloudglue-node-red-contrib-alasql 使用教程

    在现代化的前端开发中,我们经常会用到各种各样的 npm 包来帮助我们快速构建和部署 Web 应用程序。本文就要向大家介绍一个非常实用的 npm 包,就是 kloudglue-node-red-cont...

    3 年前
  • npm 包 babel-plugin-transform-constant-string 使用教程

    在前端开发中,我们经常需要写大量的字符串。在代码执行过程中,这些字符串会占用内存并且降低代码性能。babel-plugin-transform-constant-string 是一个npm包,可以帮助...

    3 年前
  • npm 包 `bloody-git` 使用教程

    介绍 bloody-git 是一个可以用来简化 Git 操作的 npm 包,它包含了很多方便的 API 和一些工具,可以极大地提高前端开发过程中对 Git 的使用效率。

    3 年前
  • npm 包 etter-hours-bot 使用教程

    介绍 etter-hours-bot 是一款非常实用的 npm 包,它可以让你设置一个自动回复的机器人,对于加班繁忙的我们来说,这个工具可以带给我们无限的便捷和助力。

    3 年前
  • npm 包 `fucking-npm` 使用教程

    什么是 npm 包 fucking-npm fucking-npm 是一个npm包,它可以在开发中帮助我们自动处理和解决常见问题。 它包含许多实用工具,可以加快我们的工作流程。

    3 年前
  • npm 包 smss 使用教程

    前言 近年来,随着移动互联网的快速发展,短信服务成为了移动互联网的重要组成部分。为了方便前端开发者使用短信服务,社区开发了一款 npm 包 smss。本文将为大家介绍smss的使用方法。

    3 年前
  • npm包jinx-panel 使用教程

    在前端开发中,我们经常需要引入各种npm包,来帮助我们更高效地完成开发任务。其中一个很实用的npm包是jinx-panel,它提供了一个灵活的面板组件,可在网页中快速显示数据和信息。

    3 年前
  • npm 包 @reactivex/ix-es2015-cls 使用教程

    在前端开发中,我们经常会用到各种各样的 JavaScript 库和框架。其中,RxJS 是一个非常常用的库,它提供了一套强大的响应式编程 API,可以用来处理异步数据流,在处理一些复杂的业务逻辑时非常...

    3 年前
  • npm 包 @reactivex/ix-es5-cls 使用教程

    在前端开发过程中,我们经常需要对数据进行处理、转换和过滤等操作来满足业务需求。而 @reactivex/ix-es5-cls 就是一个可以帮助我们快速完成这些操作的优秀 npm 包。

    3 年前
  • npm 包 electron-compile-ftl 使用教程

    介绍 electron-compile-ftl 是一个 Node.js 的开源项目,它为 Electron 应用程序开发者提供了一个简单的方式来编译 FTL 文件。

    3 年前
  • npm 包 generator-webext-sidebar 使用教程

    前言 WebExtensions 是一种跨浏览器平台的浏览器扩展开发模型,可以为用户提供强大的功能和扩展性,目前已成为前端开发者开发浏览器插件的首选方式。而在 WebExtensions 开发中,使用...

    3 年前
  • npm 包 karmadata.ui 使用教程

    在前端开发中,使用相应的 UI 库能够帮助我们提升开发效率和应用质量。karmadata.ui 是一个基于 Vue.js 的 UI 组件库,提供了多个常用组件和样式选择器,能够满足多种 Web 应用的...

    3 年前
  • npm 包 xlsx-to-json-depfix 使用教程

    简介 xlsx-to-json-depfix 是一个用于将 Excel 表格转换为 JSON 格式的 npm 包,它可以高效地将大型的 Excel 文件转换为 JSON 格式,便于前后端数据交互。

    3 年前
  • npm 包 esdoc-vue-plugin 使用教程

    什么是 esdoc-vue-plugin esdoc-vue-plugin 是一个专门为 Vue.js 组件文档生成器开发的插件,可以和 esdoc 配合使用,生成具有可读性、易维护性的 Vue.js...

    3 年前
  • npm 包 @d3-node/choropleth-us-counties 使用教程

    @d3-node/choropleth-us-counties 是一个基于 d3 和 node.js 的 npm 包。它提供了一种简单的方式来使用 d3 生成美国县地图的色域图。

    3 年前
  • npm 包 keylisten 使用教程

    在前端开发中,监听键盘事件是很常见的需求。npm 包 keylisten 可以帮助我们更方便地监听键盘事件。本文将介绍 keylisten 的使用方法,并且给出了详细的示例代码。

    3 年前
  • npm 包 garavattexplatzom 使用教程

    前言 在前端开发中,npm 是一个非常重要的工具,可以帮助我们管理项目的依赖关系、构建和发布。使用 npm 包可以让我们在开发过程中更加高效地完成一些工作。 本文介绍的 npm 包 garavatte...

    3 年前
  • npm 包 grunt-dojo2-extras 使用教程

    简介 npm 是当前前端项目中常见的包管理工具,可以帮助开发者管理项目中所需要的各种依赖。而 grunt-dojo2-extras 是一个基于 Grunt 和 Dojo2 的 npm 包,可以帮助我们...

    3 年前
  • npm 包 uncensore 的使用教程

    在前端开发中,我们经常使用第三方库来实现某些功能。其中,npm 是一个非常流行的第三方包管理器。在本篇文章中,我们将介绍一个 npm 包 uncensore 的使用教程。

    3 年前
  • npm 包 @d3-node/choropleth-us-states 使用教程

    如果你正在进行前端开发,你可能会经常需要绘制地图来展示数据。而 @d3-node/choropleth-us-states 则是一个非常优秀的 npm 包,它可以帮助你在 React 中绘制美国各州的...

    3 年前

相关推荐

    暂无文章