WHAT - NextJS 系列之 Rendering - Server Rendering Strategies

目录

  • 1. Static Rendering(静态渲染)
    • 特点:
    • 实现方式:
  • 2. Dynamic Rendering(动态渲染)
    • 特点:
    • 实现方式:
  • 3. Streaming Rendering(流式渲染)
    • 特点:
    • 实现方式:
  • 总结

相关官方文档:https://nextjs.org/docs/app/building-your-application/rendering/server-components#server-rendering-strategies

There are three subsets of server rendering: Static, Dynamic, and Streaming.

在 React 和 Next.js 中,服务器端渲染(SSR)有三种主要的实现方式:Static RenderingDynamic RenderingStreaming Rendering。这些方式在处理数据获取、页面渲染和响应客户端请求的方式上有所不同。

1. Static Rendering(静态渲染)

静态渲染是在构建时(Build Time)生成 HTML 文件的过程。这种方式适用于内容较少变化的页面,如博客文章、产品展示等。

特点:

  • 预渲染:在构建应用时,所有需要的页面都已经生成好静态 HTML 文件。
  • 高性能:因为生成的页面在构建时就已经完成,不需要在每次请求时重新生成。
  • CDN 友好:静态页面可以轻松部署到 CDN 上,实现快速分发和加载。

实现方式:

在 Next.js 中,使用 getStaticPropsgetStaticPaths 可以实现静态渲染。

// pages/post/[id].js
import { useRouter } from 'next/router';export default function Post({ post }) {return (<div><h1>{post.title}</h1><p>{post.content}</p></div>);
}// 在构建时调用
export async function getStaticPaths() {const paths = [ /* 预生成的路径数组 */ ];return { paths, fallback: false };
}export async function getStaticProps({ params }) {const post = await fetchPostData(params.id);return { props: { post } };
}

2. Dynamic Rendering(动态渲染)

动态渲染是在每次请求时生成 HTML 的过程。这种方式适用于内容频繁变化或依赖用户输入的页面,如用户仪表盘、搜索结果等。

特点:

  • 实时数据:每次请求都会触发服务器端渲染,确保用户获取最新数据。
  • 灵活性高:适合需要频繁更新内容或个性化内容的场景。
  • 性能开销:每次请求都会占用服务器资源,因此需要考虑服务器性能和响应时间。

实现方式:

在 Next.js 中,使用 getServerSideProps 可以实现动态渲染。

// pages/dashboard.jsexport default function Dashboard({ data }) {return (<div><h1>Dashboard</h1><p>{data}</p></div>);
}// 每次请求都会调用
export async function getServerSideProps(context) {const data = await fetchDataForDashboard();return { props: { data } };
}

3. Streaming Rendering(流式渲染)

流式渲染是一种逐步发送 HTML 到客户端的渲染方式,这样客户端可以尽早看到部分内容,而无需等待整个页面渲染完成。适用于大型页面或复杂应用的优化。

特点:

  • 快速响应:客户端可以更早地开始解析和渲染部分内容,提高感知性能。
  • 渐进增强:逐步发送内容,使用户感觉页面加载速度更快。
  • 适合大页面:对于需要渲染大量内容的页面非常有效。

实现方式:

在 Next.js 中,使用 React 18 引入的 React.lazySuspense 组件,结合新的流式渲染支持,可以实现流式渲染。

// pages/index.js
import ClientComponent from '../components/ClientComponent';export default function Home() {return (<div><h1>Next.js Streaming Example</h1><ClientComponent /></div>);
}// components/ClientComponent.js
'use client';import React, { Suspense } from 'react';
const ServerComponent = React.lazy(() => import('./ServerComponent'));export default function ClientComponent() {return (<div><h1>Client Component</h1><Suspense fallback={<div>Loading...</div>}><ServerComponent /></Suspense></div>);
}// components/ServerComponent.js
import React from 'react';export default function ServerComponent() {// 模拟服务器端数据获取const data = new Promise((resolve) => {setTimeout(() => resolve('Server-side Data'), 3000);});return (<div><h1>Server Component</h1><p>{data}</p></div>);
}

