Nuxt 3.0 全栈开发:五种渲染模式的差异和使用场景全解析

news2024/9/21 14:42:58

Nuxt 3.0 全栈开发 - 杨村长 - 掘金小册核心知识 + 工程架构 + 全栈进阶 + 项目实战,快速精通 Nuxt3 开发!。「Nuxt 3.0 全栈开发」由杨村长撰写,299人购买https://s.juejin.cn/ds/S6p7MVo/

前面我们提到过 Nuxt 能够满足我们更多开发场景的需求,这主要是因为 Nuxt3 中提供了多种渲染模式:

  • 客户端渲染 - CSR;
  • 全局渲染 - SSR;
  • 静态站点生成 - SSG;
  • 混合渲染 - hybrid rendering;
  • 边缘渲染 - edge-side rendering。

本节我们将深入探讨几种渲染模式的差异和各自使用场景。

传统服务端渲染

在过去传统开发中,页面渲染任务是由服务端完成的,服务器负责获取数据,拼装页面,客户端仅负责内容显示,使用这种方式的典型技术有 JSP、PHP、ASP.NET 等等。

很显然,这种方式中,服务器的任务比较繁重,服务器负载相对较大,这样同等情况下一台机器能够同时负载的用户数就变少了。另外开发过程中,由于前后端内容是混在一起的,这就要求开发者要同时掌握前后端知识,要求较高。如果是由前后端工程师合作开发,也容易造成时间冲突,前端页面不出来,后端工程师就要干等着,开发效率不高。于是后来便有了大家熟悉的 Vue.js、React 等 SPA 框架大行其道。

客户端渲染

Vue.js、React 这类框架之所以能解决前面提到的问题,主要是因为采用了前后端分离的开发模式,这种方式的特点是页面是由客户端渲染的,应用在客户端首次获取的是空 HTML 文档,浏览器下载并运行 JS,获取数据之后再创建页面,也就是大家熟悉的单页面应用 - SPA。

这种方式,服务端仅提供数据接口,拼装页面的任务交给了客户端,这样充分利用客户端性能,提高了服务器负载能力。开发过程中,前后端分离,前后端工程师各司其职,有效提升开发效率。

但同时,这种渲染模式也存在缺点:用户不得不等待浏览器下载并执行 JS 代码才能看到内容,这跟客户端网速和硬件性能有关,会增加首屏加载时间,影响用户体验。同时,由于页面内容一开始为空,也会导致搜索引擎无法爬取结果,不利于 SEO。

因此,CSR 适合那些不需要 SEO 或者用户访问频率不高的强交互应用,例如:SaaS 系统、后台管理系统、在线文档等。同时,利用浏览器缓存特性,这些应用也可以避免再次下载资源从而提高性能表现。

服务端渲染

前面提到 SPA 的 SEO 问题和首屏加载速度问题,有什么好办法可以解决它们呢?其实传统的服务端渲染就行。但是这样一来岂不是开历史倒车,兜兜转转又回去了?

解决方案也不难,只需对传统服务端渲染模式做一些改进:

  • 当用户请求一个 URL 时,先按照传统模式在服务端渲染完整 HTML 页面给浏览器,这样用户立刻可以获得首屏内容;
  • 与此同时,客户端会加载 JS 代码,使前面加载的静态内容重新变成可交互的 SPA,这样后续的页面切换就不再需要刷新和重新获取页面内容了。

为了保证前端程序员能够使用熟悉的方式编写页面,即“同构开发”,服务端渲染时,Nuxt 实际上是在服务器上执行 Vue,将我们编写的组件渲染为 HTML 并返回客户端。客户端激活时执行的 JS 实际上也是 Vue,它会重新接管文档,恢复数据和状态,使静态页面变得可交互,这一过程称为“注水(hydration)”。

可以看到,SSR 保留 CSR 优点的同时,还给用户提供了快速加载首屏的能力,这同时也解决了 SEO 问题。

但这种方式也并不完美,因为服务器和浏览器环境有差异,它们不能给开发者提供相同 API,例如,组件在服务端创建时就没有 mounted 钩子,因为根本没有挂载这一步,这导致不少组件库不能在服务端环境正常使用。

又比如,有时候我们的代码只想在客户端运行,如果不小心在服务端执行了就会报错。这些都给开发带来了复杂度和约束性。同样的,由于页面渲染操作发生在服务端,所以服务器负载增加了,只是由于后续 hydration 操作,这个负载增加量被大幅减少了。最后,大家还应该注意的是,SSR 还额外增加了 node.js / serverless 这样的运行时需求,这实际上也是一笔费用。

综上所述,SSR 方式非常灵活,几乎可以适配大多数需求,尤其是一些基于内容的网站:博客,电商,官网等等。

因此 Nuxt3 默认渲染模式就是 SSR。

静态站点生成

