Nex.js Web 应用程序 SSG 与 SSR——选择正确的渲染方法

news2024/10/7 19:19:01

Next.js,一个流行的React框架,改变了开发人员构建现代Web应用程序的方式。它提供了强大的功能,例如服务器端渲染 (SSR) 和静态站点生成 (SSG),可优化应用程序的性能和用户体验。在这篇博文中,我们将探讨 SSG 和 SSR 之间的主要区别、它们的优势、何时选择其中一种方法,以及如何使用 AWS Amplify 部署这两种方法。Amplify 是一个完整的解决方案,可让前端 Web 和移动开发人员在 AWS 上轻松构建、交付和托管全栈应用程序。

文章目录

  • 什么是静态站点生成 (SSG)?
    • SSG 的优势
  • 什么是服务器端渲染 (SSR)?
    • SSR SSR 的优势
  • 何时选择 SSG 或 SSR
    • 考虑您的业务需求
  • Nex.js 中的 SSG 与 SSR,选择正确的渲染方法
    • SSG 方法
    • SSR 方法
  • 常踩的坑
  • 结论

什么是静态站点生成 (SSG)?

静态站点生成,顾名思义,在构建时生成静态 HTML 文件。每次构建应用程序时,都会创建一堆页面。然后将这些文件提供给用户,这意味着当用户访问网站时,服务器不需要做任何额外的工作。此方法非常适合内容不经常更改的网站,例如博客或文档网站。

SSG 的优势

  • 速度:直接提供预渲染的 HTML 文件,从而缩短加载时间。
  • 可扩展性:内容交付网络 (CDN) 可以轻松提供静态文件,从而提高应用程序处理全球更多全球流量的能力。

什么是服务器端渲染 (SSR)?

服务器端呈现涉及在用户请求时为服务器上的每个页面生成 HTML。使用 SSR,有一个服务器可以预渲染页面 - 它就像一个模板,您可以将变量插入其中,服务器处理所有渲染。这发生在请求时,因此当用户请求页面时,他们会获得服务器端呈现的页面。此呈现全部发生在服务器端,永远不会在浏览器中运行。因此,与 SSG 不同,SSG 中的页面已在服务器中呈现,等待提供给客户端,SSR 在收到请求时在服务器上呈现页面。SSR 非常适合具有频繁变化的动态或个性化内容的网站,例如电子商务网站或社交媒体平台。

SSR SSR 的优势

  • 一致的用户体验:用户可以看到即时生成的最新内容,确保他们始终拥有最新信息。
  • 个性化:SSR 允许您根据用户偏好或其他动态数据提供独特的内容。

何时选择 SSG 或 SSR

  • 您的内容是否经常更新?如果您的内容不经常更改,SSG 是提高性能和可扩展性的更好选择。对于动态内容,SSR 可确保用户看到最新信息。
  • 您的网站是否提供交互式用户体验?SSR 网站提供交互式用户体验,而 SSG 网站主要是静态网站,几乎没有动态内容,除非您的网站与 CSR 或 SSR 相结合。
  • 是否要在构建时或运行时产生渲染成本?如果要在构建时产生渲染成本,请选择 SSG,在运行时产生 SSR。
  • 你有搜索引擎优化要求吗?SSR 和 SSG for SEO 之间的主要区别仅在于服务器响应时间。

考虑您的业务需求

虽然 SSG 提供了出色的 SEO 优势,但 SSR 为动态内容和个性化提供了更好的支持,这可能对搜索排名至关重要。

  • 用户体验:考虑用户是否需要实时数据或个性化内容。如果是这样,SSR 是更好的选择。否则,SSG 将以更低的服务器要求提供更快的体验。
  • 最新数据:SSR 页面将始终显示最新数据,因为它们是随着用户的每个请求在服务器上生成的。对于每个请求,您始终可以确保您拥有最新/最新的信息。

Nex.js 中的 SSG 与 SSR,选择正确的渲染方法

在本文中,我们将在 Next.js 中讨论两种渲染方法:SSG 和 SSR。我们还将提供一个示例代码库,帮助您确定应用程序的最佳呈现方法。

Next.js 支持生成“n”个动态生成的路由的功能。在我们的示例代码库中,我获取了过去几天的 100 篇顶级 Hacker News 帖子,并将这些 ID 呈现到主页上。

单击时,每个页面都会显示帖子的详细信息。这些页面中的每一个也将具有“pages/[hackerNewsArticleId]”这样的路由。您可以在指定为 [slug] 的页面文件夹中看到该模板页面的可用方式。

