Next.js 独立开发教程(八):静态渲染与动态渲染的应用

系列文章目录

Next.js 开发教程(一):入门指南-CSDN博客

Next.js 开发教程(二):从零构建仪表盘应用-CSDN博客

Next.js 开发教程(三):CSS 样式的完整指南-CSDN博客

Next.js 独立开发教程(四):字体与图像优化指南-CSDN博客

Next.js 独立开发教程 (五):创建布局和页面-CSDN博客

Next.js 独立开发教程(六):页面导航与路由-CSDN博客

Next.js 独立开发教程(七):与数据库集成-CSDN博客

有兴趣的可以蹲个后续,我会陆续发布一系列的文章。

以建设独立开发能力为目标,精选一些实用的技术和非技术的内容跟大家分享。


目录

系列文章目录

前言

1. 渲染模式简介

2. 静态生成(SSG)

2.1 静态生成的基本使用

2.2 优点与适用场景

2.3 增量静态再生成(ISR)

3. 服务器端渲染(SSR)

3.1 服务器端渲染的基本使用

3.2 优点与适用场景

3.3 性能影响

4. 混合渲染模式

4.1 混合模式的使用

5. 静态生成与动态渲染的最佳实践

6. 总结


前言

在现代 Web 应用开发中,页面渲染方式的选择直接影响应用的性能、SEO 和用户体验。Next.js 提供了多种渲染机制,允许开发者根据具体需求选择静态生成(Static Generation)和服务器端渲染(Server-side Rendering)。本文将深入探讨这两种渲染方式,并通过实际案例讲解如何在 Next.js 中实现静态渲染和动态渲染。

---

1. 渲染模式简介

在 Next.js 中,您可以选择以下几种页面渲染方式:

  • 静态生成 (Static Generation, SSG):在构建时生成页面内容。这种方式适合不常变动的内容,能够提供更高的性能。
  • 服务器端渲染 (Server-side Rendering, SSR):在每次请求时动态生成页面。这种方式适用于需要实时数据的场景。
  • 增量静态再生成 (Incremental Static Regeneration, ISR):结合了静态生成和服务器端渲染的优点,允许您指定页面更新频率。

Next.js 的强大之处在于,它允许您在同一个应用中灵活选择这些渲染方式。

2. 静态生成(SSG)

静态生成是指在构建时生成 HTML 文件,这样在用户访问页面时可以直接提供静态文件,极大地提升了页面加载速度和 SEO 表现。

2.1 静态生成的基本使用

使用静态生成的方法,您可以在 `getStaticProps` 中获取数据,并在构建时生成 HTML 页面。以下是一个基础示例:

// pages/products.js
import { query } from '../lib/db';export default function Products({ products }) {return (<div><h1>产品列表</h1><ul>{products.map(product => (<li key={product.id}>{product.name} - ${product.price}</li>))}</ul></div>);
}export async function getStaticProps() {const products = await query('SELECT * FROM products');return {props: {products}};
}

在上述代码中,`getStaticProps` 会在构建时执行,查询数据库中的产品数据,并将其作为 props 传递给页面组件。这意味着页面会在构建时生成,用户访问时直接获取已生成的静态 HTML。

2.2 优点与适用场景

  • 性能提升:静态页面的加载速度非常快。
  • SEO 优化:页面的内容在构建时就已经渲染,搜索引擎可以抓取到完整的内容。
  • 适用场景:适用于内容不经常更新的网站,例如博客、公司主页、产品展示页面等。

2.3 增量静态再生成(ISR)

增量静态再生成允许您在静态生成的基础上,指定哪些页面可以在请求时重新生成。这对于需要定期更新但不希望每次请求都重新生成整个网站的场景非常适合。

