nextjs渲染篇

1 服务器组件

默认情况下,Next.js 使用服务器组件。

1.1 服务器组件是如何呈现的?

在服务器上,Next.js 使用 React 的 API 来编排渲染。渲染工作被拆分为多个块:按单个路段和Suspense

每个区块分两个步骤呈现:

  1. React 将服务器组件渲染为一种称为 React Server 组件有效负载 (RSC Payload) 的特殊数据格式。
  2. Next.js 使用 RSC 有效负载和客户端组件 JavaScript 指令在服务器上呈现 HTML

然后,在客户端上:

  1. HTML 用于立即显示路由的快速非交互式预览 - 这仅适用于初始页面加载。
  2. React Server 组件有效负载用于协调客户端和服务器组件树,并更新 DOM。
  3. JavaScript 指令用于 hydrate客户端组件,并使应用程序具有交互性。

RSC 有效负载是渲染的 React Server 组件树的紧凑二进制表示。客户端上的 React 使用它来更新浏览器的 DOM。

 1.2 渲染策略

1.2.1 静态渲染(默认)

使用静态渲染时,路由在构建时渲染,或在数据重新验证后在后台渲染。结果被缓存,

1.2.2 动态渲染

当路由包含对用户个性化的数据或具有仅在请求时才能知道的信息(例如 cookie 或 URL 的搜索参数)

在渲染过程中,如果发现动态函数或未缓存的数据请求,Next.js将切换到动态渲染整个路由。下表总结了动态函数和数据缓存如何影响路由是静态呈现还是动态呈现:

动态函数数据路线
缓存静态渲染
是的缓存动态渲染
未缓存动态渲染
是的未缓存动态渲染

注:静态渲染只有在非动态函数和数据缓存同时存在情况 

1.2.3 流式

通过流式处理,可以从服务器逐步呈现 UI。工作被拆分为多个块,并在准备就绪时流式传输到客户端。这允许用户在整个内容完成呈现之前立即看到页面的某些部分。

 例如:

<Suspense fallback={<Loading />}><Albums />
</Suspense>

children:要呈现的实际 UI。

fallback:如果实际 UI 尚未完成加载,则要代替实际 UI 进行渲染的备用 UI 

2 客户端组件

"use client"用于声明服务器和客户端组件模块之间的边界
例如:

'use client'import { useState } from 'react'export default function Counter() {const [count, setCount] = useState(0)return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>)
}

 3 组合模式

何时使用服务器和客户端组件?

3.1 将仅限服务器的代码排除在客户端环境之外

npm install server-only

 然后导入server-only

import 'server-only'export async function getData() {const res = await fetch('https://external-service.com/data', {headers: {authorization: process.env.API_KEY,},})return res.json()
}

 3.2 使用第三方软件包和提供程序

import { Carousel } from 'acme-carousel'export default function Page() {return (<div><p>View pictures</p>{/* Error: `useState` can not be used within Server Components */}<Carousel /></div>)
}

由于三方组件使用了客户端组件,服务器组件不能使用useState

则需要包装一层:

'use client'import { Carousel } from 'acme-carousel'export default Carousel

现在,可以直接在服务器组件中使用:<Carousel />

import Carousel from './carousel'export default function Page() {return (<div><p>View pictures</p>{/*  Works, since Carousel is a Client Component */}<Carousel /></div>)
}

3.3 使用上下文提供程序

上下文提供者通常在应用的根附近渲染,以共享全局关注点,例如当前主题。

(1)错误例子:

import { createContext } from 'react'//  createContext is not supported in Server Components
export const ThemeContext = createContext({})export default function RootLayout({ children }) {return (<html><body><ThemeContext.Provider value="dark">{children}</ThemeContext.Provider></body></html>)
}

(2)正确例子:(由于服务器组件不支持 React 上下文,采用children的方式)

app/theme-provider.tsx

'use client'import { createContext } from 'react'export const ThemeContext = createContext({})export default function ThemeProvider({children,
}: {children: React.ReactNode
}) {return <ThemeContext.Provider value="dark">{children}</ThemeContext.Provider>
}

 app/layout.tsx