现在,您可能会问我们如何定义要静态生成的路径列表?我们将使用两个 NextJS 函数: getStaticPropsgetStaticPaths

getStaticProps 将在构建时预呈现页面,从 Hacker News API 获取帖子信息列表,并将该信息传递到我们组件的 props 以及 getStaticPath 中。

我们的第二个函数 getStaticPaths 是动态路由的关键。它将从 ID 接收 ID getStaticProps 列表,并创建一个路径对象列表,如下所示:

export async function getStaticPaths() { 
  return { 
    paths: [{ params: { id: '1' } }, { params: { id: '2' } }], 
    fallback: false, // can also be true or 'blocking' 
  } 
}

接下来.JS现在将摄取此路径列表,并为每个参数生成一个新页面。我们现在还允许引入黑客新闻 ID 的主要组件呈现以路由到单个页面。如果你去我们的动态渲染的组件页面,你会看到我们再次调用getStaticProps方法来调用黑客新闻细节端点来获取帖子的标题、投票等。请注意,这是编译时博客文章的快照。

SSG 方法

我们将介绍如何从这个 Github 存储库部署一个 SSG Next.js 应用程序到 Amplify。首先,请单击下面以在您自己的环境中部署此项目。以下是有关使用 Amplify 进行部署和托管的更多信息。

在这里插入图片描述

选择连接到 GitHub 并授权 aws-amplify-console。

在这里插入图片描述
在“部署应用”页上,继续并选择“Create new role”,保留 Amplify 后端角色的所有默认值。

在这里插入图片描述

创建角色后,在“Deploy App页上刷新现有角色,然后选择刚创建的角色。选择“Save and Deploy”。

部署应用需要 2-3 分钟。出现该框时单击 Continue。然后,您可以在 Amplify 应用进入预配、构建和部署阶段时进行监控。

在这里插入图片描述

完成部署后,您将能够访问域名下托管的网站。

在这里插入图片描述

选择域后,您将导航到 Amplify 应用程序,该应用程序将显示您的 SSG Next.js 应用程序。

在这里插入图片描述
在这里插入图片描述

SSR 方法

我们将研究如何将NextJS Web应用程序从GitHub直接部署到Amplify。

惊喜!实际上,当我们部署到 Amplify 时,我们已经部署了一个 SSR 页面。Next.JS 的惊人之处在于,您可以在构建时生成一些页面,而其他页面仍然可以利用 SSR 呈现动态数据。

为了对特定页面使用服务器端渲染,我们导出一个名为getServerSideProps的异步函数。服务器将在每次请求时调用此函数。