在这个示例中,通过 SuspenseReact.lazy 实现流式渲染。当用户访问页面时,服务器会立即发送初始的 HTML,客户端在接收并解析后,可以逐步加载 ClientComponentServerComponent,使用户能够尽早看到部分内容。

总结

  • 静态渲染(Static Rendering):在构建时生成静态 HTML,适用于内容较少变化的页面。
  • 动态渲染(Dynamic Rendering):在请求时生成 HTML,适用于内容频繁变化的页面。
  • 流式渲染(Streaming Rendering):逐步发送 HTML,提高感知性能,适用于大型页面或复杂应用。

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

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

相关文章

通过ESP32读取I2C温湿度传感器项目:协议与代码实例

简介 在本项目中&#xff0c;我们将使用ESP32开发板读取I2C温湿度传感器的数据。我们将详细介绍I2C协议&#xff0c;并提供图文并茂的代码实例&#xff0c;帮助你快速上手。 项目流程 选择硬件&#xff1a;ESP32开发板、I2C温湿度传感器&#xff08;如DHT12、HTU21D、SHT30等&a…

硬盘数据恢复软件,推荐5种适合你的方法来恢复硬盘数据

硬盘数据恢复软件&#xff0c;作为解决数据丢失问题的关键工具&#xff0c;帮助用户在重要文件丢失时迅速找回数据。本教程介绍5种恢复实用硬盘数据方法&#xff0c;适应不同类型和严重程度的数据损坏情况。 文章摘要&#xff1a; 一. 硬盘数据恢复软件 二. 数据恢复原理 三. …

在Qt5中创建、读取和写入JSON文件的完整指南

