Vue 3 服务端渲染(SSR)与客户端渲染(CSR)的区别及解决方案

1. SSR与CSR的区别

1.1. SSR的原理

服务端渲染(SSR)是在服务器端将 Vue 组件渲染为 HTML 字符串,并将其发送给客户端。这种方式与客户端渲染(CSR)不同,后者是在浏览器中执行 JavaScript 来生成 HTML。

在 SSR 中,客户端第一次访问页面时,服务器会根据请求路径渲染对应的 HTML 页面,这有利于提升首屏加载速度和 SEO 性能。之后,客户端还需要进行“激活”,通过 Vue 的 hydrate 方法让已经渲染好的 HTML 具备动态交互能力。而 CSR 则是先加载静态 HTML 框架,之后由客户端完成所有页面的 JavaScript 渲染。

1.2. 两者的主要区别

  • SEO:SSR 在服务器端生成完整的 HTML,利于搜索引擎爬取,而 CSR 生成的 HTML 需要等到 JavaScript 执行完毕后才可用。

  • 性能:SSR 的首屏渲染速度快,但会增加服务器负载;CSR 依赖浏览器的计算能力,但可以降低服务器的压力。

  • 安全:SSR 可以更好地控制输出内容,减少 XSS 攻击的风险。

2. SSR 中如何解决首屏数据获取问题

在 Vue SSR 中,首屏数据的获取需要提前在服务器端完成。常用的解决方案是在组件中定义一个 asyncData 方法,专门用于数据预取。这个方法在组件渲染之前调用,服务器端会在渲染 HTML 之前获取数据并将其注入到组件的 props 中。

2.1. 具体步骤

1. 在服务器端,在 SSR 渲染函数中,先调用组件的 asyncData 方法获取数据,再将数据注入到 Vue 组件的 props。

2. 在客户端,Vue 会利用 hydrate 方法进行激活,接管服务器端生成的 HTML。客户端还会将服务器预取的数据作为初始状态传递,避免重复请求。

数据预取的关键在于服务器端需要等待数据加载完毕再渲染页面,以保证返回给客户端的 HTML 包含实际的数据。

// 组件中定义 asyncData 方法
export default {async asyncData({ app }) {const data = await fetchData();return { data };},render(h) {return h('div', this.data);}
};

3. 处理路由和状态同步问题

在 Vue SSR 中,路由和状态的同步非常重要。为了确保服务器和客户端渲染结果一致,必须在服务器端渲染时同步路由和状态。常用的做法包括:

3.1. 路由同步

在服务器端渲染时,服务器会根据用户的请求 URL 手动调用 router.push() 将路由切换到正确的页面,然后等待 router.isReady() 确保所有异步路由组件加载完毕后,再进行服务器端渲染。客户端同样会根据当前 URL 初始化路由。

// 服务器端路由同步
app.use((req, res, next) => {router.push(req.path, (err, url) => {if (err) {res.status(404).end();} else {app.context.url = url;next();}});
});

3.2. 状态同步

在 SSR 场景中,服务器端渲染后的状态(如 Pinia 的 store 状态)需要传递到客户端。这通常是通过将状态序列化并嵌入到 HTML 中,客户端在激活时会使用这些初始状态,避免再次请求数据。

// 状态同步
const store = createPinia();
const app = createApp({store,render: () => h(App)
});app.mount('#app', () => {const state = store.state.value;document.getElementById('state').textContent = JSON.stringify(state);
});

4. 总结

Vue 3 的服务端渲染(SSR)和客户端渲染(CSR)各有优缺点。SSR 提升了首屏加载速度和 SEO 性能,但增加了服务器负载;CSR 则依赖浏览器的计算能力,降低了服务器压力。在实际应用中,开发者需要根据项目需求选择合适的渲染方式,并采取相应的解决方案来处理首屏数据获取和路由及状态同步问题,以确保应用的性能和用户体验。

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

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

相关文章

Matlab快速回顾

一1.数值 显示 格式format style 设置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作区cls3.搜索路径设置path(path,E:\ads\)oraddpath4.M文件用户把要实现的命令写在一个以.m为扩展的文件中,然后由matlab系统进行解读,最后运行结果…

开源低代码+AI引擎:百特搭企业级开发平台的演进

在数字化转型进入深水区的今天,企业应用开发面临前所未有的复杂挑战:既要快速响应业务需求,又要确保系统灵活可控;既要降低技术门槛,又要保障核心安全。传统开发模式与单一形态的低代码工具已难以满足多层次需求。融合…

学习 Android(十五)NDK进阶及性能优化

学习 Android(十五)NDK进阶及性能优化 对 NDK 相关知识有了初步的了解之后,我们可以更加深入的去学习 NDK 相关知识,接下来,我们将按照以下步骤进行深入学习: 深入理解JNI调用过程和性能消耗常见 JNI 坑&am…

QT5.12.8 QTabWidget 透明样式QSS

/* 设置QTabWidget本身 :不加也行*/ QTabWidget#aaa_tabwdt {background: transparent;border: none; /* 移除边框可能有助于透明效果 */ }/* 标签页内的容器部件 :必须加,标签也才会透明 */ QTabWidget#aaa_tabwdt QWidget, QTabWidget#aaa_tabwdt QFrame {backgro…

【FAQ】Script导出SharePoint 目录文件列表并统计大小

一、只导出文件列表的方法 1) 保存脚本&#xff08;建议名&#xff1a;D:\tmp\Export-SharePoint-FileList.ps1&#xff09; <# 导出 SharePoint 指定文件夹&#xff08;含子文件夹&#xff09;的文件列表到 CSV&#xff08;不统计大小&#xff09; 前提&#xff1a;已安…

《Thinking in Java》读书笔记---控制执行流程

