文章目录

  • 前言
      • 1. 什么是服务器组件 (Server Components)?
      • 2. 服务器组件的核心规则
        • (1) 异步性 (`async/await`)
        • (2) 无客户端交互
        • (3) 渲染限制
      • 3. 与客户端组件的协作
        • 组合模式
        • Props 传递规则
      • 4. 使用场景
      • 5. 文件命名约定
      • 6. 常见误区
      • 7. 示例代码
        • 服务端组件(获取数据):
        • 客户端组件(处理交互):
      • 关键总结


前言

React 官方文档中 server-components 页面详细解释了 React 服务器组件 (RSC) 的核心概念、规则和使用场景。以下是该页面的核心内容解析:


1. 什么是服务器组件 (Server Components)?

  • 运行环境仅在服务端执行,不会将组件代码(JSX、逻辑、依赖)发送到客户端。
  • 目的
    • 减少客户端 JS 体积,提升加载性能。
    • 直接访问服务端资源(数据库、API、文件系统)。
    • 自动代码分割,避免手动优化。
  • 输出:将渲染后的 UI 描述(非可交互 JS) 发送给客户端,类似 HTML 流。

2. 服务器组件的核心规则

(1) 异步性 (async/await)
  • 所有服务器组件必须是 async 函数,可使用 await 直接获取数据:
  async function MyServerComponent() {const data = await fetchData(); // 直接访问数据库/APIreturn <div>{data}</div>;}
    export default async function RootLayout({ children, params }) {const resolvedParams = await params;const { serializedResources } = await getTranslation(resolvedParams.locale, "common");// ...渲染逻辑}

这里直接在组件体内用 await 获取服务端数据,然后将数据传递给子组件。

(2) 无客户端交互
  • 禁止使用 Hooks:如 useState, useEffect, useContext 等。
  • 无浏览器 API:无法访问 window, document, localStorage
  • 无事件处理:不能定义 onClick, onChange 等交互逻辑。

Server Component(服务器组件):

  • 只能在服务器端渲染,不能包含如 useState、useEffect、事件处理(如 onClick)等客户端交互逻辑。
  • 不能访问浏览器 API(如 window、document)。
  • 只能通过 props 向下传递数据,不能响应用户在浏览器中的直接操作。
  • 适合做数据获取、服务端渲染、静态内容输出等。

Client Component(客户端组件):

  • 以 ‘use client’ 开头,可以使用 React 的所有客户端特性(如 useState、useEffect、事件处理等)。
  • 可以访问浏览器 API。
  • 适合做交互、动画、表单、按钮等需要响应用户操作的内容。
(3) 渲染限制
  • 只能返回 可序列化数据客户端组件
    // ✅ 合法:传递数据给客户端组件
    function ServerComponent() {return <ClientComponent data={...} />;
    }// ❌ 非法:直接渲染浏览器 API 相关组件
    function InvalidComponent() {return <input onChange={...} />; // 事件处理只能在客户端
    }
    

3. 与客户端组件的协作

组合模式
  • 服务器组件可作为 父组件 渲染客户端组件:
  // ServerComponent.server.jsimport ClientComponent from './ClientComponent.client';export default function ServerComponent() {return (<div><h1>服务端渲染</h1><ClientComponent /> {/* 嵌套客户端组件 */}</div>);}
  <I18nProviderWrapper locale={resolvedParams.locale} initialResources={serializedResources}>{children}</I18nProviderWrapper>

src/components/I18nProviderWrapper.tsx 是一个客户端组件(文件顶部有 ‘use client’),它被服务器组件 layout.tsx 作为子组件直接渲染。符合 Next.js 推荐的分层架构(Server Component 作为父,Client Component 作为子)

Props 传递规则
  • 传递给客户端组件的 props 必须是 可序列化的
    • ✅ 基本类型:string, number, boolean
    • ✅ 简单对象/数组
    • ✅ JSX(作为 children)
    • ❌ 函数、类实例、Symbol 等不可序列化数据。

4. 使用场景

适合服务器组件适合客户端组件
数据获取(DB/API)交互逻辑(表单、动画)
静态内容渲染使用 Hooks(状态、副作用)
敏感逻辑(访问密钥)浏览器 API(localStorage)
减少客户端 JS 体积事件处理(onClick 等)

5. 文件命名约定

  • 服务端组件:*.server.js (或 .server.jsx, .server.tsx)
  • 客户端组件:*.client.js (或 .client.jsx, .client.tsx)
  • 通用组件:无后缀,但需在客户端组件中显式导入。

6. 常见误区

  • 误区:“服务端组件可替代 SSR”。
    • 纠正:RSC 与 SSR 互补:
      • SSR:将客户端组件初始 HTML 快速渲染到浏览器。
      • RSC:在服务端生成静态内容,减少客户端负担。
  • 误区:“服务器组件可处理用户交互”。
    • 纠正:交互必须交给客户端组件处理。

7. 示例代码

服务端组件(获取数据):
// ProductDetails.server.js
async function ProductDetails({ id }) {const product = await db.products.get(id); // 直接访问数据库return (<div><h1>{product.name}</h1><p>{product.description}</p><ProductImage image={product.image} /> {/* 客户端组件 */}</div>);
}
客户端组件(处理交互):
// ProductImage.client.js
'use client'; // 标记为客户端组件function ProductImage({ image }) {const [zoomed, setZoomed] = useState(false);return (<img src={image.url} onClick={() => setZoomed(!zoomed)}className={zoomed ? 'zoomed' : ''}/>);
}

关键总结

特性服务器组件客户端组件
执行环境服务端浏览器
数据获取直接访问后端资源通过 fetch/API 调用
交互性❌ 无事件处理/状态✅ 支持所有交互逻辑
代码发送到客户端❌ 仅发送渲染结果✅ 发送完整 JS 代码
减少 JS 体积✅ 显著优化❌ 增加客户端负担

通过合理组合 Server Components(内容) + Client Components(交互),可构建高性能的 React 应用。建议结合 Next.js App Router 实践以体验完整 RSC 工作流。

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

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

相关文章

如何解决AttributeError: ‘NoneType‘ object has no attribute问题

如何解决AttributeError: ‘NoneType’ object has no attribute问题 问题背景与概述 在 Python 项目开发和调试过程中&#xff0c;经常会碰到这样一个异常信息&#xff1a; AttributeError: NoneType object has no attribute foo这意味着你尝试访问或调用某个对象的属性&a…

量子计算与AI融合的技术突破与实践路径

量子计算与人工智能的融合正开启一个全新的技术纪元&#xff0c;这种"量智融合"不是简单的技术叠加&#xff0c;而是多领域、多学科的横向连接&#xff0c;通过协同创新实现非线性增长。本文将深入探讨这一领域的最新进展、技术实现路径以及行业应用案例。电子-光子-…

xss的利用

目录 一、XSS的原理和分类 二、常见的XSS标签和属性 三、Xss漏洞分类 1. 反射性xss 反射性 XSS 典型攻击场景 基于 URL 参数的反射性 XSS 基于表单参数的反射性 XSS 利用 HTML 标签属性的反射性 XSS 2.存储型XSS 存储型XSS的高频攻击场景 社交平台评论区 论坛发帖与…

开源Docmost知识库管理工具

Docmost知识库管理工具Docmost是什么核心功能安装应用报错镜像拉取报错使用Docmost是什么 Docmost 是一个开源的协作 wiki 和文档软件。它是 Confluence 和 Notion 的开源替代方案。 核心功能 主开发语言&#xff1a;主要使用 TypeScript 开发&#xff08;性能好&#xff0c;扩…

Elastic Search 8.x 分片和常见性能优化

目录索引分片写入原理概念索引写入流程常见性能优化背景常见性能优化硬件资源优化分片和副本优化索引分片写入原理 概念 分片&#xff08;shard&#xff09; 分片是将索引数据分割成更小的、可分布式存储和处理的单元每个索引都由一个或多个分片组成&#xff0c;每个分片都是一…

Java+Vue搭建资产设备全生命周期管理系统,移动端随时操作,后台管理高效精准,覆盖资产全周期,提供完整源码

前言&#xff1a;在当今企业运营中&#xff0c;资产设备作为重要的生产要素&#xff0c;其高效管理和合理利用直接关系到企业的生产效率、成本控制和竞争力。资产设备全生命周期管理涵盖了从设备的采购规划、采购实施、入库存储、使用维护到报废处置的整个过程。为了实现对资产…

Vue rem回顾

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue rem回顾&#xff08;初学者简单笔记&#xff09; 目录 rem回顾 移动端适配 等比例缩放 下载插件 总结 rem回顾 实现自适应的rem布局。 通过把屏幕划分成几个等份&#xff0c;作为html字体的大小&#xff0c;当设备变…

C#语法基础总结(超级全面)(二)

文章目录c#语法基本元素关键字操作符&#xff08;operator&#xff09;类型转换标识符&#xff08;Identifier&#xff09;语句try语句迭代语句&#xff08;循环语句&#xff09;索引器文本&#xff08;字面值&#xff09;五大数据类型引用类型&#xff1a;值类型&#xff1a;变…

MyBatis分页神器PageHelper深度解析

PageHelper 是一个优秀的 MyBatis 分页插件&#xff0c;它通过简单的拦截器机制&#xff0c;实现了对 MyBatis 查询的物理分页&#xff08;而非内存分页&#xff09;&#xff0c;极大简化了分页代码的编写。而 PageHelper 扩展 通常指的是在其核心功能基础上&#xff0c;为特定…

【2025/07/19】GitHub 今日热门项目

GitHub 今日热门项目 &#x1f680; 每日精选优质开源项目 | 发现优质开源项目&#xff0c;跟上技术发展趋势 &#x1f4cb; 报告概览 &#x1f4ca; 统计项&#x1f4c8; 数值&#x1f4dd; 说明&#x1f4c5; 报告日期2025-07-19 (周六)GitHub Trending 每日快照&#x1f55…

【数据结构】二叉树初阶详解(一):树与二叉树基础 + 堆结构全解析

文章目录&#x1f4dd;前言&#x1f320;树的概念和结构&#x1f309;树的概念&#x1f309;树的相关概念&#x1f309;树的表示&#x1f320;二叉树概念及结构&#x1f309;二叉树的概念&#x1f309;特殊的二叉树&#x1f309;二叉树的性质&#x1f320;二叉树顺序结构及实现…

Flutter基础(前端教程①⑤-API请求转化为模型列成列表展示实战)

models/post_model.dart定义 Post 数据模型包含 fromJson() 方法用于解析 JSONcontrollers/post_controller.dart管理帖子数据的获取和状态使用 http 包请求 API通过 RxList 和 RxBool 实现响应式状态管理views/post_list_view.dart展示帖子列表的 UI使用 Obx 监听状态变化包含…

第十五届全国大学生数学竞赛初赛试题(非数学专业类A卷)

第十五届全国大学生数学竞赛初赛试题(非数学专业类A卷) 文章目录第十五届全国大学生数学竞赛初赛试题(非数学专业类A卷)题目速览逐题详解题目速览 求极限&#xff1a; lim⁡x→3x39−62−x3−23.\lim\limits_{x \to 3} \frac{\sqrt{x^3 9} - 6}{2 - \sqrt{x^3 - 23}} \rule{2…

ROS1/Linux——Ubuntu、ROS1虚拟机环境配置

ROS1/Linux——Ubuntu、ROS1虚拟机环境配置 文章目录ROS1/Linux——Ubuntu、ROS1虚拟机环境配置编辑时间&#xff1a;系统环境Linux镜像下载Ubuntu相关链接iso镜像下载VMware操作虚拟机安装步骤基础设置设置语言设置窗口分辨率、图标大小等终端固定在左侧栏显示隐藏文件夹其他问…

万字解析LVS集群

一、集群和分布式介绍1.1、诞生的原因单台设备 “又贵又弱又容易挂”&#xff0c;扛不住现代业务的 “海量访问、海量数据、复杂计算”&#xff1b;集群 / 分布式让多台设备 “抱团干活”&#xff0c;分担压力&#xff08;流量、存储、计算&#xff09;&#xff0c;还能 “坏了…

关于博客后续内容会以xmind内容转markdown格式来呈现

自己感觉不正确的地方 一直感觉学啥东西记到博客里&#xff0c;这样就方便后续回顾或者查找 但csdn貌似不适合全局搜索&#xff0c;也就是我居然先要知道我对应的模糊点对应到哪篇文章&#xff0c;然后再到那篇文章里找&#xff0c;简直麻烦死了&#xff0c;而且另外一个毛病是…

Python - 数据分析三剑客之Pandas

阅读前可参考NumPy文章 https://blog.csdn.net/MinggeQingchun/article/details/148253682https://blog.csdn.net/MinggeQingchun/article/details/148253682 ‌Pandas是Python中一个强大的开源数据分析库&#xff0c;专门用于处理结构化数据&#xff08;如表格、时间序列等&…

深度解析:Python实战京东资产拍卖平台爬虫,从ID抓取到详情数据落地

深度解析:Python实战京东资产拍卖平台爬虫,从ID抓取到详情数据落地 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学(系统理论和实战教程)、提供接单兼职渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698 文章目录 深度解析:Python实战京东…

ServletConfig 接口详解

ServletConfig 接口详解 1. 核心概念 ServletConfig 是 Servlet 规范中定义的核心接口&#xff0c;用于在 Servlet 初始化阶段向 Servlet 传递配置信息。每个 Servlet 都有自己独立的 ServletConfig 对象。 2. 关键特性特性说明唯一性每个 Servlet 实例拥有独立的 ServletConfi…

Maven学习总结(62)—— Maven 打包瘦身和提速解决方案

臃肿的 Maven 项目 在 Java 项目开发中,Maven 作为强大的项目管理和构建工具,极大地简化了依赖管理和项目构建过程。但随着项目的不断演进,依赖的 Jar 包越来越多,我们的 Maven 项目也逐渐变得臃肿不堪。曾经,我参与维护一个大型的 Spring Boot 项目,随着业务功能的不断…