前端渲染模式CSR,SSR,SSG,ISR,DPR

目录

一、客户端渲染——CSR(Client Side Rendering)

二、服务器端渲染——SSR(Server Side Rendering)

三、静态站点生成——SSG(Static Site Generation)

四、增量静态生成——ISR(Incremental Static Regeneration)

五、分布式的持续渲染——DPR(Distributed Persistent Rendering)

六、对比及选择

七、相关参考


本文汇总了前端涉及到的几种不同渲染方式

一、客户端渲染——CSR(Client Side Rendering)

CSR 基本流程

 对于典型的 CSR 应用程序,浏览器仅接收一个用作应用程序容器的 HTML 页面,因此也称为单页应用。浏览器会优先请求到index.html文件,文件中并没有过多的DOM元素,直接打开的话会展示为空白页。之后会通过拉取JS、CSS文件,执行解析,对于像Vue,React,Angular等框架,会通过JS在定义的根节点上挂在DOM节点,最终将整体页面呈现给用户。

二、服务器端渲染——SSR(Server Side Rendering)

早期使用 JSP 或其他模板渲染引擎(如ejs,jade等)来构建应用就属于SSR的范畴,浏览器发起请求后,服务端会在内部完成数据请求和html的拼装操作,浏览器接收到的便是可直接渲染的html文件,而无需等待后续JS和css文件的加载。

起初的SSR在内容更新/跳转,都需要请求服务器,服务器会根据请求地址,返回新的页面内容。

在 React, Vue 等框架的加持下,SSR 一般指的是首屏服务端渲染同构渲染(Isomorphic render),即新开页面访问 SSR 应用时,首屏会返回完整的 html,浏览器通过注水hydrate)成为 React 或 Vue 应用,后续用户进行跳转等操作时不会再向服务端请求 html,而是以类似单页应用的方式进行。

同构渲染

同构渲染是 15 年左右 React 火了一段时间后提出的概念,原文是 Isomorphic rendering,但是很快就有人驳斥不应该用 Isomorphic 这个词,而应该用 Universal Rendering。

它可以分为两个部分:

  • 后端服务器获取数据并生成 HTML 返回给浏览器解析渲染页面
  • 浏览器在交互过程中,请求新的数据并动态更新渲染页面

这两种渲染方式的不同点在于运行环境的不同。单核心点是同一份代码可以在客户端和服务器端运行,两个环境的渲染结果保持一致。因此需要实现客户端和服务器端的路由、页面模板和数据共享。

它包含了两个重要的概念:

脱水(dehydrate)

将组件树序列化成静态的 HTML 片段,能直接看到初始视图,不过已经无法与之交互了,但这种便携的形态尤其适合网络传输。这个脱去动态数据,成为风干标本一样的静态快照的过程被称为脱水(dehydrate)。

注水(hydrate)

与脱水相反,将这个 html 躯干复活为 Vue 应用的过程称为注水。客户端并不重新生成 HTML 组件,而是重用服务器发送给它的 HTML,并附加「数据」与「交互性」,构建成完整的 Vue 应用,这个过程被称为注水(hydrate)。

通过同构渲染的方式结合了SSR和CSR的优势,即保证了首屏渲染速度及SEO友好性,又将后续路由处理特定的实现(如vue-router,react-router),减少了渲染服务器的负载。

三、静态站点生成——SSG(Static Site Generation)

SSG 与 SSR 的原理类似,但不同之处在于 HTML 文件是预先生成的,一般是在构建阶段完成html的拼装,将其转换为静态内容的模式,而不是在服务器实时生成。

四、增量静态生成——ISR(Incremental Static Regeneration)

ISR最早由 Next.js 在 9.5 版本中提出,它结合了 SSG 和 SSR 的优势。

核心思想是将内容区分为主要内容和次要内容。主要内容的静态页面采用SSG的方式在构建时生成。而对于次要内容则借鉴SSR得方式保持动态,在用户首次访问时进行渲染。一旦渲染完成,生成的静态页面被缓存,并在后续的请求中被直接提供,以提高性能和响应速度。

后续更新遵循 stale-while-revalidate 的逻辑,即始终返回 CDN 的缓存数据(无论是否过期);如果数据已经过期,那么触发异步的预渲染,异步更新 CDN 的缓存。

五、分布式的持续渲染——DPR(Distributed Persistent Rendering)

DPR是由Netlify提出个一个提案,详见Distributed Persistent Rendering: a new idea in the Jamstack to make deploys faster and bring a wider range of use cases.

DPR 本质上讲,是对 ISR 的模型做了几处改动,并且搭配上 CDN 的能力:

1、去除了 fallback 行为,而是直接用 On-demand Builder(按需构建器)来响应未经过预渲染的页面,然后将结果缓存至 CDN;

2、数据页面过期时,不再响应过期的缓存页面,而是 CDN 回源到 Builder 上,渲染出最新的数据;

3、每次发布新版本时,自动清除 CDN 的缓存数据。

六、对比及选择

方式优点缺点
CSR

1、分工明确:前后端彻底分离

2、性能高:页面切换即时性,网站的可移植性,可访问性更高

3、服务器负载小:切换页面不需要重新加载,路由跳转是基于特定的实现(如 vue-router,react-router 等前端路由),而非原生浏览器的文档跳转,避免了不必要的整个页面重载,服务器负载更小。甚至可以整站可以直接上CDN,前端可以不需要单独的服务器

1、SEO不友好(现在部分搜索引擎支持了对CSR页面的动态捕获)。

2、首屏渲染慢,因为是需要JS来控制页面的渲染,所以渲染部分被放到了js的后面,因此会出现相对较长的白屏。

SSR1、SEO比较友好,搜索引擎爬虫可以直接抓取页面的有效内容
2、首屏渲染快,服务端渲染直接返回带有数据的 HTML 文本,浏览器只需解析 HTML 并构建 DOM 树,无需额外执行 JS 来渲染首屏元素

1、项目复杂度变的更高,需要服务器的计算资源和公网流量部署服务,并且消耗的资源与页面的访问量成正相关,当页面的访问量突增时,渲染服务也需要进行扩容;

2、服务端只能部署在有限的几个地域,对于距离服务端较远的用2户而言,加载速度跟静态资源的 CDN 相比,慢了一个数量级(通常是 1-5ms VS 50-100+ms);

3、日常也存在传统服务端同样的运维、监控告警等方面的负担,团队需要额外的人力来开发和维护

SSG

1、性能高:相比 SSR 减轻了服务器压力,需要额外做一套node服务,还可以将生成的静态资源放到 CDN 上,用户始终通过 CDN 加载页面核心内容,可以高效利用 CDN 边缘节点的缓存,速度快

2、SEO 友好:章内容静态化,搜索引擎爬虫可以直接抓取到最终页面内容

3、易于部署:生成的静态页面可以直接部署到任何支持静态文件的 Web 服务器上,无需依赖 Node 环境等。

4、高度安全性:由于服务器不需要运行程序,因此服务器漏洞仅限于操作系统本身,维护也更加方便。

1、大型网站,静态文章千万级、亿级页面,靠每次生成耗时太久

2、需要有对应的缓存刷新策略,以保证更新的及时性

ISR1、在静态和动态之间找到了一个平衡点。对于不经常变动的内容,可以通过SSG生成完全静态的页面,从而实现快速加载和低服务器负载

1、访问到没被预渲染过的次要内容触发 fallback,需要进行 CSR,加载较慢。

2、访问到之前被预渲染过,但已经过期且未更新的页面,会得到过期的缓存响应。用户刷新一次,才能看到新的数据。

DPR1、是ISR的升级版,去除了 fallback 行为,而是直接用 On-demand Builder1、普及度较低
决策点
是否强制要求首屏性能SSR,SSG,ISR,DPR纯 CSR 不可取
否关注 SEOSSR,SSG,ISR,DPR纯 CSR 不可取
是否具有丰富可交互性、需要用户能力、差异化渲染CSRSSR,SSG,ISR,DPR
页面结构 & 路由是否复杂、数据更新是否频繁、是否依赖实时数据接口首先排除 SSG、如果内容不能拆解,ISR、DPR 也不便接入无限制
是否有低码或微前端等框架的使用排除SSG、ISR、DPR选项无限制
是否接受引入服务器运维成本无限制SSR不可选
旧有实现中是否有浏览器依赖如 UI 框架内对 DOM、BOM,或 Hybrid 场景下的 JSBridge 的使用SSR、SSG 受限无限制

七、相关参考

新一代Web建站技术栈的演进:SSR、SSG、ISR、DPR都在做什么? - 知乎

Visual Explanation and Comparison of CSR, SSR, SSG and ISR

Rendering on the Web

带你深入理解 CSR,SSR,SSG 等常用渲染模式 - 专栏 - 声网 RTE 开发者社区

一文看懂Next.js渲染方法:CSR、SSR、SSG和ISR-51CTO.COM

什么是 CSR、SSR、SSG、ISR - 渲染模式详解_csr和ssr_嘿嘿不务正业的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/55.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试】在Windows环境安装Docker(详细步骤)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 下载和安装 1、地…

智慧园区4G+蓝牙+GPS/北斗RTK人员定位系统解决方案

智慧园区是指利用现代科技手段进行精细化管理的园区,人员定位技术被广泛应用在智慧园区。智慧园区人员定位技术通过使用传感器设备,能够实时监测园区内人员的位置和活动情况,从而提高园区的人员管理效率和安全性。 通过人员定位,…

云HIS是什么?HIS系统为什么要上云?云HIS有哪些优点?

一、当前医疗行业HIS的现状与发展趋势 1.医院信息系统(HIS)经历了从手工到单机再到局域网的两个阶段,随着云计算、大数据新技术迅猛发展,基于云计算的医院信息系统将逐步取代传统局域网HIS , 以适应人们对医疗卫生服务越来越高的要…

常用分类损失CE Loss、Focal Loss及GHMC Loss理解与总结

一、CE Loss 定义 交叉熵损失(Cross-Entropy Loss,CE Loss)能够衡量同一个随机变量中的两个不同概率分布的差异程度,当两个概率分布越接近时,交叉熵损失越小,表示模型预测结果越准确。 公式 二分类 二…

深入理解预训练(pre-learning)、微调(fine-tuning)、迁移学习(transfer learning)三者的联系与区别

1. 什么是预训练和微调 你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先,你需要随机初始化参数,然后开始训练网络,不断调整参数,直到网络的损失越来越小。在训练的过程中,一开始初始化的参数会不断变化。…

小程序:页面跳转闪屏

自己的笔记,随手记录。扛精走开。 1、问题描述 进入页面,是一个组件,通过路由传参判断是由哪个页面进入,不同的页面拿的已选值不一样,需要回显值,在编辑数据。此时会出现一个问题,A页面中进来…

Serverless和EDA是绝配,亚马逊云科技CTO Werner表示需要用开放心态来重新审视架构

前一段有个很火的博客,讲的是一家全球流媒体企业的监测系统从Serverless微服务改成了单体,成本居然降低了90%!这一下子可在网上炸锅了,特别是一些看不惯微服务的、单体应用的拥趸,更是坐不住了。但这并不像吃瓜群众看到…

【ECharts系列】ECharts 图表渲染问题解决方案

1 问题描述 echats 渲染,第一次的时候只出现Y轴数值,不出现X轴数值,切换下页面,X轴数值就能出现。 2 原因分析 如果在使用ECharts渲染时,X轴数值只在切换页面后才出现,可能是因为ECharts在初始化时没有正确…