Qt5 提供了一个非常方便的JSON解析器,使得在C++中处理JSON数据变得非常简单。本文将详细介绍如何在Qt5中创建、读取和写入JSON文件。 读取JSON文件的示例 假设我们有一个名为test.json的JSON文件,内容如下: {"appDesc": {"description": "SomeD…

LED显示屏的换帧频率与刷新频率:技术细节与市场发展

在当今数字化时代&#xff0c;LED显示屏已成为信息传递和广告宣传的重要工具。然而&#xff0c;对于普通消费者来说&#xff0c;LED显示屏背后的技术细节可能仍然是一个谜。今天&#xff0c;我们将深入探讨LED显示屏中的两个关键概念&#xff1a;换帧频率和刷新频率&#xff0c…

分布式锁实现方案

分布式锁 1 什么是分布式锁 ​ 就是在分布式环境下&#xff0c;保证某个公共资源只能在同一时间被多进程应用的某个进程的某一个线程访问时使用锁。 2 几个使用场景分析 一段代码同一时间只能被同一个不同进程的一个线程执行 库存超卖 (库存被减到 负数)&#xff0c;上面案…

预训练是什么?

预训练是什么&#xff1f; 图像领域的预训练 在介绍图像领域的预训练之前&#xff0c;我们首先介绍下卷积神经网络&#xff08;CNN&#xff09;&#xff0c;CNN 一般用于图片分类任务&#xff0c;并且CNN 由多个层级结构组成&#xff0c;不同层学到的图像特征也不同&#xff…

【C++】Cmake入门|掌握cmake的基本操作

前言&#xff1a; CMake是开源、跨平台的构建工具&#xff0c;可以让我们通过编写简单的配置文件去生成本地的Makefile&#xff0c;这个配置文件是独立于运行平台和编译器的&#xff0c;这样就不用亲自去编写Makefile了&#xff0c;而且配置文件可以直接拿到其它平台上使用&am…

【科学计算与可视化】2. pandas 基础

1. 安装 Pandas 首先&#xff0c;确保你已经安装了 Pandas。你可以使用以下命令安装&#xff1a;pip install pandas 2. 导入 Pandas 在开始使用 Pandas 之前&#xff0c;你需要先导入它&#xff1a;import pandas as pd 3. 创建数据结构 Pandas 主要有两种数据结构&#…

基于动力学的六自由度机器人阻抗恒力跟踪控制

1.整个代码的控制流程图如下&#xff1a; 2.正逆运动学计算 略 3.动力学模型 采用拉格朗日法计算机械臂的动力学模型&#xff0c;其输入的是机械臂的关节角度、角速度和角加速度&#xff1b;其中M、C、G本别是计算的惯性力、科式力和重力项&#xff0c;相关部分如下&#xf…

JavaScript的学习之运算符

目录 一、运算符的介绍 二、算数运算符 三、一元运算符 一、运算符的介绍 运算符也称操作符&#xff0c;通过运算符可以对一个或者多个值进行运算&#xff0c;并获得结果 比如&#xff1a;typeof就是运算符&#xff0c;可以获得一个值的类型&#xff0c;它会将改值的类型以字…

Android SurfaceFlinger——HWC图层合成器加载(四)

在前面文章中的 Android.bp 文件中,我们可以看到里面加载了图层合成器和图形内存分配器的 HAL 服务,这里篇我们就来详细介绍一下其中的图层合成器——HWC。 一、HWC简介 HWC,全称为 Hardware Composer,是 Android 系统中一个至关重要的组件,位于硬件抽象层(HAL)。它的主…

JavaScript 中并发任务控制

目录 并发控制简介 并发控制的实现 asyncPool 的使用 功能 asyncPool ES9 实现 从 1.x 迁移 asyncPool ES9 为什么只用 Promise.race 而不用 Promise.all Promise.all的作用 Promise.race的作用 为什么这里没有使用Promise.all 总结 手写Promise.all和Promise.race…

自学前端——HTML篇

HTML标签 ’HTML‘全程是‘hypertext Markup langage(超文本标记语言) HTML通过一系列的’标签&#xff08;也称为元素&#xff09;‘来定义文本、图像、链接。HTML标签是由尖括号包围的关键字。 标签通常成对存在&#xff0c;包括开始标签和结束标签&#xff08;也称为双标签…

ModbusTcp和ModbusRtu协议

1、功能码的通信格式modbus rtu (1)读设备的寄存器(保持寄存器): 计算机发送命令:[设备地址] [命令号03] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位] 例:[01][03][00][00][00][10][CRC低][CRC高] 意义如下: &l…

安卓中使用ttf字体文件

官方文档中提供的方法要设备能访问google&#xff1f; 官方方法 直接下载字体的fft文件 我要使用的是lexend 需要的格式可以在里面搜索 使用下载的ttf文件 解压出来 可以单独使用static里面的&#xff0c;里面是直接的lexend的各种格式 但是我这里直接使用Lexend-Vari…

odoo的采购询价单,默认情况下显示‘draft‘,‘sent‘,‘purchase‘,请问什么情况下才会显示‘to approve‘?

odoo的采购询价单&#xff0c;默认情况下显示’draft’,‘sent’,‘purchase’&#xff0c;请问什么情况下才会显示’to approve’? 见下图&#xff1a; 这与操作人员的角色是相关的&#xff1a; 当操作人员是群组 “采购 / 用户”时&#xff0c;点击“confirm order/确认订…

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目&#xff08;leecode T538&#xff09;&#xff1a; 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。…

vuex的深入学习[基于vuex3]----篇(二)

store对象的创建 store的传递图 创建语句索引 创建vuex的语句为new Vuex.Store({…})Vuex的入口文件是index.js,store是index.js导出的store类store类是store.js文件中定义的。 Store的构造函数constructor 判断vuex是否被注入&#xff0c;就是将vue挂载在window对象上&am…

【算法】二叉树 - 理论基础

1.种类 1.1 满二叉树 只有度为0和2的节点&#xff0c;且度为0的节点都都在同一层。深度为k&#xff0c;有2^k-1个节点。 1.2 完全二叉树 在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都…

【QML】用 Image(QQuickPaintedItem) 显示图片

大体功能&#xff1a; 频繁地往界面推送图片&#xff0c;帧率达到视频效果。捕获画布上的鼠标事件和键盘事件。 代码如下&#xff1a; // DrawImageInQQuickPaintedItem.pro 代码如下&#xff1a; QT quick# You can make your code fail to compile if it uses deprecated…