大家可以看一下 Nuxt 项目中 packages.json 文件,里面提供了一个 generate 命令。这个命令的作用是将写好的动态页面基于数据生成为静态网站,这一过程称为静态内容生成 - Static Site Generate,即 SSG。

为什么要做静态内容生成哪?答案也很简单,因为如果用户每次访问一个相同的页面都要重新渲染一次相同的内容,无疑是在浪费资源,比如一篇博客或者一个商品详情页,编辑完成之后它们通常不怎么变动,这就没有必要每次重新渲染,如果提前渲染好一个静态页,将会获得最小的服务器负载,最好的性能表现,同时也减少网站的安全风险。

同时,服务器需求也是最少的,我们仅需要静态网站服务即可,这显然可以大幅降低服务器成本。如果我们只是开发一个个人网站或博客,甚至可以通过 github page、vercel 等静态服务零成本建站。

当然 SSG 也存在一些问题,比如网站内容一旦变化,我们就需要重新生成整站,网站内容比较少时这并没有什么问题,如果内容比较庞大,则每次重新生成的时间成本就太大了。因此也就有了增量内容生成 - ISG,但是这个功能 Nuxt3 目前还在开发中。

所以,SSG 仅适合内容创建之后不经常变化的网站,例如:个人博客、网站、宣传页等。

混合渲染

之前的 Nuxt 版本中,一个应用只能使用一种渲染模式,要么客户端渲染,要么服务端渲染,这种非黑即白的方式不灵活,一些情况下,应用的不同部分用不同的渲染方式更适合。比如电商应用首页经常变动,适合服务端渲染,商品详情页则希望静态化;又比如 CMS 中 admin 部分不需要 SEO,则适合客户端渲染,而所有内容页则仅需要生成一次。

Nuxt3 带来一个新的渲染模式,称为混合渲染 - hybrid rendering,顾名思义,这是一种根据不同路由规则使用不同方式渲染的模式。这种方式就可以用来解决前面提出的需求。

所以,如果大家的项目需求使用一种渲染模式不能满足时,就可以考虑混合渲染模式。

边缘渲染

过去,SSR 只能运行在 Node.js 环境,但是 Nuxt3 提供了跨平台支持,能够同时运行在 Node.js、Deno、Workers 等运行时环境。

这就给用户带来一种全新使用方式:边缘渲染 - edge-side rendering,这种方式能够在 CDN edge worker 环境下直接执行渲染,这样 Nuxt 应用能够运行在离用户更近的环境中,从而降低延迟和服务器花销。

因此,如果大家需要深度优化应用打开和交互速度,例如:实时游戏,交易系统,就可以尝试边缘渲染模式

总结

最后我们总结一下渲染模式的一些差异:

  • 客户端渲染:开发速度快,节约服务器资源;首屏慢,SEO 不友好;
  • 服务端渲染:首屏快,SEO 友好,适应性强;开发约束大,服务器费用高;
  • 静态站点生成:首屏极快,SEO 友好,服务器成本低;适应性弱,可维护性差;
  • 混合渲染:按需渲染,适应性强,可维护性好;稳定性、可用性不好;
  • 边缘渲染:性能好,服务器成本低;稳定性、可用性不好。

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

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

相关文章

IGKBoard(imx6ull)-I2C接口编程之SHT20温湿度采样

文章目录1- 使能开发板I2C通信接口2- SHT20硬件连接3- 编码实现SHT20温湿度采样思路(1)查看sht20从设备地址(i2cdetect)(2)获取数据大体流程【1】软复位【2】触发测量与通讯时序(3)返…

日志收集笔记(Kibana,Watcher)

1 Kibana Kibana 是一个开源的分析与可视化平台,可以用 Kibana 搜索、查看存放在 Elasticsearch 中的数据,就跟谷歌的 elasticsearch head 插件类似,但 Kibana 与 Elasticsearch 的交互方式是各种不同的图表、表格、地图等,直观的…

【python】控制台中文输出乱码解决方案

注:最后有面试挑战,看看自己掌握了吗 文章目录控制台原因解决方法方法一方法二方法三如果是os.system函数乱码控制台原因 一般的情况下,还是我们的源码文件的编码格式问题。我们一般是要把源码文件的编码格式改成utf-8就好了,但是…

zeppelin安装及hive配置

一、zeppelin安装包 链接:https://pan.baidu.com/s/1DVmvY2TM7WmCskejTn8dzA 提取码:fl7r 二、安装zeppelin 将安装包传入Centos的/opt/install目录下 # 解压 tar -zxf /opt/install/zeppelin-0.10.0-bin-all.tgz -C /opt/soft/ # 重命名 mv /opt/sof…

Nodejs环境配置 | Linux安装nvm | windows安装nvm

