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 的渲染机制,并在实际开发中灵活应用它们。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android PMS(Package Manager Service)源码介绍

文章目录 前言一、PMS 启动流程二、APK 安装流程三、APK 卸载流程四、权限管理静态权限动态权限 五、 数据存储与一致性六、 PMS 的安全性策略1、权限检查2、签名认证3、动态权限管理4、应用安装验证5、保护系统目录 七、PMS 调试方法总结 前言 PackageManagerService&#xf…

OSPTrack:一个包含多个生态系统中软件包执行时生成的静态和动态特征的标记数据集,用于识别开源软件中的恶意行为。

2024-11-22 &#xff0c;由格拉斯哥大学创建的OSPTrack数据集&#xff0c;目的是通过捕获在隔离环境中执行包和库时生成的特征&#xff0c;包括静态和动态特征&#xff0c;来识别开源软件&#xff08;OSS&#xff09;中的恶意指标&#xff0c;特别是在源代码访问受限时&#xf…

Web登录页面设计

记录第一个前端界面&#xff0c;暑假期间写的&#xff0c;用了Lottie动画和canvas标签做动画&#xff0c;登录和注册也连接了数据库。 图片是从网上找的&#xff0c;如有侵权私信我删除&#xff0c;谢谢啦~

MySQL45讲 第29讲 如何判断一个数据库是不是出问题了?——阅读总结

文章目录 MySQL45讲 第二十九讲 如何判断一个数据库是不是出问题了&#xff1f;——阅读总结一、检测数据库实例健康状态的重要性二、常见检测方法及问题分析&#xff08;一&#xff09;select 1 判断法&#xff08;二&#xff09;查表判断法&#xff08;三&#xff09;更新判断…

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复

cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…

论文阅读笔记 | EEG:运动执行过程中的ERD

参考&#xff1a;https://mp.weixin.qq.com/s/RmcPSLv1ITMZZwqe2uZ_og?token1093147649&langzh_CN

Android U ART young cc流程分析

概述&#xff1a; 众所周知jvm虚拟机为了提高内存回收效率&#xff0c;更高效的进行内存管理与回收&#xff0c;对堆内存进行了分代管理比如hotspot虚拟机的新生代&#xff0c;老年代。根据各代的特征&#xff08; 新生代对象分配频繁而生存周期短&#xff0c;老年代生存周期长…

C++ 11重点总结1

智能指针 智能指针: C11引入了四种智能指针: auto_ptr(已弃用)、unique_ptr、shared_ptr和weak_ptr。智能指针可以更有效地管理堆内存,并避免常见的内存泄漏问题。 shared_ptr: 自定义删除器。 shared_ptr使用引用计数来管理它指向的对象的生命周期。多个shared_ptr实例可以指向…

Sickos1.1 详细靶机思路 实操笔记

Sickos1.1 详细靶机思路 实操笔记 免责声明 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担…

GB28181系列二:SIP信令

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、SIP报文介绍 二、SIP交互流程&#xff1a; 1、Session Model 2、Pager Model 3、SIP信令交互过程中的3个定义 三、媒体传输&#xff08;SDP和RTP&#xff09; 一、SIP报文介绍 这里将会介绍SIP…

【接口自动化测试】一文从0到1详解接口测试协议!

接口自动化测试是软件开发过程中重要的环节之一。通过对接口进行测试&#xff0c;可以验证接口的功能和性能&#xff0c;确保系统正常运行。本文将从零开始详细介绍接口测试的协议和规范。 定义接口测试协议 接口测试协议是指用于描述接口测试的规范和约定。它包含了接口的请求…

CentOS7执行yum命令报错,已加载插件:fastestmirrorLoading mirror speeds from cached hostfile

一、出现一下异常问题&#xff0c;表示域名没有配置或配置错误 问题一&#xff1a; 0curl: (6) Could not resolve host: mirrors.aliyun.com; 未知的错误 问题二&#xff1a;虚拟机使用ping主机&#xff0c;提示network unreachable 2.原因分析 出现这个问题是因为yum在安装…

【Threejs进阶教程-着色器篇】9.顶点着色器入门

【Threejs进阶教程-着色器篇】9.顶点着色器入门 本系列教程第一篇地址&#xff0c;建议按顺序学习认识顶点着色器varying介绍顶点着色器与片元着色器分别的作用Threejs在Shader中的内置变量各种矩阵gl_Position 尝试使用顶点着色器增加分段数增强效果 制作平面鼓包效果鼓包效果…

Ubuntu 硬盘分区并挂载

一、什么是挂载 1.挂载的定义 在 Ubuntu&#xff08;或其他 Linux 系统&#xff09;中&#xff0c;挂载&#xff08;Mount&#xff09; 是将一个存储设备或分区连接到系统的文件系统层次结构中的过程。挂载后&#xff0c;你可以通过某个目录&#xff08;挂载点&#xff09;访问…

【前端开发】一文带你快速入门 JavaScript(上)Web 前端必备程序语言 | 环境搭建与基础知识

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析

在数字科技日新月异的今天&#xff0c;视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台&#xff0c;提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务&#xff0c;广泛应用于…

Qt读写Usb设备的数据

Qt读写Usb设备的数据 问题:要读取usb设备进行通讯&#xff0c;qt好像没有对应的库支持。解决&#xff1a;libusbwindow下载 :Linux下载: QtUsb 开源的第三方库库里面的函数说明&#xff1a;window版本&#xff1a;Linux中也提供的直接下载测试代码&#xff1a;库下载&#xff1…

2024最新python使用yt-dlp

2024最新python使用yt-dlp下载YT视频 1.获取yt的cookie1&#xff09;google浏览器下载Get cookies.txt LOCALLY插件2&#xff09;导出cookie 2.yt-dlp下载[yt-dlp的GitHub地址](https://github.com/yt-dlp/yt-dlp?tabreadme-ov-file)1&#xff09;使用Pycharm(2024.3)进行代码…

一加ACE 3 Pro手机无法连接电脑传输文件问题

先说结论&#xff1a;OnePlus手机无法连接电脑传输数据的原因&#xff0c;大概率是一加数据线的问题。尝试其他手机品牌的数据线&#xff08;比如华为&#xff09;&#xff0c;再次尝试。 连接电脑方法&#xff1a; 1 打开开发者模式&#xff08;非必要操作&#xff09; 进入…

java:aqs实现自定义锁

aqs采用模板方式设计模式&#xff0c;需要重写方法 package com.company.aqs;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;…