深入理解 React Server Components

4 分鐘

1. React Server Components(RSC)是什麼?

React Server Components(RSC)是一種新的 React 元件類型,它在建置時或在伺服器上被渲染。與傳統的、在客戶端瀏覽器中渲染的元件(現在稱為「Client Components」)不同,RSC 的程式碼永遠不會被傳送到客戶端。瀏覽器接收到的僅僅是渲染好的 HTML 或一種特殊的串流格式。

這標誌著 React 從一個純粹的客戶端函式庫,演變為一個可以在伺服器和客戶端之間無縫運作的全端框架。

2. RSC 解決了哪些問題?

RSC 的出現主要是為了解決以下幾個核心痛點:

  • 巨大的 JavaScript 套件體積: 傳統 React 應用程式會將所有元件的 JS 程式碼(包括那些不直接互動的)打包傳送到客戶端,導致初始載入緩慢。RSC 允許我們將大量元件(如文字、版面配置、資料展示)保留在伺服器端,從而實現零 JS 體積
  • 請求瀑布(Request Waterfalls): 在客戶端取得資料的典型模式是:渲染元件 -> useEffect -> 發起請求 -> 等待資料 -> 再次渲染。如果元件巢狀層級很深,就會形成請求瀑布,拖慢頁面呈現速度。RSC 可以在伺服器端直接以 async/await 取得資料,將資料和元件一起串流傳輸到客戶端,從根本上解決這個問題。
  • 直接存取後端資源: RSC 執行在伺服器端環境中(如 Node.js),這意味著它們可以直接、安全地存取資料庫、檔案系統或內部 API,無需再向客戶端暴露額外的 API 端點。

3. Server Components vs. Client Components

理解兩者的區別是掌握 RSC 的關鍵。

特性Server Components(伺服器端元件)Client Components(客戶端元件)
執行環境伺服器(Node.js 等)客戶端(瀏覽器)
JS 傳送到客戶端
狀態(State)不支援(例如 useState支援
生命週期/Hooks不支援(例如 useEffect支援
互動(Events)不支援(例如 onClick支援
資料取得支援 async/await透過 useEffect 或資料取得函式庫
匯入規則不能匯入客戶端元件可以匯入伺服器端元件(作為 childrenprop

經驗法則: 預設將所有元件視為 Server Components。只有當你的元件需要使用 useStateuseEffect 或處理使用者事件(onClick 等)時,才在檔案頂部加入 "use client"; 指令,將其標記為 Client Component。

4. 它們如何協同運作?

一個現代 React 應用程式會是兩者的混合體。例如,一個部落格文章頁面:

  • PageLayout(Server Component): 負責整體版面配置。
  • ArticleContent(Server Component): 從資料庫或 Markdown 檔案中取得文章資料並渲染。
  • LikeButton(Client Component): 包含 useStateonClick 事件來處理按讚互動。
  • Comments(Client Component): 取得並顯示留言,包含表單送出等互動。

伺服器端元件可以在伺服器端「持有」客戶端元件的「位置」,最終在瀏覽器中將兩者無縫地拼接在一起。

結論

React Server Components 是一次深刻的範式轉變,它將 React 的能力從瀏覽器擴充套件到了伺服器,帶來了顯著的效能優勢和更優的開發體驗。雖然它引入了新的心智模型,但透過 Next.js App Router 等框架的實踐,RSC 正在快速成為建構高效能、可擴充 Web 應用程式的新標準。