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

相关文章

Vue3的Teleport:Teleport是Vue3的一个新功能,它允许我们将子组件渲染到父组件以外的地方,这在处理模态框、弹出窗口等情况时非常有用

I. Teleport 的概述 Teleport 的定义:   在 Vue 3.0 中,Teleport 是一个新的内置组件,它允许我们将任何部分的渲染内容 Teleport(传送)到 Vue 应用范围之外的地方。 换句话说,你可以控制片段,让它们在 DOM 中的任何位置渲染,而不仅仅是在当前组件内部。   Teleport 的效用和应用场景:   Teleport 的主要用途是处理在 UI

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-co

opencascade AIS_InteractiveContext源码学习5 immediate mode rendering 即时模式渲染

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行修改。如果交互对象尚未加载到交互上下文中,您才能直接调用交互对象的方法。 每个可选择的对象必须指定负责整体选择对象的选择模式(全局选

WHAT - NextJS 系列之六大特性

目录 一、介绍二、特性RoutingRenderingData FetchingStylingOptimizationsTypeScript 官方文档:https://nextjs.org/docs 一、介绍 Next.js is a React framework for building full-stack web applications. You use React

WHAT - NextJS 系列之 Rendering - Server Components

目录 一、Server Components1.1 Server Components特点使用 1.2 Client Components特点使用 1.3 综合使用示例1.4 小结 二、Server Components 优势三、Streaming 特性3.1 基本介绍和使用Streaming的理解工作原理使用示例服务器端组件客户端组件页面流程解释 3.2 HTTP/1.1和HTTP/2中

Vue-列表渲染指令

v-for  语法:v-for="(参数1,可选参数1,可选参数2) in 数组名"  参数1是元素,也是这个数组 如果可选参数只写一个,那么这个可选参数就是数组的索引, 如果可选参数写两个,那么第一个可选参数是键值对,第二个可选参数是索引 它会渲染依次渲染数组里面的属性 数组有几个元素,这里面li标签就会渲染多少个  <body><div id="app"><input type="

iOS Runloop面试题(利用 runloop 解释一下页面的渲染的过程?)

利用 runloop 解释一下页面的渲染的过程? 当我们调用 [UIView setNeedsDisplay] 时,这时会调用当前 View.layer 的 [view.layer setNeedsDisplay]方法。 这等于给当前的 layer 打上了一个脏标记,而此时并没有直接进行绘制工作。而是会到当前的 Runloop 即将休眠,也就是 beforeWaiting 时才会进行绘制工作。

OCC显示渲染结构剖析

1.Display显示 2.Drawer 3.Graphics 4.InteractiveContext 5.Render 6.Selection 7.View

Node.js 渲染三维模型并导出为图片

Node.js 渲染三维模型并导出为图片 1. 前言 本文将介绍如何在 Node.js 中使用 Three.js 进行 3D 模型渲染。通过结合 gl 和 canvas 这两个主要依赖库,我们能够在服务器端实现高效的 3D 渲染。这个方法解决了在服务器端生成和处理 3D 图形的需求,使得可以在各种平台上展示复杂的 3D 内容 2. 渲染环境准备 在服务端渲染并导出threeJS模型,难点在

NodeJS中模板引擎,处理静态资源,服务端渲染

1 模板引擎的使用 1.1 下载模板 首先安装art-template模板,art-template不仅可以在浏览器使用,也可以在node中使用 安装,在哪个目录执行以下命令就会下载到那里去,默认下载到node_modules目录中,注意node_modules尽量不要更改,不支持更改 npm install art-templatenpm install=npm i。在git clone