现在,在您的托管链接上,导航到 /ssr 路线(即 https://main.amplifyapp.com/ssr)。现在,您应该看到如下所示的页面:

在这里插入图片描述

常踩的坑

Next.js 需要从非常流行的前端框架进行不同的范式转变,利用Create React App(CRA)和React Router 库。

CRA 是一个入门工具包,为您提供用于创建 React 应用程序的样板项目。CRA 使用客户端呈现 (CSR),这意味着您的应用程序在浏览器中呈现,通常最佳做法是根据用户的交互分解网络请求。与 SSG 相比,您现在必须一次加载所有数据。

通过包含这些常见陷阱部分,我们希望您能从我们的错误中吸取教训,并节省一些时间和挫败感。

  • SSG 服务器端生成
    • 而不是将所有构建和数据获取时间传递给客户,您可能会因为拥有大型静态网站而等待站点构建数小时。每次静态页面数增加一倍,构建持续时间就会加倍。
      • 如果您有一个包含 10,000 个项目的电子商务网站,每个项目大约需要 1 秒来获取/构建,那么您正在查看近 3 小时的构建和部署。
      • 在此示例中,您可以采用增量静态重新生成路径,您可以在构建主网站捆绑包后创建和更新页面。这使您无需重建整个网站即可进行更改。
    • 数据获取
      • 在现代 Web 开发中,通常建议用户进行仅足以填充用户视口的 API 调用,并可能为后续用户操作预取数据。但是,使用 SSG,您将需要调用填充整个网页和所有潜在用户操作所需的所有 API。
    • 页面更新
      • 如果您经常更新网站上的某个页面,例如,包含多个部分的博客页面;SSG 可能会导致您非常频繁地为单个页面中包含的更改重新构建整个网站。
      • 页面是在发出请求之前生成的,因此,SSG 页面在构建时无法直接访问 HTTP 标头和查询参数等请求。如果要访问这些,除了 SSG 之外,还必须编写自定义中间件。
  • SSR 服务器端呈现
    • 延迟
      • 在生成过程中,有一些外部因素最终会影响页面加载速度,例如从外部 API 获取数据。如果 API 响应缓慢,页面生成加载时间会变慢。此外,由于 SSR 为每个请求生成每个页面,因此与 SSG 相比,这使其速度较慢。
      • 要使用 SSR 页面启用缓存并提高加载时间(速度),您需要在调用“getServerSideProps”时添加一个额外的 HTTP 标头 Cache-Control。请参阅此处的文档。详细了解缓存。
    • 可扩展性
      • SSR 要求服务器在每个请求上处理和生成前端,可扩展性较低且速度较慢;前提是网站有复杂的页面和大量的最终客户需要处理。
      • SSR 动态 HTML 不能由静态 CDN(内容交付网络,例如 CloudFront)缓存,这会导致往返服务器的行程更长,并且请求页面和服务器加载的第一个字节之间的时间变慢(TTFB:到第一个字节的时间)。
    • SEO
      • 尽管Google和Bing宣布他们利用相同的基于Chromium的爬虫和最新的渲染引擎,但Javascript仍然使搜索引擎解析页面的能力复杂化,并可能降低您的SEO排名。搜索引擎必须下载您的 Javascript 文件,并且可能不会等待整个捆绑包加载后再转到您网站的其他部分。归根结底,猜测Google或Bing如何对你的页面进行排名存在很多不确定性,让爬虫的生活更轻松可能是有意义的。

结论

SSG 和 SSR 都为不同类型的 Next.js 应用程序提供了独特的优势。通过了解项目的内容频率、SEO 要求、用户体验和开发复杂性,您可以做出明智的决定,在 Next.js 项目中是使用 SSG 还是 SSR。最终,选择取决于您的特定用例以及您愿意在性能、可扩展性和动态内容之间进行权衡。

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

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

相关文章

03. 程序在内存中被CPU执行

1. 程序是什么? 程序是由指令和数据组成的。 当我们使用计算机运行一个程序时,计算机会读取程序中的指令一步步执行,直到达到程序结束的地方。 程序的指令:就像一份菜谱,告诉计算机按照哪些步骤来做事情。 程序的数…

【原创】H3C三层交换机的路由模式

网络拓扑图 将三层交换机当路由器使用 交换机配置 <H3C>dis stp briefMST ID Port Role STP State Protection0 GigabitEthernet1/0/1 DESI LEARNING NONE0 GigabitEthernet1/0/2 …

docker常用中间件安装

文章目录 1、前言2、中间件安装2.1、mysql2.2、gitlab容器2.3、nacos2.4、redis2.5、xxljob2.6、zipkin2.7、sentinel2.8、seata2.8.1、获取镜像2.8.2、运行容器并获取配置 2.9、rockerMQ2.9.1、rockerMQ-namesrv2.9.2、rockerMQ-broker2.9.3、rockerMQ-console 2.10、jenkins2…

java企业工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…

文件分片上传

概要 在日常开发中上传文件是常见的功能&#xff0c;像使用 SpringBoot 作为服务端接收上传的文件是很方便的&#xff0c;但是默认情况下 SpringBoot 为我限定了单次上传文件的大小&#xff0c;默认是1MB&#xff0c;当我们单次上传的大小超过1MB的时候就会报错&#xff0c;这…

Vmware虚拟机操作系统和本地操作系统互Ping要求、解决方式讲解

Vmware虚拟机操作系统和本地操作系统互Ping讲解 在虚拟化环境中&#xff0c;如VMware&#xff0c;虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;和本地操作系统之间进行Ping测试是一项常见的任务。Ping测试可用于检查虚拟机是否能够与本地操作系统或其他网…

wap2app 隐藏系统状态栏

一、首先创建wap2App项目 1、文件》新建》项目 2、选择Wap2App项目&#xff1a;输入项目名称、网站首页地址&#xff08;如果是本地localhost的话改为你的IP地址即可&#xff09;&#xff0c;点击创建 二、创建完wap2App项目后 隐藏系统状态栏只要修改1、2选项即可 1、找到根…

智慧工地源码 智慧大屏、手机APP、SaaS模式

一、智慧工地可以通过安全八要素来提升安全保障&#xff0c;具体措施包括&#xff1a; 1.安全管理制度&#xff1a;建立科学完善的安全管理制度&#xff0c;包括安全标准规范、安全生产手册等&#xff0c;明确各项安全管理职责和要求。 2.安全培训教育&#xff1a;对工地人…

港科夜闻|香港科大商学院李莹莹教授获研究资助局(RGC)授予研资局高级研究员头衔...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大商学院李莹莹教授获研究资助局(RGC)授予“研资局高级研究员”头衔。李教授的研究项目“金融风险大数据”将利用金融大数据进行严谨、全面的统计研究&#xff0c;更准确地进行风险评估和预测&#xff0c;构建高质…

Linux内核开启BBR加速

升级内核 BBR 模块从 4.9 版本的内核中开始支持&#xff0c;CentOS7 的发布版标配的是 kernel-3.10&#xff0c;所以首先需要升级内核到大于等于 4.9 的版本&#xff0c;然后再更改设置开启 BBR。 查看内核版本 1) uname -r 3.10.0-1160.71.1.el7.x86_64YUM方式升级安装 1&…

跨境做独立站,如何低成本引流?

大家都知道&#xff0c;海外的消费习惯与国内不同&#xff0c;独立站一向是海外消费者的最喜欢的购物方式之一&#xff0c;这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台&#xff0c;其他平台可以靠平台自身流量来获得转化&#xff0c;而独立站本身没有流…

django.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.

运行django测试用例报错django.core.exceptions.AppRegistryNotReady: Apps arent loaded yet. 解决&#xff1a;在测试文件上方加上 django.setup() django.setup()是Django框架中的一个函数。它用于在非Django环境下使用Django的各种功能、模型和设置。 在常规的Django应用…

63.C++ mutable关键字

mutable 是C中的一个关键字&#xff0c;它用于修饰类的成员变量。当一个成员变量被声明为 mutable 时&#xff0c;它将允许在常量成员函数中修改这个成员变量的值&#xff0c;即使这个成员函数被声明为 const。 常量成员函数是类的成员函数&#xff0c;它们承诺不会修改类的成…

构建现代应用:Java中的热门架构概览

文章目录 1. 三层架构2. Spring框架3. 微服务架构4. Java EE&#xff08;Enterprise Edition&#xff09;5. 响应式架构6. 大数据架构7. 领域驱动设计&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;8. 安卓开发架构结论 &#x1f389;欢迎来到Java学习路线专栏~…

【算法竞赛宝典】猴子吃桃

【算法竞赛宝典】猴子吃桃 题目描述代码展示答案 题目描述 代码展示 //猴子吃桃 #include <iostream>using namespace std;int main() {int day 9, x1, x2 1;while (day > 0) {x1 (x2 1) * 2;//第&#xff11;天的桃子数是第&#xff12;的天的桃子数加&#xff…

[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。

本插件可以在虚幻的蓝图 Actor&#xff0c; Obiect&#xff0c;UMG 里面指定绑定和执行消息&#xff0c;可带自定义参数。 参数支持 Bool&#xff0c;Byte&#xff0c;Int&#xff0c;Int64&#xff0c;Float&#xff0c;Name&#xff0c;String&#xff0c;Text&#xff0c;Ve…

自定义spring-boot-start的jar包被引用时,提示找不到bean

类似这个报错&#xff1a; 重点要看一下我们自定义的start包下的config配置 BeanConditionalOnProperty(prefix "file", value "iSenable", havingValue "true")public FileServiceTemplate fileServiceTemplate(){return new FileServiceTe…

开开心心带你学习MySQL数据库篇之二

如何增大自己进入大厂的概率? 作业写得扎实,博客写得扎实,github/gitee搞的扎实 > 进入大厂的概率就会超过其他同学. 对于最近java行业有点饱和的看法? 大家不要只关注编程语言,这就把路走窄了!!! ~~ 投简历的时候,各种相关的岗位都是可以尝试的 ~~ 除了投后端开发,还…

Lliux管理员一些小技巧

1、查看bash日志 history命令显示日期和时间 2、打印时候对行列转换 xargs命令是改变已存在的文件的输出格式。“cat 文件名”是根据文件的行分隔符输出显示在屏幕上。如想改变一下&#xff0c;想把所有行合并为一行&#xff0c;就可以使用管道及xargs命令。 cat 文件名 |…

Bevformer:通过时空变换从多摄像机图像学习鸟瞰图表示

论文地址&#xff1a;BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers 代码地址&#xff1a;https://github.com/zhiqi-li/BEVFormer 论文背景 三维视觉感知任务&#xff0c;包括基于多摄像机图像的三维检测…