本文档解释了React服务器组件(React Server Components,简称RSC),这是一种React架构模式,允许组件仅在服务器上运行。与传统的服务器端渲染(SSR)不同,SSR在将HTML发送到客户端之前在服务器上渲染组件一次,而React服务器组件仅在服务器上执行并将其结果流式传输到客户端。有关React传统服务器端渲染的信息,请参阅服务器端渲染。
React服务器组件使开发人员能够构建应用程序,其中一些组件仅在服务器上运行,而另一些则在客户端上运行。这种方法提供了几个优点:
Flight协议(React用于服务器组件的流式传输格式)将服务器组件的输出传输到客户端,然后客户端将其与客户端渲染的组件集成。
来源
React服务器组件引入了React应用程序结构和渲染方式的根本性转变,将组件分为三类:
来源
服务器组件:仅在服务器上运行。可以访问服务器资源(数据库、文件系统等)。不能使用React Hooks或浏览器API。
客户端组件:仅在客户端上运行。可以使用React Hooks、浏览器API和交互功能。在文件顶部通过'use client'指令标记。
共享组件:在两种环境中运行。仅限于在服务器和客户端都可用的功能。
指令方法确保了组件类型之间的清晰界限
来源
服务器组件是React服务器组件架构中的默认组件类型。它们在服务器上执行,其输出被序列化并发送到客户端。
来源
服务器组件由Flight服务器处理,并转换为可发送到客户端的序列化格式
来源
客户端组件在浏览器中运行,可以利用React的完整交互功能集。它们由服务器组件引用,但在到达客户端之前不会执行。
客户端组件在文件顶部通过'use client'指令标记
在构建过程中,客户端组件会:
来源
来源
Flight协议是允许服务器组件与客户端通信的传输机制。它以专门的格式序列化组件树、数据和引用。
Flight协议使用特殊编码处理各种数据类型
| 数据类型 | 序列化方法 | 描述 |
|---|---|---|
| 原始JS值 | 直接JSON编码 | 字符串、数字、布尔值、null |
| 对象和数组 | 带引用跟踪的JSON编码 | 对象被序列化,并处理循环引用 |
| React元素 | 特殊编码格式 | 元素与其类型、props和children一起传输 |
| 客户端组件 | 引用ID | 仅发送ID,实际组件在客户端加载 |
| Promises | 占位符 + 异步解析 | Promise作为占位符发送,然后发送解析值 |
| 流 | 分块传输 | 数据以可用时分块流式传输 |
| 服务器函数 | 服务器引用ID | 可以从客户端调用回服务器的函数 |
来源
Flight协议以数据块形式传输数据,每个数据块都有特定的结构
来源
React服务器组件通过专用机制实现服务器和客户端之间的双向通信。
来源
服务器组件可以导出函数,这些函数可以从客户端调用,称为服务器引用。
来源
React服务器组件与Suspense集成,以支持异步渲染和流式传输
当服务器组件挂起时
来源
React服务器组件内置了服务器端和客户端错误处理机制
当服务器组件渲染期间发生错误时
来源
客户端组件渲染期间的错误由标准React错误边界处理,从而实现优雅降级和回退UI。
来源
React服务器组件通常需要构建系统集成来正确处理服务器和客户端代码的分离。
最常见的集成是使用webpack和专用插件
构建过程
来源
React服务器组件通过多种机制提供性能优势
来源
useState、useEffect等)来源
React服务器组件代表了React在架构上的重大进步,使开发人员能够构建智能地在服务器和客户端之间分配渲染职责的应用程序。通过利用两种环境的优势,RSC提供了一种更高效、更具可扩展性、并通过减少JavaScript负载和加快初始渲染来提供更好用户体验的应用程序构建途径。