React 服务端渲染理论

资源列表:
Git仓库: koa2-react-isomorphic-boilerplate
Webpack工程化解决方案easywebpack
Egg + React + React Router + Redux 服务端渲染实践
Egg + React 服务端渲染开发指南
服务端渲染与 Universal React App
React服务器端渲染实践小结

React 服务端渲染理论

相关的知识点:

  • 了解服务端渲染解决的问题
  • 了解服务端渲染的基本原理
  • 使用现有框架实现服务端渲染
  • 进阶,dva+egg框架实现服务端渲染
  • 进行性能测试

客户端渲染、服务端渲染、同构的区别

  • 客户端渲染:页面在 JavaScriptCSS 等资源文件加载完毕后开始渲染,路由为客户端路由,也就是我们经常谈到的 SPA(Single Page Application)

  • 服务端渲染:页面由服务端直接返回给浏览器,路由为服务端路由,URL 的变更会刷新页面,原理与 ASPPHP 等传统后端框架类似。

  • 同构:英文表述为 IsomorphicUniversal,即编写的 JavaScript 代码可同时运行在浏览器及 Node.js 两套环境中,用服务端渲染来提升首屏的加载速度,首屏之后的路由由客户端控制,即在用户到达首屏后,整个应用仍是一个 SPA

总的架构

  • 服务端预先获取编译好的客户端代码及其他资源。
  • 服务端接收到用户的 HTTP 请求后,触发服务端的路由分发,将当前请求送至服务端渲染模块处理。
  • 服务端渲染模块根据当前请求的 URL 初始化 memory historyredux store
  • 根据路由获取渲染当前页面所需要的异步请求(thunk)并获取数据。
  • 调用 renderToString 方法渲染 HTML 内容并将初始化完毕的 redux store 塞入 HTML 中,供客户端渲染时使用。
  • 客户端收到服务端返回的已渲染完毕的 HTML 内容并开始同步加载客户端 JavaScriptCSS,图片等其他资源。
  • 之后的流程与客户端渲染完全相同,客户端初始化 redux store,路由找到当前页面的组件,触发组件的生命周期函数,再次获取数据。唯一不同的是 redux store 的初始状态将由服务端在 HTML 中塞入的数据提供,以保证客户端渲染时可以得到与服务端渲染相同的结果。受益于 Virtual DOMdiff 算法,这里并不会触发一次冗余的客户端渲染。

为什么要采用服务端渲染?

  • 利于 SEO
  • 加速首屏渲染速度
  • 享受 React 组件式开发的优势:高复用、低耦合
  • 前后端维护一套代码(代码同构)