第二周筆記-ServerComponent與ClientComponent
第二周筆記 - Server Component 與 Client Component
當大家使用到Nextjs時,看到不同介紹和文檔時,在內容中都會經常見到 Server Component 與 Client Component,然而大家又對它們有多少了解呢?
為了讓大家進一步了解,我就整理了相關資訊作出初步介紹。
在探討它們之前,首先要認識什麼是Server與Client。
Server (伺服器) 就是指數據中心中的計算機,它主要是用於儲存應用程式程式碼、接收來自客戶端的請求、執行一些計算過程然後將結果發出去。
Client (客戶端) 是指用戶設備上的瀏覽器,它會向伺服器發送請求,然後從伺服器接收到的回應(想要的結果),之後再轉換合適的格式,然後展示在用戶介面上。
在 Nextjs 項目下的 app 目錄中,所有 component 都會被預設為 Server Component,而 Server Component 和 Client Component 可以同時存在相同的地方(文件夾)。開發者可以自行選擇不同的 component 想要渲染的環境。
在 Server Component 中的 component 可以保證只在 server side 進行渲染。
在 Client Component 中的 component 會主要在 client side 進行渲染,不過 Next.js 中可以在 server side 預渲染,完成之後再於 client side 進行混合使用。
然而,在使用 Client Component 時會有限制,例如: 在 Client Component 裡是不能直接使用 Server Component,需要透過其他方式引入使用。因為 Client Component 是在 Server Component 之後渲染,在渲染 Client Component 時沒辦法回頭渲染 Server Component。

'use client';
// 這是錯誤的例子
import ServerComponent from './ServerComponent';
export default function ClientComponent() {
return (
<div>
<ServerComponent />
</div>
);
}
因此以上的寫法是不可行的,會出現報錯。
如果要使用 Server Component 的話,就不能直接使用,而是要以 children props 的形式把Server Component 傳入,方法如下:

export default function ServerComponent() {
return (
<div>
This is ServerComponent
</div>
);
}

'use client';
//import ServerComponent from './ServerComponent';
export default function ClientComponent({children}:any) {
return (
<div>
{children}
</div>
);
}

import ServerComponent from './ServerComponent';
import ClientComponent from './ClientComponent'
export default function Home() {
return (
<ClientComponent>
<ServerComponent />
</ClientComponent>
)
}
npm run dev
如果能看到以上畫面就表示成功。
情況 | Server Component | Client Component |
---|---|---|
獲取數據 (fetch data) | ✅ | ❌ |
直接訪問後端資源 (access backend resources) | ✅ | ❌ |
在 server 上儲存敏感信息 (access tokens, API keys, etc) | ✅ | ❌ |
將大型依賴(dependencies)保留在服務器上 / 減少 client side 的 JavaScript | ✅ | ❌ |
加入互動性(interactivity)及監聽事件(onClick(), onChange(), etc) | ❌ | ✅ |
使用 (useState(), useReducer(), useEffect(), etc) | ❌ | ✅ |
使用 browser-only APIs ( localStorage, XMLHttpRequest, etc) | ❌ | ✅ |
使用自定義的 hooks | ❌ | ✅ |
使用 React Class components | ❌ | ✅ |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!