React 服務器組件 (RSC)

文章目錄

  • 前言
      • 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 項目,隨著業務功能的不斷…