Capítulo 80 de 456
Explica onde Server e Client Components rodam de fato, o que atravessa a fronteira entre eles (código via imports, dados via props serializáveis), e as regras práticas para compor os dois num mesmo tree.
'use client'.use (React): hook que permite a um Client Component ler uma promise passada como prop de um Server Component, streamando dado sem fetch adicional no cliente; enquanto pendente, o <Suspense> mais próximo mostra o fallback.fetch idênticas são memoizadas durante um render de servidor.children), preservando o Server Component rodando no servidor.onClick) não cruzam — só Server Functions ('use server') cruzam, como referência.import { Cart } from '@/app/ui/cart'
import { Modal } from '@/app/ui/modal'
// Page and Cart are Server Components. Modal is a Client Component
export default function Page() {
return (
<Modal title={<div>Your cart</div>}>
<Cart />
</Modal>
)
}
'use client'
import { useState, type ReactNode } from 'react'
export function Modal({ title, children }: { title: ReactNode; children: ReactNode }) {
const [open, setOpen] = useState(true)
if (!open) return null
return (
<div role="dialog">
<header>{title}<button onClick={() => setOpen(false)}>Close</button></header>
{children}
</div>
)
}
Cart (Server Component) é passado como children para Modal (Client Component) — Cart roda no servidor e Modal só recebe seu output renderizado, nunca importa seu código.'use server' functions cruzam a fronteira, como referência.Menu.Item) quando o Server Component importa um Client Component: o Server Component recebe uma referência cliente em vez da função, então Menu.Item vira undefined e React lança "Element type is invalid". Use named exports em vez de static properties para consumo a partir de Server Components.'use client' em todo arquivo de uma subárvore: desnecessário — a diretiva só precisa estar na entrada da subárvore cliente; todo módulo importado a partir dali já entra no client graph.children/props de React element para deixar um Server Component aninhado dentro de um Client Component sem que o Client Component precise importar seu código.<details>, <form action={serverFunction}>, <video controls>) dá interatividade sem precisar de Client Component.'use client', crie um wrapper Client Component que o importa e coloque a diretiva só no wrapper.