export async function getStaticProps() {const products = await query('SELECT * FROM products');return {props: {products},revalidate: 60 // 每 60 秒重新生成一次页面};
}

此时,Next.js 会在页面过期后自动重新生成页面,并在下次请求时提供更新后的内容。

3. 服务器端渲染(SSR)

服务器端渲染指的是在每次请求时,服务器会动态生成 HTML 内容,然后返回给用户。这适用于需要实时数据或频繁更新的数据页面。

3.1 服务器端渲染的基本使用

与静态生成不同,服务器端渲染使用 `getServerSideProps` 来获取每次请求时的数据,并在服务器端生成页面内容。

// pages/dashboard.js
import { query } from '../lib/db';export default function Dashboard({ users }) {return (<div><h1>用户列表</h1><ul>{users.map(user => (<li key={user.id}>{user.name} - {user.email}</li>))}</ul></div>);
}export async function getServerSideProps() {const users = await query('SELECT * FROM users');return {props: {users}};
}

在这个例子中,`getServerSideProps` 会在每次请求时运行,确保页面数据始终是最新的。

3.2 优点与适用场景

  • 实时数据:适合需要实时或频繁变化数据的应用,例如用户动态、仪表盘、订单等页面。
  • 适用场景:适合用户特定内容、管理后台、个性化推荐等场景。

3.3 性能影响

服务器端渲染需要在每次请求时生成页面,因此比静态生成的页面慢,并且对服务器的性能要求较高。对于高流量的站点,可能需要更复杂的缓存策略或使用分布式部署来应对流量。

4. 混合渲染模式

Next.js 允许您将静态生成和服务器端渲染结合使用,以最大限度地提升应用性能和灵活性。您可以根据每个页面的需求,选择适当的渲染方式。

4.1 混合模式的使用

您可以在 Next.js 应用中同时使用静态生成和服务器端渲染。例如,展示大部分静态内容的仪表盘页面,但部分动态内容(如用户数据)使用服务器端渲染:

// pages/dashboard.js
import { query } from '../lib/db';export default function Dashboard({ users }) {return (<div><h1>仪表盘</h1><p>欢迎,用户!</p><ul>{users.map(user => (<li key={user.id}>{user.name} - {user.email}</li>))}</ul></div>);
}export async function getServerSideProps() {const users = await query('SELECT * FROM users');return {props: {users}};
}

这种方式允许应用在不同页面之间灵活切换渲染模式,根据数据更新频率和用户需求,选择静态生成或服务器端渲染。

5. 静态生成与动态渲染的最佳实践

  1. 静态生成适用于不常变化的内容:例如博客、新闻网站等,静态生成能够提供更好的性能和 SEO 优化。
  2. 服务器端渲染适用于动态内容:例如实时显示用户数据、实时更新的仪表盘等场景,服务器端渲染可以保证数据的实时性。
  3. 利用 ISR 优化静态生成:对于部分动态内容,可以使用增量静态再生成来平衡静态页面的高性能与动态内容的实时性。
  4. 混合使用多种渲染模式:在同一个项目中,合理结合静态生成和服务器端渲染,根据每个页面的需求来选择最佳的渲染方式。

6. 总结

Next.js 提供了多种强大的渲染方式,使开发者可以根据应用需求选择最合适的渲染策略。静态生成(SSG)和服务器端渲染(SSR)各有优势,前者适用于内容较为静态的场景,后者适用于需要实时更新数据的场景。此外,增量静态再生成(ISR)提供了一种折中的方式,允许您在保留静态内容性能优势的同时,进行部分动态更新。

通过合理选择和配置渲染模式,您可以在 Next.js 中构建高性能、灵活且易于维护的全栈应用。希望通过本文的讲解,您能够更好地理解 Next.js 的渲染机制,并在实际开发中灵活应用它们。

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

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

相关文章

大数据技术之Spark :我快呀~

在 MapReduce 为海量数据的计算服务多年后&#xff0c;随着时代的发展和 Spark 等新技术的出现&#xff0c;它的劣势也慢慢的凸显出来了&#xff1a; 执行速度慢。编程复杂度过高。 先看第一点 2000 年代诞生的 MapReduce &#xff0c;因为计算资源有限&#xff0c;所以 Map…

新160个crackme - 105-royalaccezzcrackme

运行分析 需破解Name和Serial&#xff0c;点击OK没反应 PE分析 ASM程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到关键字符串 进行静态分析&#xff0c;逻辑如下&#xff1a;1、Name长度大于4&#xff0c;小于212、fun_1返回值为1 对func_1进行动态调试分…

【RISC-V CPU 专栏 -- 香山处理器介绍】

文章目录 RISC-V 香山处理器介绍雁栖湖处理器南湖处理器RISC-V 香山处理器介绍 相信很多小伙伴对于“香山”都不陌生,它是一款开源RISC-V处理器核,香山的每一代架构,都是采用了湖的名字,第一代架构被命名为雁栖湖,第二代架构则叫做 “南湖”。 “雁栖湖”这款处理器的 R…

远程视频验证如何改变商业安全

如今&#xff0c;商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力&#xff0c;但…

【TQ2440】02 串口连接进入u-boot

需要收到的板子已经烧写好系统或u-boot&#xff0c;看开机液晶屏底下的四个LED灯有没有亮黄绿色&#xff0c;没有就是还没烧写u-boot&#xff0c;需要先使用Jlink烧写u-boot 进入 uboot 的下载模式&#xff0c;如果从 Nor Flash 启动默认的就是进入 uboot 的下载模式&#xff…

QCommandLinkButton控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

【Vue】Ego商城项目跟做

技术栈 Vue全家桶&#xff1a;Vue VueRouter Vuex Axios ElementUI 依赖安装 网络请求&#xff1a;npm install --save axios --no-fund Element&#xff1a;vue add element 后端相关依赖&#xff1a;npm install --save express cors mysql --no-fund token&#xff1a;np…

python简单算法

冒泡 def boll(lis):i 0while i<len(lis)-1:j 0while j<len(lis)-1-i:if lis[j] > lis[j1]:lis[j],lis[j 1] lis[j1],lis[j]j1i1选择排序 def selct1(lit):i 0while i<len(lit)-1:j i1min1 iwhile j < len(lit):if lit[j] < lit[min1]:min1 jj 1li…

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…

【Docker】常用命令汇总

Docker 是1个开源的应用容器引擎&#xff0c;基于Go 语言并遵从 Apache2.0 协议开源。 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机制&#xff0c;相…

如何选择最适合企业的ETL解决方案?

在今天的大数据时代&#xff0c;企业的数据管理和处理变得愈发重要。企业也越来越依赖于数据仓库和数据湖来提取、转换和加载&#xff08;ETL&#xff09;关键业务信息。一个高效、灵活的ETL解决方案不仅能提升数据处理能力&#xff0c;还能为企业决策提供有力支持。然而&#…

EG3D: Efficient Geometry-aware 3D Generative Adversarial Networks 学习笔记

1 Contributions 混合显式-隐式网络架构&#xff1a;提出了一种 Tri-plane 的3D表征方法&#xff0c;结合显式体素网格与隐式解码器的优点 速度快&#xff0c;内存效率高&#xff1b; 支持高分辨率生成&#xff0c;保持3D表征的灵活性和表达能力。与纯显式或隐式方法相比&#…

第十六届蓝桥杯模拟赛(第一期)-Python

本次模拟赛我认为涉及到的知识点&#xff1a; 分解质因数 Python的datetime库 位运算 简单dp 1、填空题 【问题描述】 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结…

ubuntu 安装 docker 记录

本文假设系统为 Ubuntu&#xff0c;从 16.04 到 24.04&#xff0c;且通过 APT 命令安装。理论上也其他 Debian 系的操作系统。 WSL 也一样。 感觉 Docker 官方在强推 Docker Desktop&#xff0c;搜索 Docker 安装文档&#xff0c;一不小心就被导航到了 Docker Desktop 的安装页…

太速科技-512-基于ZU19EG的4路100G 8路40G的光纤汇流计算卡

基于ZU19EG的4路100G 8路40G的光纤汇流计算卡 一、板卡概述 本板卡系我司自主设计研发&#xff0c;基于Xilinx公司Zynq UltraScale MPSOC系列SOC XCZU19EG-FFVC1760架构&#xff0c;ARM端搭载一组64-bit DDR4&#xff0c;总容量达4GB&#xff0c;可稳定运行在2400MT/s…

C#基础56-60

56.字符数组x中存有任意一串字符&#xff1b;串中的所有小写字母改写成大写字母&#xff0c;如果是大写字母改为小写字母&#xff0c;其他字符不变。最后把已处理的字符串仍重新存入字符数组x中&#xff0c;最后调用函数把结果输出到控制台中。 57.求出100以上1000以内所有个位…

计算机网络:应用层知识点概述及习题

网课资源&#xff1a; 湖科大教书匠 1、概述 习题1 1 在计算机网络体系结构中&#xff0c;应用层的主要功能是 A. 实现进程之间基于网络的通信 B. 通过进程之间的交互来实现特定网络应用 C. 实现分组在多个网络上传输 D. 透明传输比特流 2 以下不属于TCP/IP体系结构应用层范畴…

深入浅出摸透AIGC文生图产品SD(Stable Diffusion)

hihi,朋友们,时隔半年(24年11月),终于能腾出时间唠一唠SD了🤣,真怕再不唠一唠,就轮不到SD了,技术更新换代是在是太快! 朋友们,最近(24年2月)是真的没时间整理笔记,每天都在疯狂的学习Stable Diffusion和WebUI & ComfyUI,工作实在有点忙,实践期间在飞书上…

uniapp+vue2+uview2.0导航栏组件二次封装

样式 代码 <template><view class"navBar"><u-navbar :title"title" :titleColor"titleColor" :bgColor"bgColor" :safeAreaInsetTop"safeAreaInsetTop":autoBack"true" leftClick"leftClic…

【Git】常用命令汇总

目录 一.安装及配置 1.在 Windows 上安装 2.用户信息 3.差异分析工具 二.基础 1.创建仓库 2.提交与修改 三.分支管理 1.创建分支 2.合并分支 四.远程操作 1.管理 Git 仓库中的远程仓库 2.数据的获取与推送 五.标签 1.创建轻量标签和附注标签 2.查看标签和标签信…