Junior #server-components#client-components#app-router
Server Component và Client Component trong Next.js App Router khác nhau thế nào?
⚡ Trả lời nhanh
Trong App Router, mọi component mặc định là Server Component: chạy trên server, không gửi JS của nó xuống client, truy cập được DB/secret. Client Component (khai báo 'use client') dùng được state, effect, event handler và browser API, và được hydrate ở client.
| Server Component | Client Component | |
|---|---|---|
| Khai báo | mặc định | 'use client' ở đầu file |
| Chạy ở | server (build hoặc request) | server (prerender HTML) rồi hydrate ở client |
useState, useEffect, onClick | Không | Có |
Truy cập DB, secret, fs | Có | Không |
| JS gửi xuống browser | Không | Có |
// app/page.tsx (Server Component, có thể async)
import Counter from "./counter";
export default async function Page() {
const posts = await db.post.findMany();
return <Counter initial={posts.length} />;
}
// app/counter.tsx
"use client";
import { useState } from "react";
export default function Counter({ initial }: { initial: number }) {
const [n, setN] = useState(initial);
return <button onClick={() => setN(n + 1)}>{n}</button>;
}