跳至內容

10

伺服器與客戶端元件

要了解伺服器元件和客戶端元件如何運作,熟悉兩個網頁基礎概念會有所幫助

  • 您的應用程式程式碼可以執行的環境:伺服器和客戶端。
  • 區分伺服器和客戶端程式碼的網路界線

伺服器和客戶端環境

在網頁應用程式的環境下

Diagram showing a browser on the left and a server on the right, separated by a network boundary.
  • 客戶端是指使用者裝置上的瀏覽器,它會向伺服器發送應用程式程式碼的請求。然後,它會將從伺服器收到的回應轉換成使用者可以互動的介面。
  • 伺服器是指儲存應用程式程式碼、接收來自客戶端的請求、執行一些計算並傳回適當回應的資料中心電腦。

每個環境都有其自身的功能和限制。例如,透過將渲染和資料擷取移至伺服器,您可以減少傳送到客戶端的程式碼量,從而提高應用程式的效能。但是,正如您先前所學,要使您的 UI 具有互動性,您需要在客戶端上更新 DOM。

因此,您為伺服器和客戶端編寫的程式碼並不總是相同。某些操作(例如資料擷取或管理使用者狀態)更適合在其中一個環境中執行。

網路邊界

網路邊界是一條概念上的分界線,用於區隔不同的環境。

在 React 中,您可以選擇在元件樹中的何處放置網路邊界。例如,您可以在伺服器端擷取資料並渲染使用者的貼文(使用伺服器元件),然後在客戶端渲染每個貼文的互動式 LikeButton(使用客戶端元件)。

同樣地,您可以建立一個在伺服器端渲染並在多個頁面之間共用的 Nav 元件,但如果您想要顯示連結的活動狀態,則可以在客戶端渲染 Links 列表。

A component tree showing a layout that has 3 components as its children: Nav, Page, and Footer. The page component has 2 children: Posts and LikeButton. The Posts component is rendered on the server, and the LikeButton component is rendered on the client.

在幕後,這些元件被分成兩個模組圖。伺服器模組圖(或樹)包含所有在伺服器端渲染的伺服器元件,而客戶端模組圖(或樹)包含所有客戶端元件。

伺服器元件渲染完成後,一種稱為 React 伺服器元件酬載 (RSC) 的特殊資料格式會被傳送到客戶端。RSC 酬載包含:

  1. 伺服器元件的渲染結果。
  2. 客戶端元件應渲染位置的佔位符(或空位),以及其 JavaScript 檔案的參考。

React 使用這些資訊來整合伺服器和客戶端元件,並在客戶端更新 DOM。

讓我們看看它是如何運作的。

使用客戶端元件
/app/like-button.js
export default function LikeButton() {}

<button> 元素和 handleClick() 函式從 page.js 移至新的 LikeButton 元件。

/app/like-button.js
export default function LikeButton() {
  function handleClick() {
    setLikes(likes + 1);
  }
 
  return <button onClick={handleClick}>Like ({likes})</button>;
}

接下來,移動 likes 狀態和引入的程式碼。

/app/like-button.js
import { useState } from 'react';
 
export default function LikeButton() {
  const [likes, setLikes] = useState(0);
 
  function handleClick() {
    setLikes(likes + 1);
  }
 
  return <button onClick={handleClick}>Like ({likes})</button>;
}

現在,要讓 LikeButton 成為客戶端元件,請在檔案頂部新增 React 的 'use client' 指令。這會告知 React 在客戶端渲染該元件。

/app/like-button.js
'use client';
 
import { useState } from 'react';
 
export default function LikeButton() {
  const [likes, setLikes] = useState(0);
 
  function handleClick() {
    setLikes(likes + 1);
  }
 
  return <button onClick={handleClick}>Like ({likes})</button>;
}

回到 page.js 檔案,將 LikeButton 元件引入您的頁面。

/app/page.js
import LikeButton from './like-button';
 
function Header({ title }) {
  return <h1>{title ? title : 'Default title'}</h1>;
}
 
export default function HomePage() {
  const names = ['Ada Lovelace', 'Grace Hopper', 'Margaret Hamilton'];
 
  return (
    <div>
      <Header title="Develop. Preview. Ship." />
      <ul>
        {names.map((name) => (
          <li key={name}>{name}</li>
        ))}
      </ul>
      <LikeButton />
    </div>
  );
}

儲存兩個檔案並在瀏覽器中檢視您的應用程式。現在沒有錯誤了,一旦您進行更改並儲存,您應該會注意到瀏覽器會自動更新以反映更改。

這個功能稱為快速重新整理 (Fast Refresh)。它能讓您立即看到任何編輯的回饋,並且在 Next.js 中已預先設定完成。

摘要

回顧一下,您學習了伺服器端和客戶端環境,以及何時使用它們。您也學到 Next.js 預設使用 React 伺服器端元件來提升效能,以及如何選擇在 UI 互動性較小的部分使用客戶端元件。

延伸閱讀

關於伺服器端和客戶端元件,還有更多可以學習的地方。以下是一些額外的資源:

您已完成此章節10

您已學習如何使用伺服器端和客戶端元件。

下一步

11:後續步驟

接下來是什麼?