服务端渲染
服务端渲染(SSR)是近些年来提出的一个比较新鲜的概念,其主要目的是充分利用服务端的算力资源来提升客户端的数据加载和使用体验。
但是服务端渲染并不是一个全新的概念,如果你是一个在 React 兴起之前,jQuery 火爆的时代就开始进行前端开发的人,你甚至可能会觉得服务端渲染看上去有些熟悉。其实服务端渲染与之前在 jQuery 中常用的由服务端生成一段 HTML 代码片段,然后通过 jQuery 将其插入 HTML 文档的用法还是很相似的,不过服务端渲染的处理过程要比以前更加复杂了。
服务端渲染的原理
服务端渲染的原理讲述起来并不是很复杂,但是在使用过程中却会遇到很多的问题。
上面提到了服务端渲染是可以利用服务端算力的,所以服务端渲染的原理实际上是将结构基本相同的代码分别在服务端和客户端都准备一套,其中服务端负责应用中的数据部分,客户端负责应用中的事件处理部分。
如果说在传统客户端渲染的 React 应用中,存在一个公式:\(UI = F_{组件}(State) \),那么在服务端渲染中,这个公式就会变成 \( UI = hydrate(组件)(F_{组件}(Action)) \)。看起来是复杂了很多。
在传统的客户端渲染中,组件以一个函数的形式出现,接受传入的 Props 和自身的 State 作为用于渲染的 State,并在其中同时整合用户的 UI 操作。组件形成的 HTML 片段和 HTML 中的事件绑定是同时完成的。
但是在服务端渲染中,组件生成 HTML 片段和向 HTML 中绑定事件被分开了,组件获取数据形成 HTML 片段的过程主要在服务端完成,所以在上面的公式里,就引入了一个 Action 的概念。这个 Action 既表示用户在操作过程中产生的动作,也表示组件在应用运行过程中产生的动作。这些 Actions 运行的结果就是用来提供组件产生 HTML 片段的数据。生成好的 HTML 片段传递到客户端以后,经过框架的水合过程,将组件中定义的事件处理绑定到服务端生成的 HTML 片段里,就最终形成了可以用来展示的 UI 界面。
使用服务端渲染的优势
传统单页应用(SPA)的主要缺点就是加载数据缓慢和对 SEO 不友好,因为毕竟所有的内容都是在客户端实时产生的。大部分的搜索引擎在扫描和收录页面内容的时候是不会去运行其中的 Javascript 的,所以如果使用 SPA 完成一个网站的部署的时候,搜索引擎可能就无法抓取到网站上人类可见内容。
所以为了解决客户端渲染存在的这些缺点,就提出了服务端渲染的概念。
服务端渲染里 HTML 内容是在服务端生成的,所以搜索引擎在抓取内容的时候,是可以正常获取到内容的。所以这就是服务端渲染对 SEO 友好的基础。
此外,由于在服务端渲染中,对于组件中所要展示的数据的获取是在服务端完成的,所以除了可以利用HttpRequest
访问其他的 Restful API 服务获取数据以外,甚至还可以直接访问数据库获取和处理数据。
在传统客户端渲染应用中,一个需要获取和处理大量数据的组件在复杂功能应用中是很常见的。采用服务端渲染以后,数据获取和业务处理的隆重逻辑可以分别放置到不同的环境中完成,这样也就在一定程度上简化了组件的设计和编写,让组件变得更加简练,而且用户在打开网站时,首屏的加载和展示时间都会大大的缩短。
缺点
一项技术既然有它的优势,那么它就一定会存在缺点,服务端渲染技术也不例外。其实相比服务端渲染技术带来的优势,它的缺点可能更让人感觉恼火。
最首当其冲的缺点就是更多配置项目的引入。在使用服务端渲染以后,之前仅适用一个开发服务器就可以完成的工作,现在需要引入一个 NodeJS 服务器了,而且也开始要求网站前端开发人员需要掌握网站服务端开发技能了。
此外就是网络上不管是 React 官网还是各种教程站,提供的都是使用 NodeJS 运行时和 Express 服务框架来实现 React SSR 的示例,并且大部分示例都是使用 Webpack 来完成网站各种资源的打包。这对于目前 React 使用者所面临的各式各样的技术栈其实并没有什么太多的参考价值。
所以不管是全新建立一个 SSR 应用,还是将原有客户端渲染改造成一个 SSR 应用,开发人员都需要付出较多的时间来完成配置和新的入口文件的编写和调试。
而对于运维人员来说,SSR 应用的部署也需要引入更多的环境、配置和服务器资源。