import ThemeProvider from './theme-provider'export default function RootLayout({children,
}: {children: React.ReactNode
}) {return (<html><body><ThemeProvider>{children}</ThemeProvider></body></html>)
}

3.4 交错的服务器和客户端组件

不支持的模式:将服务器组件导入客户端组件

'use client'// You cannot import a Server Component into a Client Component.
import ServerComponent from './Server-Component'export default function ClientComponent({children,
}: {children: React.ReactNode
}) {const [count, setCount] = useState(0)return (<><button onClick={() => setCount(count + 1)}>{count}</button><ServerComponent /></>)
}

支持的模式:将服务器组件作为道具传递给客户端组件

'use client'import { useState } from 'react'export default function ClientComponent({children,
}: {children: React.ReactNode
}) {const [count, setCount] = useState(0)return (<><button onClick={() => setCount(count + 1)}>{count}</button>{children}</>)
}

 将服务器组件作为子项导入

// This pattern works:
// You can pass a Server Component as a child or prop of a
// Client Component.
import ClientComponent from './client-component'
import ServerComponent from './server-component'// Pages in Next.js are Server Components by default
export default function Page() {return (<ClientComponent><ServerComponent /></ClientComponent>)
}

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

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

相关文章

Python一键修改目录下所有文件的编码格式

前言 在开发中总会遇到这样的问题&#xff0c;别人的代码采用的编码格式是GBK&#xff0c;而自己的项目的编码格式是UTF-8&#xff0c;如果直接复制过来&#xff0c;就会出现中文乱码的问题&#xff0c;一个个该编码格式又非常麻烦。所以我写了这样一小段简短的代码&#xff0…

Python 中的高阶函数

Python 中的高阶函数是指可以接受函数作为参数&#xff0c;或者返回函数作为结果的函数。这种特性让编程变得更加灵活和功能强大&#xff0c;常见的高阶函数有 map()、filter()、reduce() 和 sorted() 等。 map() 函数&#xff1a; map() 函数接受一个函数和一个可迭代对象&a…

select * from .... for update 使用 防止重复提交/操作

详情点下方链接 for-update笔记链接 注&#xff1a;当选中某一个行的时候,如果是通过主键id选中的。那么这个时候是行级锁。 其他的行还是可以直接insert 或者update的。如果是通过其他的方式选中行,或者选中的条件不明确包含主键。这个时候会锁表。其他的事务对该表的任意一行…

