Проверяет понимание различий между серверным и клиентским окружением в Next.js и умение выбирать правильный подход для выполнения кода в нужной среде.
В Next.js (App Router) по умолчанию все компоненты являются Server Components: они рендерятся на сервере, не попадают в клиентский бандл и могут напрямую обращаться к базе данных, файловой системе или переменным окружения без префикса NEXT_PUBLIC_. Клиентские компоненты нужны там, где требуется интерактивность: useState, useEffect, обработчики событий, доступ к window или localStorage.
"use client" в первой строке файла превращает модуль и всех его импортируемых детей в Client Components.typeof window === "undefined" — true на сервере, false в браузере.// app/page.tsx (Server Component по умолчанию)
import ClientCounter from "./ClientCounter";
import { db } from "@/lib/db";
export default async function Page() {
const users = await db.user.findMany(); // только на сервере
return (
<div>
<p>Users: {users.length}</p>
<ClientCounter />
</div>
);
}
// app/ClientCounter.tsx
"use client";
import { useState } from "react";
export default function ClientCounter() {
const [n, setN] = useState(0);
return <button onClick={() => setN(n + 1)}>{n}</button>;
}
Если нужно выполнить код только в браузере (например, работу с window), его помещают в useEffect внутри Client Component — тогда он не выполнится при серверном рендере и не сломает SSR.
Итог: используйте Server Components для данных и секретов, Client Components — для интерактивности; директива "use client" и проверка typeof window позволяют чётко разделить серверный и клиентский код.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию