首屏优化之:SSR(服务端渲染)

news2024/9/28 21:39:51

引言

今天我们来聊一下首屏优化之SSR-服务端渲染(Server-Side Rendering)。

可能很多朋友并不了解什么是 SSR,包括在工作中写的网站是什么类型的也不太清楚,是 CSR 还是 SSR?作者在阅读过大量的文章之后,今天也来分享一下自己的理解,这部分内容确实不太好理解,我们更多的以例子来理解为主,Let‘s go!

CSR

在聊 ssr 之前,我们先来聊一下CSR,即客户端渲染(Client-Side Rendering,是一种在客户端(即浏览器)完成网页内容生成和渲染的技术,也就是浏览器端完成渲染。这个过程需要等待浏览器加载、解析和执行 JS 代码才能生成页面内容,首屏可能会有延迟。 

如果大家在工作中是做后台管理相关的,那大概率就是 CSR。

一般情况下,CSR 项目都可以直接通过 vue 或者 react 脚手架进行创建,这里我们使用 react 创建一个 csr 应用,vue 也是一样的道理,然后运行后去网络中看一下文件加载的内容。

打开网络 -- 打开第一个网络地址 -- 点击查看响应内容

可以看到,在响应中,我们只看到了一个空的 div,如果你的网站也是这样,那就是 CSR 渲染的方式了。

为了更好的让 vue 用户理解,我们也打开一个 vue 的网站看一下,可以看到是一样的,都是一个div 空标签。

在 CSR 渲染中,为什么说不利于首屏优化呢?在上面的那张截图中我们看到,script 的加载方式是 defer,也就是说 script 脚本和 html 是同时加载的,这个可以在我之前的那篇关于 script 的加载方式中了解到,所以在解析到 script 脚本时并不会立即执行,而是在 html 加载完毕之后,再执行脚本内容,那也有可能先加载好 html,script 需要等待一会再解析完毕,这可能会导致白屏现象,而在 react 中我们可以使用 lazy 和 Suspense 来实现一下,这两个的功能就是当页面还没有加载完毕时,会显示 loading 的内容,来看一下。

我们把网速调整为快速 3G 看一下。

来看一下页面的加载情况,很明显,当网速慢时,页面存在一两秒的 loanig 加载状态

 

也就是说,我们的页面初始渲染时只有一个空的div,剩余的内容需要等待js加载完毕渲染到页面中。

那如果直接使用 ssr 渲染呢,同样的慢速3G,来看一下。

可以看到,当点击刷新之后,页面会先显示我通过 ssr 渲染的内容,而不会存在空白页面的情况,不需要等待js加载结束,因为页面所需要显示的html内容已经通过服务端提前渲染好了,浏览器拿到的就是可以直接显示的内容,这样是不是可以优化首屏加载体验呢?

SSR

前面我们说了 CSR,我们对 CSR 有了基本的了解之后,对 ssr 理解起来也会更容易一些。

什么是SSR?

SSR,即服务端渲染,是指在服务器端生成 HTML 内容并将其发送到客户端。这样一来,用户在首次访问页面时,浏览器可以直接展示完整的HTML内容,而无需等待 JS 在客户端完成渲染。

还是跟上面的一样,我们来看一下网站的响应的内容,这里我们拿掘金进行举例。

很明显,我们看到,掘金并不是和上面的 CSR 网站一样,直接返回一个空的 div,而是返回了很多的 html 内容,掘金的这个网站是采用 nuxt 实现的 ssr 渲染,nuxt 是基于 vue 实现的 ssr 框架,而react 对应的 next。

那掘金的div内的内容都是什么呢?

往下看,我们发现是首页一些 nav,以及侧边栏的信息,这些直接通过ssr服务端进行渲染出来的

同样的,我们也是刷新一下掘金网站再次验证一下,可以看到刷新网站并且3G情况下,掘金也不会出现白屏现象,nav 和侧边栏都是有数据的,而中间的内容是动态获取的,也就是说掘金的首页采取的是 SSR+CSR 混合模式,静态展示的内容采用 SSR,动态获取的内容采用CSR。

  

而静态展示的内容也是从服务端获取的,因为是不经常变化的,所以加了缓存浏览器的缓存策略,在一段时间内没有过期的话直接从本地获取,第一次会从服务端获取,后端则会直接从缓存中获取,可以通过Ttag字段看到。

 在请求时携带上次服务端返回的etag,服务端经过比对如果没有静态资源没有发生变化,则不会重复请求,直接进行服用即可,可以看我之前的那篇强缓存和协商缓存的文章,里面有讲到这个。

这里我们也简单实现一下SSR+CSR渲染的模式,因为在我们实际开发中,首页很多情况下是需要动态获取数据的,不太可能只采取一种模式。

SSR举例

这里我们直接使用框架 Next.js 实现服务端渲染 ssr,vue 可以直接使用Nuxt.js。

Header 组件是 ssr 渲染,负责一些头部的内容显示,Header组件是一些静态的内容,并没有动态生成的内容。

ArticleList组件是 csr 渲染,负责一些动态数据请求

 Header组件---SSR

ArticleList组件--CSR

运行一下页面试试,可以看到,浏览器会直接显示我们的 Header 组件的内容,在等待一会之后会显示动态加载的内容。

再来看一下浏览器响应的情况,在浏览器的响应内容中,看到 div 中的内容时我们的Header的内容,而 ArticleList 组件动态获取的内容是没有的。

通过上面的举例,相信大家对 ssr 已经有一些理解了。

基本就是在 ssr 渲染中服务器端生成 HTML 内容,然后将其发送到客户端浏览器。用户在收到 HTML 时,已经包含了渲染后的页面内容,而不是一个空的div,这样则可以直接显示到浏览器上面,而不需要等到js加载结束再显示出来。

然而在 csr 渲染中,浏览器接收到的却是一个空的div,剩余的内容需要在js加载结束后,展示给用户。

这就是不同。

SSR-动态渲染

当然在 ssr 服务端渲染时,也可以请求服务端的数据,只不过针对不经常变化的资源,我么可以采取缓存策略,这个也需要后端配合,这样设置之后就只需要第一次向服务器发起请求,后续如果资源没有发生变化则会直接用我们之前的数据。

就类似于掘金的文章详情页面,如果能直接把文章内容通过服务端进行渲染,那就会有更好的SEO优化,在百度等搜索引擎搜索时,也会有更好的排名。

比如在我们的 Header 组件中,是使用的 SSR 渲染,因为需要更好的 SEO 优化,我们把模拟的文章内容通过服务端进行请求,然后渲染到页面中,这个内容也会直接返回给浏览器,实在服务端已经处理好的内容。

我们看一下浏览器的接口请求情况,可以看到除了我们写死的静态内容,也有从服务端请求的数据,但是这个内容都直接通过html返回给了浏览器,那对于SEO优化有很大的好处。

但是同样通过服务端获取请求,不也是需要加载时间吗?是的,但是我们只需要第一次加载一次,后续可以把内容缓存下来,通过后端的配置决定什么时候重新请求资源即可。

看一下掘金的文章页面,是把所有的文章内容直接通过 ssr 的方式返回给浏览器的。

如何实现SSR?

可以直接使用现有的框架实现,比如Next(react),Nuxt(vue)

总结

SSR的特点
  1. 首屏加载速度快,用户可以立即看到内容。
  2. 有利于SEO,搜索引擎可以直接抓取到完整内容。
  3. 对服务器要求较高,需要在服务端完成渲染工作。
  4. 页面交互可能需要等待JS加载完成。
CSR的特点
  1. 初次加载可能较慢,因为需要等待JS代码执行。
  2. 后续页面切换通常很快,因为只需更新变化的部分。
  3. 对服务器压力较小,大部分渲染工作在客户端完成。
  4. SEO表现可能较差,因为初始HTML内容很少。

选择 SSR 还是 CSR 要根据项目的具体需求来决定。对于要求快速首屏加载和 SEO 友好的项目,SSR 可能更为合适;对于更注重交互性能的单页应用,CSR 可能更能满足需求。

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

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

相关文章

数据结构:二叉树OJ题篇 手把手带你入门数据结构~

文章目录 前言一、单值二叉树二、检查两颗树是否相同三、对称二叉树四、另一颗树的子树五、二叉树的前序遍历六、二叉树的后序遍历七、二叉树中序遍历八、二叉树的构建及遍历九、二叉树选择题1.二叉树性质2. 二叉树选择题1. 某⼆叉树共有 399 个结点,其中有 199 个度…

vLLM (6) - Scheduler BlockSpaceManager

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 vLLM (6) - Scheduler & BlockSpaceManager 文章目录 系列文章目录前言一、Scheduler1.概述2.Scheduler._…

Cannot solve model: no CPLEX runtime found.【macOS系统下问题解决】

最近在研究电能优化的策略时,运行别人代码出现了 Cannot solve model: no CPLEX runtime found. 1. 下载cplex # !pip install cplex12.8 #指定版本 !pip install cplex #下载最新的版本2. 下载docplex !pip install docplex3. 重启Jupyter或者你的项目…

C++之STL—常用排序算法

sort (iterator beg, iterator end, _Pred) // 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // _Pred 谓词 random_shuffle(iterator beg, iterator end); // 指定范围内的元素随机调…

Qt(9.28)

widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {QPushButton *btn1 new QPushButton("登录",this);this->setFixedSize(640,480);btn1->resize(80,40);btn1->move(200,300);btn1->setIcon(QIcon("C:…

Secret Configmap

应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名,密码或者秘钥,讲这些信息直接保存在容器镜像中显然不合适,kubernetes提供的解决方案就是Secret Secret会以密文的方式存储数据,避免了直接在配置文件中保…

基于php的医院信息管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

NLP:BERT的介绍

1. BERT 1.1 Transformer Transformer架构是一种基于自注意力机制(self-attention)的神经网络架构,它代替了以前流行的循环神经网络和长短期记忆网络,已经应用到多个自然语言处理方向。   Transformer架构由两个主要部分组成:编码器(Encod…

《向量数据库指南》——Zilliz Cloud Serverless版震撼发布:弹性伸缩,成本直降50倍

在数据驱动的时代背景下,向量数据库作为处理复杂非结构化数据(如图像、视频、音频及文本等)的关键技术,正逐步成为推动人工智能、机器学习以及大数据分析等领域发展的核心力量。随着数据量的爆炸性增长和查询需求的多样化,如何高效地管理并利用这些数据成为了企业和开发者…

如何回答:count(*) 和 count(1)的区别

感谢Java面试教程的Java多线程文章,点击查看>原文 在SQL查询中,count(*) 和 count(1) 都是用于统计表中行数的聚合函数,它们的主要区别在于语法和执行效率上。 语法上的区别: count(*):直接统计表中的所有行数&…

RabbitMQ的各类工作模式介绍

简单模式 P: ⽣产者, 也就是要发送消息的程序 C: 消费者,消息的接收者 Queue: 消息队列, 图中⻩⾊背景部分. 类似⼀个邮箱, 可以缓存消息; ⽣产者向其中投递消息, 消费者从其中取出消息.特点: ⼀个⽣产者P,⼀个消费者C, 消息只能被消费⼀次. 也称为点对点(Point-to-…

[CKA]CKA预约和考试

CKA预约和考试 一、预约 1、登录Linux Foundation https://trainingportal.linuxfoundation.org/learn/dashboard 2、首页点 "Resume"进行预约 3、进入考试准备界面后,按要求分别验证 Agree to Global Candidate Agreement(同意全球候选人协…

nodejs逐字读取文件示例

像chatpGPT显示文字一样.主要是服务器流式返回数据.前端用for await读取response.body <button id"fetchjson" onclick"FetchJSON()">fetch json看console与network</button> <button id"fetchstream" onclick"FetchStrea…

基于php的民宿预订管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

[SAP ABAP] SELECT-OPTIONS

基本语法 SELECT-OPTIONS <sel> FOR <f>. 示例1 输出结果&#xff1a; 点击右边的 按钮&#xff0c;将弹出多项数值输入界面&#xff0c;如下图所示 示例2 数据准备 学生表(ZDBT_STU_437) 学生表(ZDBT_STU_437)数据明细 输出结果&#xff1a; OBLIGATORY参数用于…

RTA-OS Port Guide学习(三)-基于S32K324 OS

文章目录 前言HardwareSupported DevicesRegister UsageInitializationModificationRequired OS resourcesInterruptsInterrupt Priority LevelsAllocation of ISRs to Interrupt VectorsVector TableWriting Category 1 Interrupt HandlersWriting Category 2 Interrupt Handl…

ECCV`24 | 高保真目标修复新SOTA!复旦智象开源CAT-Diffusion,语义视觉双一致

文章链接&#xff1a;https://arxiv.org/pdf/2409.08260 Github链接&#xff1a;https://github.com/Nnn-s/CATdiffusion 总结速览 解决的问题: 单一U-Net在所有去噪步骤中对齐文本提示和视觉对象不足以生成期望的对象。 扩散模型的复杂采样空间中无法保证对对象生成的可控性…

基于php的助农生鲜销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Elasticsearch7.7设置账号密码时的逻辑矛盾问题和文章相关评论

一、Elasticsearch7.7设置账号密码时的逻辑矛盾问题 publish:June 19, 2020 -Friday 2019年1月30日&#xff0c;外媒又报道了一起Elasticsearch数据泄露事件&#xff01;2019年1月份的至少有6起Elasticsearch数据泄露事件了。原因何在&#xff0c;很简单&#xff0c;开发者在服…

数据的表示和存储 第3讲 C语言中的整数

深耕AI ​互联网行业 算法研发工程师 概括 本讲主要介绍了C语言中的整数表示。 无符号整数能够表示的最大值比带符号整数要大。带符号整数使用补码来表示&#xff0c;补码的运算系统是一种模运算系统&#xff0c;能够实现加减运算的统一。在C语言中&#xff0c;如果一个表达式…