SQLite的PRAGMA 声明(二十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite从出生到现在&#xff08;发布历史记录&#xff09;&#xff08;二十二&#xff09; 下一篇&#xff1a;用于 SQLite 的异步 I/O 模块&#xff08;二十四&#xff09; PRAGMA 语句是特定于 SQLite 的 SQL 扩…

Valorant 瓦罗兰特更新后进不去游戏?3个解决方法完美解决

Valorant 瓦罗兰特更新后进不去游戏&#xff1f;3个解决方法完美解决 《无畏契约&#xff08;VALORANT&#xff09;》是一款由知名游戏开发商&#xff08;Riot Games&#xff09;开发并且免费的多人射击游戏。游戏背景设定在一个幻想世界中&#xff0c;玩家将探索瓦罗兰大陆上…

面对深度合成技术备案,企业应该如何做好准备?

在这个数字化高速发展的时代&#xff0c;互联网信息服务已经深入我们生活的方方面面。特别是那些应用深度合成技术的互联网信息服务&#xff0c;比如通过算法实现的图像、语音和视频的合成等&#xff0c;现在都需要进行严格的备案。由于备案周期较长&#xff0c;建议涉及这些技…

基于python的二手房数据分析建模及可视化研究,爬取链家二手房数据,可视化分析,房价预测模型

介绍 主要涉及通过爬取济南市链家二手房数据&#xff0c;然后对数据进行处理&#xff0c;包括缺省值处理&#xff0c;高德地图获取二手房地址所属市区&#xff0c;经纬度等数据处理。然后通过python的flask框架编写后端接口&#xff0c;把数据响应给前端。然后前端通过AJAX请求…

Excel:如何对数据列进行码值转换

这里有两种函数可以直接解决&#xff1a; 在需要转码的数据列旁边新建一列&#xff0c;使用如下函数即可 1、函数一 VLOOKUP(H10,B3:C45,2,FALSE) VLOOKUP(需要转码的单元格,key和value所在数据范围,需要转成范围内第几列数据,是否模糊匹配) 这个函数中&#xff0c;key和valu…

Oracal数据库使用

Oracal官网&#xff1a;https://www.oracle.com/database/technologies/instant-client/downloads.html 官网搜索需登陆&#xff1a;https://edelivery.oracle.com/osdc/faces/SearchSoftware 软猫下载&#xff1a;Oracle 19.3 0、linux下安装 Linux系统&#xff08;X64&…

lsof命令——查看进程信息

lsof是一个用于显示系统中打开的文件和进程的命令。它可以列出当前系统中打开文件的相关信息&#xff0c;如进程ID、文件描述符、文件类型、文件大小、文件所属用户、文件的读写状态等等。lsof命令可以帮助用户识别哪些进程正在使用某个文件或目录&#xff0c;以及查看系统中打…

谈谈微前端

相关问题 为什么要用微前端微前端的优缺点 回答关键点 独立开发 独立运行 独立部署 自治 微前端是一种架构理念&#xff0c;它将较大的前端应用拆分为若干个可以独立交付的前端应用。这样的好处是每个应用大小及复杂度相对可控。在合理拆分应用的前提下&#xff0c;微前端能…

基于监控视频的车辆检测

目前常用的基于监控视频的车辆检测方法分为两类&#xff1a;基于运动信息的车辆检测方法和基于特征信息的车辆检测方法。基于运动信息的车辆检测方法主要包括光流法、帧差法和背景法等。基于特征的车辆检测&#xff0c;是以统计机器学习理论为基础的车辆检测方法&#xff0c;通…

Java面试题:描述Java 14中的模式匹配及其使用场景

Java 14是继Java 12和Java 13之后&#xff0c;继续引入了模式匹配作为预览特性的版本。模式匹配是一种新的语法结构&#xff0c;用于简化对象的比较和类型检查&#xff0c;它可以在instanceof表达式和switch语句中使用。模式匹配的目的是提高代码的可读性和简化复杂的条件语句。…

提升和改善学习效率和记忆力

提升和改善学习效率和记忆力是一个多方面的过程&#xff0c;需要综合考虑方法、食物、生活习惯等多个方面。以下是一些具体的建议&#xff1a; 一、方法篇 设定明确的学习目标&#xff1a;清晰的目标有助于你集中注意力&#xff0c;更有效地利用学习时间。采用多样化学习方式…

【二分查找】Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置【中等】

在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(…

SRE职能描述以及个人见解

1.SRE 职能描述 SRE 到底是什么&#xff1f;这是一个最早由 Google 提出的概念&#xff0c;我的理解是&#xff0c;用软件解决运维问题。标准化&#xff0c;自动化&#xff0c;可扩展&#xff0c;高可用是主要的工作内容。这个岗位被提出的时候&#xff0c;想解决的问题是打破…

【Java基础学习】面向对象编程

开始时间: April 10, 2024 结束时间: April 16, 2024 阶段: Done 基础部分 类与对象的关系 类是抽象的&#xff0c;概念的&#xff0c;代表一类事物对象是具体的&#xff0c;实际的&#xff0c;代表一个具体事物&#xff08;实例&#xff09;类是对象的模板&#xff0c;对象…

JSON基础入门

简介: JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;通常用于在不同系统之间进行数据交换。它基于JavaScript语言的子集&#xff0c;但已成为独立于语言的格式&#xff0c;因此可以通过多种编程语言进行解析和生成。 JSON的…

Python 数学应用(四)

原文&#xff1a;zh.annas-archive.org/md5/123a7612a4e578f6816d36f968cfec22 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十一章&#xff1a;其他主题 在本章中&#xff0c;我们将讨论一些在本书前几章中没有涉及的主题。这些主题大多涉及不同的计算方式以及优…

什么是三高架构

三高架构是指在软件系统设计与开发中&#xff0c;注重解决高并发性、高可用性和高性能的架构设计模式。 高并发性&#xff1a;指系统能够处理大量并发请求的能力。在高并发场景下&#xff0c;系统需要具备有效的并发处理机制&#xff0c;以保证系统能够快速、准确地响应大量并…