光速吟唱,Clibor ,批量多次复制依次粘贴工具 快捷输入软件教程

批量多次复制依次粘贴工具 批量复制粘贴工具0.81.exe https://www.aliyundrive.com/s/3sbBaGmHkb8 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。 青县solidworks钣金设计培训 …

Redis进阶 - Redis哨兵

原文首更地址,阅读效果更佳! Redis进阶 - Redis哨兵 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-sentinel.html 思考 slave 节点宕机恢复以后可以找 master 节点同步数据,那么 master 节点宕机怎么办&am…

[Docker] Docker镜像管理和操作实践(二) 文末送书

前言: Docker镜像是容器化应用程序的打包和分发单元,包含了应用程序及其所有依赖项,实现了应用程序的可移植性和一致性。 文章目录 使用Dockerfile创建自定义镜像实践练手1. 创建基于ubuntu的自定义镜像,并安装nginx2. 配置Redis容…

MySQL数据库高级查询语句

MySQL数据库高级查询语句 一、语句SELECT ----显示表格中一个或数个字段的所有数据记录DISTINCT ----不显示重复的数据记录WHERE ----有条件查询AND OR ----且 或IN ----显示已知的值的数据记录BETWEEN ----显示两个值范围内的数据记录通配符 ----通常通配符都是跟 LIKE 一起使…

【云原生】二进制k8s集群(下)部署高可用master节点

本次部署说明 在上一篇文章中,就已经完成了二进制k8s集群部署的搭建,但是单机master并不适用于企业的实际运用(因为单机master中,仅仅只有一台master作为节点服务器的调度指挥,一旦宕机。就意味着整个集群的瘫痪&#…

宝塔Linux面板安装Composer依赖管理工具与PHP依赖包的方法

最近看见腾讯云有一个AI绘画还挺有意思,想搞来写个接口玩 但是Composer一直运行不成功 提示xdebug什么的 最后经过搜索 发现 需要删除你宝塔里所有php中禁用的putenv函数 然后重启php就可以了! 然后就可以运行这个命令了 出现这种情况 还需要删除所有…

Linux常用命令——emacs命令

在线Linux命令查询工具 emacs 功能强大的全屏文本编辑器 补充说明 emacs命令是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器,它支持多种编程语言,具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。 语法 e…

服务器技术(三)--Nginx

Nginx介绍 Nginx是什么、适用场景 Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 Nginx专为性能优化而开发,性能是其最重要的考量&#xf…

【Nginx】rewrite简单使用

前言 没有对正式的rewrite进行了解,为了能快速了解它是干嘛怎么用,找了一些有例子的博客进行简单学习了一下;由于每次看的间隔有点大,老忘记,这回专门写个超级快速理解的例子。 PS:下面的解释可能会不太对…

LAXCUS分布式操作系统存在的意义和价值

总有一些新用户不能理解LAXCUS分布式操作系统,以及它存在的意义和价值,我这样说吧。 下图是一个图形桌面(LAXCUS的图形桌面,不是Windows、也不是Macintosh),在它后面,连着一个计算机集群&#…

数据库技术与应用——目录篇

数据库技术与应用目录 文章目录 第1章 数据库基础知识数据库技术的概念数据管理的发展数据库的体系结构数据库管理系统常用的数据库管理系统介绍 第2章 信息得三种世界与数据模型信息的三种世界及其描述数据模型 第3章 关系模型关系模型的由来关系数据库的结构关系代数关系演算…

Linux命令----modprobe命令详解

【原文链接】Linux命令----modprobe命令详解 一、modprobe命令的作用 加载内核模块: 使用modprobe命令可以加载指定的内核模块到运行中的内核中。加载内核模块可以在运行时添加新的功能、驱动程序或修改内核行为。 解决模块依赖关系: modprobe命令可以…