最近单页面和多页面的都做过,可是做完后有人给我提出一个概念我感觉自己答不出来,心里有点明白,但是又不深刻,正巧读了一篇文章(关于服务端渲染)的问题,所以这里想记录下,以便日后回顾。
一、 什么是服务端渲染
简单理解是每次打开页面都通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序。如何判断是服务端渲染还是前端渲染,打开一个页面 “加载源代码”,下面第一张图所示是后端传入的完整的html代码,所以是服务端渲染;再看第二张图,后端只是传来一个空的body,至于展示是有前端通过js加载路由对应的模块实现的动态渲染的,这个就是常见的spa页面,像一般简单的内部管理系统,这样的系统不需要前后端分离,否则只会白白增加工作量。
二、node server
这里不谈spa的优缺点,前面记录过,这里想着重了解下服务端渲染。总体来说,为解决seo优化问题、首屏渲染很慢的问题,考虑使用服务端渲染(SSR)
前后端分离的方案已经很常见,即后端只专注于提供接口,前端全权负责页面的展示。
比较常见的前后端分离解决方案有两种:
-
一种是将前端的html, js, css等文件直接部署在静态资源服务器上。当用户请求页面时,首先会加载静态html文件,之后通过js异步请求后端数据接口进行二次渲染。
-
另一种是通过Node服务器来作为中间层代理,通过服务端渲染动态渲染页面。
相对来说,第一种方案实施起来更为容易,但不足之处也十分明显,诸如:不利于SEO、首屏加载白屏等。所以我们更倾向于采取基于Node.js的开发模式,其实公司的serverless还不是纯粹的serverless概念,更准确的说,他是node server的概念,如下图
在这种模式下,前后端的权责区分更加清晰: -
用户的http请求会首先发送给前端的Node服务器,由于页面与Ajax接口在同域下因此跨域和SSO问题可以得到解决。
-
Node服务器在获得请求后,作为代理通过内网将请求分发(毫秒级)给后端Java服务器,Java服务器在读取数据和处理业务逻辑后,响应Node服务器的请求。
-
Node服务器在获得响应后,在服务端动态渲染页面并返回给客户端,解决了SEO和前后端分离的问题。
-
客户端获得响应,展示页面或者JS脚本执行下一步操作。