Sejak Next.js 13 memperkenalkan App Router, konsep Server Components dan Client Components menjadi hal esensial yang wajib dipahami setiap developer React.
Server Components (Default)
Secara default, semua komponen di App Router adalah Server Components. Artinya, komponen ini dirender di server dan tidak pernah dikirim ke browser sebagai JavaScript.

Kelebihan:
- Bundle JavaScript lebih kecil (kode tidak dikirim ke client)
- Bisa langsung akses database atau API dengan token rahasia
- Support
async/awaitlangsung di komponen - SEO friendly karena HTML pre-rendered
// app/page.tsx (Server Component - default)
export default async function Page() {
const posts = await getPosts(); // langsung fetch
return (
<ul>
{posts.map(p => (
<li key={p.id}>{p.title}</li>
))}
</ul>
);
}
Client Components
Untuk komponen yang butuh interactivity (state, event handler, browser API), gunakan Client Components dengan directive "use client" di baris pertama.
Kapan pakai Client Components?
- Butuh
useState,useEffect, atau hooks lain - Ada event handler (
onClick,onChange, dll) - Pakai browser-only API (
window,localStorage) - Komponen dari library yang butuh client-side (misal carousel, chart)
// components/SearchBox.tsx
"use client";
import { useState } from "react";
export function SearchBox() {
const [query, setQuery] = useState("");
return (
<input
value={query}
onChange={(e) => setQuery(e.target.value)}
/>
);
}
Aturan Penting
| Fitur | Server Component | Client Component |
|---|---|---|
| fetch data | Direct async | Pakai useEffect |
| useState | Tidak | Ya |
| Event handler | Tidak | Ya |
| Browser API | Tidak | Ya |
Pattern: Composition
Cara terbaik adalah membagi komponen. Server Component fetch data, lalu pass sebagai props ke Client Component.
// app/page.tsx (Server)
import { SearchBox } from "./SearchBox";
export default async function Page() {
const data = await getData();
return <SearchBox initialData={data} />;
}
Kesimpulan: Default ke Server Components. Hanya pakai “use client” ketika benar-benar butuh interactivity. Ini akan membuat aplikasi lebih cepat dan bundle lebih kecil.


