nextjs渲染篇

news2025/1/6 18:39:31

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.coloradmin.cn/o/1601941.html

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

相关文章

程序中调用DB存储过程记得异常处理时尝试回滚可能存在的事务

程序中调用DB过程要注意这种情况&#xff1a; 有些存储过程需要执行比较久&#xff0c;在数据库中直接跑本身没有出错&#xff0c;但从程序中调用该存储过程会由于超时进入程序异常处理&#xff0c;这时数据库后台依然在跑着该存储过程&#xff0c;如果该存储过程中有启用事务…

选择生产制造项目管理系统?全面解析功能与实际应用!

生产效率和项目规划是制造企业亟需解决的难题&#xff0c;想要从容的应对这些挑战&#xff0c;离不开好用的生产制造项目管理系统。下面我们全面解析什么才能称得上是好用的生产制造项目管理系统。 一、好用的生产制造项目管理系统 什么样的项目管理系统才能算是好用呢&#x…

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标&#xff1a;让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…

【微信小程序】分包

整个小程序所有分包大小不超过 20M&#xff08;开通虚拟支付后的小游戏不超过30M&#xff09; 单个分包/主包大小不能超过 2M在小程序启动时&#xff0c;默认会下载主包并启动主包内页面&#xff0c;当用户进入分包内某个页面时&#xff0c;客户端会把对应分包下载下来&#xf…

13段×5位LED数码管驱动数显驱动IC抗干扰数码屏驱动芯片VK1624 SOP24/DIP24

产品型号&#xff1a;VK1624 产品品牌&#xff1a;永嘉微电/VINKA 封装形式&#xff1a;SOP24/ DIP24 工程服务&#xff0c;技术支持&#xff01; 概述 VK1624是一种数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有3线串行接口、数据锁存器、LED 驱动等电路。SEG脚…

Java中的容器,线程安全和线程不安全

Java中的容器主要指Java集合框架中的一系列类&#xff0c;它们提供了存储和操作对象的能力。在讨论容器的线程安全性时&#xff0c;我们可以将其分为两大类&#xff1a; 线程安全的容器&#xff1a; Vector: 这是ArrayList的线程安全版本&#xff0c;所有方法都被同步以确保在…

Win10本地更新无法升级win11 的0x80080005解决方法

Win10本地更新无法升级win11 Visual Studio 2022 运行项目时&#xff0c;本文提供了错误“指定的程序需要较新版本的 Windows”的解决方法。 更新时提示&#xff1a;0x80080005 解决方法 1、下载Windows11InstallationAssistant.exe 【免费】Windows11InstallationAssista…

ESP32 S3音频开发

1. 音频硬件框架 Codec&#xff1a;音频编解码芯片&#xff0c;一种低功耗单声道音频编解码器&#xff0c;包含单通道 ADC、单通道 DAC、低噪声前置放大器、耳机驱动器、数字音效、模拟混音和增益功能。它通过 I2S 和 I2C 总线与 ESP32-S3-WROOM-1 模组连接&#xff0c;以提供独…

FFmpeg: 自实现ijkplayer播放器--01项目简介

文章目录 项目介绍流程图播放器实现过程界面展示项目代码 项目介绍 此项目基于FFmeg中 ffplay.c进行二次开发&#xff0c;实现基本的功能&#xff0c;开发软件为Qt 项目优势&#xff1a; 参考ijkplayer播放器&#xff0c;实现UI界面和播放器核心进行解耦&#xff0c;容易添加…

【已解决】CondaError: Downloaded bytes did not match Content-Length

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

树莓派驱动开发--搭建环境篇(保姆级)

前言&#xff1a;树莓派的环境搭建关系到之后的驱动开发&#xff0c;故一个好的环境能让你顺手完成驱动开发&#xff01;我使用的是64位树莓派4b&#xff01;有显示屏的前提&#xff01;&#xff01;&#xff01;&#xff08;因为wifi连接太刁钻了&#xff09; 一、ubantu相关 …

土壤湿度传感器:助力农业现代化

随着科技的飞速发展&#xff0c;越来越多的先进技术被应用到农业生产中。其中&#xff0c;土壤湿度传感器作为现代农业的重要工具&#xff0c;正逐渐改变着传统农业的生产方式&#xff0c;成为农业现代化的秘密武器。 精确监测&#xff1a;土壤湿度传感器能够实时、精确地监测土…

steam小白和新手教学——steam账号注册教程

steam是一个非常流行的游戏平台&#xff0c;提供了丰富的游戏资源和社交功能。访问Steam官方网站并注册一个账户&#xff0c;需要提供个人信息&#xff0c;如邮箱和密码&#xff0c;完成验证后即可登录。下载并安装Steam客户端。浏览和购买游戏。登录后&#xff0c;可以在Steam…

预算有限的中小企业如何挑选财务记账软件?专家建议解读!

对于预算有限的中小企业而言&#xff0c;如何在众多市场上的财务软件中作出明智选择&#xff0c;既能满足基本的记账需求&#xff0c;又能适应企业未来的成长&#xff0c;是一项极具战略意义的任务。 本文探讨了中小企业财务记账软件的关键功能&#xff0c;并为大家推荐了几款…

女生给你分享音乐是啥意思?是不是暗示喜欢!

如果你正在和女生聊天&#xff0c;女生突然给你分享了一首音乐&#xff1b;或者你还没找女生聊天呢&#xff0c;女生就主动给你发了一个音乐分享过来……那这些情况下女生给你分享音乐是啥意思&#xff1f;女生是单纯分享音乐还是想用音乐暗示喜欢你呢&#xff1f; 一、女生单…

第47期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

URLConnection、HttpURLConnection、OKHttpClient分析

URLConnection和HttpURLConnection都是用于建立(应用层的)网络连接的类。 URLConnection是一种通用的连接方式&#xff0c;它支持多种协议&#xff0c;如 HTTP、HTTPS、FTP 等。 HttpURLConnection是URLConnection的子类&#xff0c;提供了更多针对HTTP协议的功能。如果仅是简…

【redis基础01】数据结构-通用命令、String、Hash、List、Set

目录 1 通用命令1.1 keys 检索匹配特定模式的所有键1.2 del 删除指定的key1.3 exists 判断key是否存在1.4 expire 给key设定有效期1.5 ttl 查看key的剩余有效期1.6 key的层级格式 2 String类型2.1 set&get2.2 mset&mget 批量操作2.3 incr&incrbyfloat 自增2.4 setn…

RabbitMQ-交换机

文章目录 交换机fanoutDirecttopicHeadersRPC 交换机 **交换机 **是消息队列中的一个组件&#xff0c;其作用类似于网络路由器。它负责将我们发送的消息转发到相应的目标&#xff0c;就像快递站将快递发送到对应的站点&#xff0c;或者网络路由器将网络请求转发到相应的服务器…

杀死那个名为360安全的软件

背景 2023年底&#xff0c;闲来没事想起了xjun师傅2021年发的procexp驱动利用帖子时在群里讨论的&#xff0c;通过procexp驱动突破PPL后注入到csrss进程中&#xff0c;再通过csrss来结束那些个安全防护软件。于是在当时就有了如下成果&#xff1a; 这些弄完之后&#xff0c;觉…