Server Components (RSC) виконуються лише на сервері (або під час збирання) і ніколи не потрапляють у JavaScript-бандл клієнта. Вони можуть бути асинхронними й напряму читати базу, файли, секрети.
// Server Component (за замовчуванням у Next.js App Router)
async function PostPage({ id }) {
const post = await db.posts.find(id); // запит прямо в компоненті
return (
<article>
<h1>{post.title}</h1>
<LikeButton postId={id} /> {/* клієнтський острівець */}
</article>
);
}
'use client';
// Client Component: стан, ефекти, обробники подій
export function LikeButton({ postId }) {
const [liked, setLiked] = useState(false);
return <button onClick={() => setLiked(!liked)}>♥</button>;
}
Відмінності:
- Server: немає
useState,useEffect, обробників подій і API браузера. Зате нуль байтів JavaScript на клієнті й доступ до серверних ресурсів без окремого API. - Client: звичайний React з інтерактивністю. Позначаються директивою
'use client'- вона задає межу: файл і все, що він імпортує, потрапляє в клієнтський бандл.
Чим це відрізняється від SSR: SSR рендерить увесь застосунок у HTML на сервері, але потім увесь код завантажується в браузер і гідратується. RSC - це компоненти, код яких у браузер не потрапляє взагалі. Їх використовують разом із SSR.
Що варто знати:
- Server Component може рендерити Client Component, але не навпаки (крім передачі через
children). - Props від сервера до клієнта мають бути серіалізовними: функції передати не можна, хіба що серверні дії (
'use server'). - RSC потребують фреймворку з підтримкою (Next.js, React Router з RSC) - у звичайному Vite-застосунку їх немає.