就像有感知的生物一样&#xff0c;程序必须在执行过程中控制它的世界&#xff0c;并做出选择。在Java中&#xff0c;你要使用执行控制语句来作出选择。一、流程控制基础概念1.1 流程控制的重要性流程控制结构决定了程序执行的顺序和逻辑分支&#xff0c;是编程语言中最基础也是…

极验 G-star 人才特训营:为业务安全领域培养下一代新兴力量

本文导读 极验为什么要启动 G-star 实习生培养计划&#xff1f;50多位来自多所高校的同学&#xff0c;在极验经历了一场怎样的“非典型”实习&#xff1f;技术大咖亲授&#xff0c;先培训再实战&#xff0c;极验打造的是怎样的人才体系&#xff1f;同学有话说&#xff1a;培养计…

攻防世界-web-csaw-mfw

一.题目分析这边提示使用了Git&#xff0c;试着访问.git看是否存在.git泄露浏览了一下&#xff0c;很多都是乱码&#xff0c;想着用githack将git库克隆下看一下二.操作python2 GitHack.py http://url/.git访问了一下flag.php&#xff0c;没啥发现&#xff0c;在看一下index.php…

202506 电子学会青少年等级考试机器人四级实际操作真题

更多内容和历年真题请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 四级】 网站链接 青少年软件编程历年真题模拟题实时更新 2025年6月 青少年等级考试机器人实操真题四级 实际操作 主题&#xff1a;感应节能灯&#xff08;四级&am…

DLT645电表数据 保存到MySQL数据库项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 准备工作 4 配置VFBOX网关采集DLT645电表数据 5 网关写数据到MYSQL数据库 6 安装MYSQL数据库 7 其他说明 8 案例总结 1 案例说明 设置网关采集DLT645电表数据数据把采集的数据保存到MySQL数据库。 2 VFBOX网关工作原理 VFBOX网关…

Redux与React - 异步状态操作(React快速上手4)

异步操作样板代码1. 创建store的写法保持不变&#xff0c;配置好同步修改状态的方法 2. 单独封装一个函数&#xff0c;在函数内部return一个新函数&#xff0c;在新函数中 2.1 封装异步请求获取数据 2.2 调用同步actionCreater传入异步数据生成一个action对象&#xff0c;并使用…

win10桌面右键没有新建word

win10右键新建word不见解决方法1、点击开始&#xff0c;找到运行命令行&#xff0c;输入regedit&#xff0c;打开注册表。2、在左侧找到HKEY_CLASSES_ROOT目录&#xff0c;并展开。3.找到.docx 双击&#xff08;默认&#xff09;一项&#xff0c;将其改为 Word.Document.12。关…

Docker国内可用镜像(2025.08.06测试)

Docker渡渡鸟镜像可用&#xff08;测试时间2025.08.06&#xff09;https://docker.aityp.com/使用渡渡鸟镜像pull ollama latest 例子&#xff1a;docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:0.10.1毫秒镜像和轩辕镜像也可用&#xff0c;但…

决策树的实际案例

决策树作为一种直观、易解释的机器学习算法&#xff0c;在金融、医疗、电商、风控等多个领域都有广泛的实际应用。以下将讲解1个典型案例&#xff1a;贷款违约预测。对于贷款违约预测&#xff0c;即在贷款人员在贷款之前对其进行预测&#xff0c;通过他的众多特征情况判别是否可…

bool 类型转换运算符重载

以下是一个极简且聚焦核心知识点的示例代码&#xff0c;用最直观的方式演示 bool 类型转换运算符重载的触发逻辑、使用场景和避坑点&#xff0c;帮你快速掌握&#xff1a;cpp运行#include <iostream> using namespace std;// 核心类&#xff1a;演示 bool 转换运算符 cla…

LVGL代码框架简介

LVGL代码框架介绍LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是一个轻量级、功能强大的嵌入式图形库。其代码架构设计清晰&#xff0c;模块化程度高。1. 整体架构层次LVGL采用分层架构设计&#xff0c;主要包含以下几个层次&#xff1a;┌───────…

【云计算】云主机的亲和性策略(三):云主机 宿主机

《云主机的亲和性策略》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 云主机的亲和性策略&#xff08;一&#xff09;&#xff1a;快乐旅行团2️⃣ 云主机的亲和性策略&#xff08;二&#xff09;&#xff1a;集群节点组3️⃣ 云主机的亲和性策略&#xff08;三&#xf…

【世纪龙科技】虚拟技术助力职教汽车自动变速器拆装虚拟实训软件

在职业院校汽车专业实训课堂上&#xff0c;教师常面临这样的两难&#xff1a;学生围在昂贵的自动变速器实物旁&#xff0c;却因设备数量有限只能轮流操作&#xff1b;拆装步骤稍有偏差便可能损坏精密部件&#xff0c;维修成本让本就紧张的教学经费雪上加霜&#xff1b;传统教学…

[LVGL] 配置lv_conf.h | 条件编译 | 显示屏lv_display

链接&#xff1a;https://docs.lvgl.io/master/ docs&#xff1a;LVGL LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是用于在资源受限的嵌入式系统上创建图形用户界面&#xff08;GUI&#xff09;的开源解决方案。 它提供丰富的控件和灵活的**事件系…

sqli-labs通关笔记-第32关 GET宽字符注入(单引号闭合 手工注入+脚本注入两种方法)

目录 一、宽字符注入 二、代码审计 1、代码审计 2、SQL注入安全性分析 三、渗透实战 1、进入靶场 2、id1探测 3、id%df-- 探测 4、手工注入 &#xff08;1&#xff09;获取列数 &#xff08;2&#xff09;获取回显位 &#xff08;3&#xff09;获取数据库名 &…