nextjs渲染篇

2024-04-17 18:36
文章标签 渲染 nextjs

本文主要是介绍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>)
}

这篇关于nextjs渲染篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/912526

相关文章

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染 一、环境说明二、调用后台接口及List组件渲染三、总结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、调用后台接口及List组件渲染 后台接口及返回数据分析 JSON数据格式如下: {"code": 0,"data": {"total": 6,"pageSize"

【爬虫渲染神器】selenium 和pyppeteer 的动态渲染ajax反爬虫

许多网页是动态加载的网页,其中不乏使用了ajax异步技术,那么我们有没有一种渲染工具,直接省略分析过程,模拟浏览器渲染的操作呢,获取到我们想要的内容。当然有,下面我们介绍两种渲染工具的实战使用。 目标网站: http://www.porters.vip/verify/sign/ 点击参看详情页的里面内容。 前一篇文章,我们介绍了,js逆向分析两种方法JS逆向–签名验证反爬虫】sign签名验证

NextJs-react开发者的全栈最佳选择(从0-1的react全栈入门指南)

NextJs:react开发者的全栈最佳选择(从0-1的react全栈入门指南) 目录 前言学习路线 1.TS速成2.React速成视频入门(四个板块)3.React官方文档4.学习React常用hooks5.学习tailwindcss6.做一个小项目:One Thing7.学习NextJS148.学习MongoDB9.学习AuthJS/Next-Auth10.巩固NextJS11.NextJ

如何将 Redshift Cryptomatte AOV 与 teamrender 结合使用,成都渲染101云渲染

这篇文章将讨论在 Cinema 4D 中将 cryptomatte AOV 与 teamrender 结合使用时常见的问题和解决方案。在 Cinema 4D 中使用 AOV 时,用户希望它们的工作方式与其他 AOV 完全相同。但事实并非如此,尤其是与 teamrender 结合使用时。  在 Cinema 4D 中,使用AOV 面板中的Multi-pass和Direct复选框之间的区别非常重要。

vue中跳转当前页无法重渲染且报错问题

1、解决报错: // router/index.jsimport Vue from 'vue'import VueRouter from 'vue-router'Vue.use(VueRouter)// 解决报错👇const routerPush = VueRouter.prototype.pushVueRouter.prototype.push = function push(l

HarmonyOS开发实战( Beta5版)高负载组件的渲染实践规范

简介 在应用开发中,有的页面需要在列表中加载大量的数据,就会导致组件数量较多或者嵌套层级较深,从而引起组件负载加重,绘制耗时增长。虽然可以通过组件复用避免组件重复创建,但是如果每个列表项中包含的组件较多,在转场或者列表滑动的时候列表项就会一次性加载大量的数据,可能引起卡顿掉帧等性能问题。 转场场景 由于业务需求,从当前页面进入一个新页面时,会有转场动画播放,并且在动画首帧中加载新页面所需要的

浏览器输入url到渲染完成经历了那些内容

问: 浏览器输入url到渲染完成经历了那些内容 回答: 从浏览器输入 URL 到页面渲染完成的过程涉及多个步骤,每个步骤都涉及特定的网络和计算机科学技术。以下是这一过程的基本流程: URL 解析: 用户在浏览器地址栏输入 URL(统一资源定位符)。浏览器解析 URL,分解成协议(如 HTTP/HTTPS)、域名、路径、查询参数等。 DNS 查询: 浏览器检查本地缓存是否有该域名的 IP

自定义渲染组件及材质 / 引擎源码 / Dashboard

B站视频: Cocos Creator 3D 官方中文教程——《快上车3D》案例添加链接描述 (请点击跳转) cocos creator 1.x shader 没有经过包装,可以直接定义shader,替换 sprite 原来的 shader,可以参考之前博客; cocos creator 2.x 引入了材质系统,使用 shader 必须通过材质,这里介绍下如何使用自定义 shade

cocos2dx与OpenGL渲染知识

1 顶点和片段介绍 2 why不同纹理会需要重新渲染 纹理优化--------- 3 通俗易懂的 OpenGL ES 3.0 和2.0区别 –参考文档: https://blog.csdn.net/u013654125/article/details/79698469 ~ https://blog.csdn.net/sun___shine/article/details/48313749 Coc