Серверные компоненты
В серверных компонентах (Server Components App Router) данные получаются прямым вызовом метода API-клиента. SWR и хуки здесь не применяются — они для клиентского кода.
Создание клиента — Автоматическая / Ручная генерация.
Правила
- Прямой
awaitметода клиента. Никаких хуков, обёрток состояний,useEffect— серверный компонент не имеет жизненного цикла React-клиента. - Ошибки бросаются. Не оборачивать
try/catchбез необходимости — Next.js поднимет ближайшийerror.tsx. - Параллельные запросы — через
Promise.all. Последовательныйawaitзаawaitблокирует рендер.
Шаблон
tsx
// src/app/(routes)/users/page.tsx
import { petProjectApi } from 'infrastructure/pet-project-api'
export default async function UsersPage() {
const users = await petProjectApi.user.list()
return (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)
}Параллельные запросы
tsx
export default async function DashboardPage() {
const [users, orders] = await Promise.all([
petProjectApi.user.list(),
petProjectApi.order.list(),
])
return <Dashboard users={users} orders={orders} />
}Передача данных в клиентский компонент
Серверный компонент получает данные и передаёт их пропсами в клиентский. На клиенте данные становятся начальным состоянием — при необходимости перезапрашиваются через SWR (см. Клиентские компоненты).
tsx
// page.tsx (server)
import { petProjectApi } from 'infrastructure/pet-project-api'
import { UsersList } from 'widgets/users-list'
export default async function UsersPage() {
const initialUsers = await petProjectApi.user.list()
return <UsersList initialUsers={initialUsers} />
}Запрет прямого fetch
Серверный компонент тоже использует только клиент из infrastructure/. Прямой fetch в page.tsx или в server-action запрещён теми же правилами, что и на клиенте.