文章目录一. 前言二. Linux Nodejs环境配置1. 安装nvm2. 配置npm三. Windows Nodejs环境配置1. 安装nvm2. 配置npm四. nvm基本使用一. 前言 由于在实际开发中一些不同的项目需要不同的npm版本来启动,所以本篇文章会基于nvm这个node版本管理工具来进行Linux和Winodw…

[AI助力] 2022.3.2 考研英语学习 2011 英语二翻译

[AI助力] 2022.3.2 考研英语学习 2011 英语二翻译 文章目录[AI助力] 2022.3.2 考研英语学习 2011 英语二翻译2011年英语二翻译真题自己写的看看AI的翻译谷歌翻译New Bing😂让AI自我评价chatgpt🤣让AI自我评价DeepL有道腾讯翻译百度翻译IDEA翻译积累&…

智能家居项目(八)之树莓派+摄像头进行人脸识别

目录 1、编辑Camera.c 2、编辑contrlDevices.h 3、编辑mainPro.c 4、进行编译: 5、运行结果: ./test1 6、项目图片演示 智能家居项目(七)之Libcurl库与HTTPS协议实现人脸识别_Love小羽的博客-CSDN博客 经过上一篇文章&…

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,…

Simulink 自动代码生成电机控制:优化Simulink生成的代码提升代码运行效率

目录 优化需求 优化方法 从模型配置优化 优化结果对比 从算法层优化 优化结果对比 总结 优化需求 本次优化的目的是提升FOC代码执行速度,以普通滑模观测器为例,优化前把速度环控制放到2ms的周期单独运行,把VOFA上位机通信代码放到主循…

mongodb入门到使用(上)

mongodb的安装与使用前言一、linux下载二、mongodb配置三、 mongodb服务管理启动服务查看停止四、远程连接五、SpringBoot整合总结前言 本文主要针对一些项目的部署服务器在使用方面用到了mongodb,参考解决一些部署方面遇到的问题。 一、linux下载 使用wget下载 w…

代数小课堂:向量代数(通过向量夹角理解不同的维度)

文章目录 引言I 计算向量的夹角1.1 毕达哥拉斯定理1.2 余弦定理1.3 计算向量的夹角II 向量夹角的应用2.1 用计算机自动筛选简历(对人进行分类)2.2 计算机进行文本自动分类的原理引言 根据余弦定理计算两个向量的夹角向量夹角的应用: 对文本进行自动分类、自动筛选简历。如果…

【上位机入门常见问题】Visual Studio 2022安装指导

Visual Studio 2022安装指导 这里给大家指导安装Visual Studio 2022 Community版本,也就是我们常说的社区版,这个版本是微软给开发者学习技术专门定制的免费版本,其他的专业版和企业版都是商业收费版本。对于我们学习,大家使用社…

使用Docker、navicat部署和连接GaussDB

一、在CentOS7上安装Docker工具 1.卸载之前老版本的Docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce 2.安装D…

TLS协议

TLS全称传输层安全协议,上一代是安全套接层(SSL,不安全),用途广泛,最知名的是用于http,使http升级为https协议,最新版本为TLSv1.3(推荐使用)。TLS通过建立客户端和服务器…

Vue-router的引入和安装

什么是Vue-Router?Vue路由器是Vue.js的官方路由器,它与Vue.js核心深度集成,使用Vue轻松构建单页应用程序变得轻而易举。功能包括:嵌套路线映射动态路由模块化,基于组件的路由器配置路由参数,查询&#xff0…

常用的hive sql

细节:sql 中有涉及到正则匹配函数的,要注意转义符号 因为在不同语言下正则匹配规则是否需要加转义符号是不同的,举例,regexp_replace 函数,在hive sql的正则匹配规则的 \d 需要前面给它加上转义符号\,而在j…

RocketMQ5.0.0事务消息

目录 一、事务消息概览 二、事务消息实现机制 1. 事务消息发送流程 1):发送事务消息类图 2):生产端发送事务消息 3):Broker存储事务消息 2. 生产者提交或回滚事务消息 1):生产者发送提交或回滚事务请求 2):Broker处…

【谷粒学院】微信扫码支付(224~238)

224.项目第十五天内容介绍 225.课程评论实现过程分析 226.课程支付功能需求分析 1、课程支付说明 (1)课程分为免费课程和付费课程,如果是免费课程可以直接观看,如果是付费观看的课程,用户需下单支付后才可以观看 &am…

CAD轴测图怎么画?

很多新手设计师小伙伴,不知道CAD轴测图怎么画?其实很简单,浩辰CAD中的超级轴测功能,可以方便地将CAD平面图转化为轴侧图,是绘制管线系统图的好帮手。今天就和小编一起来看看在浩辰CAD软件中通过调用超级轴测命令来绘制…

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 顺序查找实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代码。使用C引用主要是为了简化指针的使用&a…