当然 CSR 还存在一些其他方面的缺点,比如网站强依赖于 JS 当用户禁用 JS 时网站只能是白屏展现给用户等等之类 。
1.2 Server Side Render简单聊完客户端渲染后,我们稍微来看看所谓的服务端渲染是什么含义 。
基于旧时代的类似 Java 的 JSP 页面我在这里就不赘述了,显然 JSP 的方式每个 HTML 都需要单独请求服务器返回对应的 HTML 内容严格意义上来说这也是 SSR 的方式但是很明显这已经被时代淘汰了 。
目前国内各家公司广泛应用的服务端渲染技术大概的思路是这样的(Next 的 SSR 模式也是同样的思路):
当用户首次访问你的应用站点时:
- 首先服务器会根据对应的 URL 在服务端根据对应路径渲染对应的 HTML 模版 。注意这里渲染的 HTML 模版是具有该页面真正的内容 。同时它并不具备任何交互逻辑(比如 DOM 元素的点击事件),这是一份完全的静态站点 。
- 服务器会下发这份仅具有静态内容的 HTML 模版,同时这份模版中也会包含对应的 JavaScript 执行脚本 。第一时间会展示给用户对应的 HTML 页面,此时对于访问站点的用户来说首屏渲染相较于 SPA 应用来说会非常快 。因为它并不需要在客户端浏览器上再次下载和执行 JavaScript 脚本来进行页面渲染 。
- 其次,针对于 SEO 的优化也会非常良好,因为服务器上下发的 HTML 页面是包含当前站点的真实 HTML 结构,对于搜索引擎的爬虫来说会非常容易的匹配到当前关键字 。
- 之后,浏览器会下载当前这份 HTML 的 JS 脚本 。
- 因为首先呈现给用户的一份静态的 HTML 页面,并不具备任何交互效果 。我们需要为页面上的元素增加对应交互,HTML 页面中的 JS 脚本中会包含网站的交互逻辑 。
- 最后,当下载完 HTML 脚本中的 JS 脚本后,自然会执行这些 script 脚本 。从而发生一种被称为 # hydrate(水合) 的方式,从而为页面上静态 HTML 元素再次添加对应的事件处理从而保证页面具有交互性 。
1)hydration
上述过程中有一个非常重要的关键字 hydration(水合) 。
首次访问页面时,页面的静态 HTML 是在服务端生成的 。在服务端我们将生成的静态 HTML 以及 HTML 中携带的 JS 脚本发送到客户端 。
此时静态 HTML 会立即显示在用户视野中,然后浏览器会利用网络进程下载当前 HTML 脚本中的 JS 脚本 。
当 JS 脚本下载完成后,会立即执行同时发生一种被称为 hydration 的过程 。
所谓的 hydration 简单来说,也就是客户端下载完成 JS 脚本后,浏览器会执行下载的 JS 脚本这些脚本中有部分内容会将已经存在的 HTML 内容通过执行下载的 JS 脚本添加上对应的事件监听器从而保证页面的交互 。
注意,在 React、Vue 中 hydration 并不意味着重新渲染 。因为在 Server 端已经渲染了和 Client 完全相同的 DOM 结构所以完全没有必要在此重新渲染 。
所以 hydration 的过程是给当前页面中已经生成的 HTML 页面添加上对应的事件监听器 。
这也是为什么在 Next 等框架中为什么必须要保证 Server 端和 Client 的渲染 HTML 结构必须一致的原因 。
比如我们以 Next 举例来说(Vue 也是同样的道理):
- 当用户访问 ?www.trip.biz? 时,服务端接收到请求调用 ReactDOMServer.renderToString() 生成当前页面的 HTML 静态结构 。
- 服务器会下发这个 HTML 页面给客户端,同时这个 HTML 页面上也会携带一部分 JS 脚本 script 标签 。
- 用户的浏览器中会立即展现到该 HTML 页面,同时也会下载对应 JS 脚本并执行 。
- 当 JS 脚本执行完毕后,客户端会调用 ReactDOM.hydrate() 发生水合为当前页面的 HTML 页面添加事件交互处理,同时后续由 JS 接管页面的跳转渲染 。
推荐阅读
- 解决冗余代码的三种方法,让你的代码更上一层楼
- 介绍一种可以让Linux中存储具有弹性容量的方法
- 如何编写高效的CSS代码?这五个技巧一定要知道!
- 一文讲解MySQL的主从复制
- 一个超适合初学者的轻量级Java开发工具!
- 你会让ChatGPT控制你的智能家居吗?
- 5G将如何影响AR和VR?
- 云计算数据库的灾难恢复解决方案是如何演进的?
- 盘点一些小而美的终端命令行工具
- 2023 年 Web3 开发人员的十大面试问题
