Блок 4 · Урок 7 из 7

Next подробно: сервер и клиент

Что Next.js добавляет поверх React, чем серверные компоненты отличаются от клиентских и когда Next не нужен.

≈ 8 минут ⚡ Next.js, капстоун блока 🎯 цель: понимать «это серверный компонент», «добавь use client» и решать — когда Next оправдан

Зачем это вам

Агент постоянно говорит вещи вроде «это серверный компонент», «добавь "use client" наверх файла», «маршрут через App Router». Без понимания этих слов вы либо соглашаетесь вслепую, либо застреваете на ошибке, которую агент уже объяснил — но на незнакомом языке. После этого урока вы будете понимать эти фразы и самостоятельно решать: когда Next.js оправдан, а когда хватит простого React с Vite. Если вы учите других — этот урок собирает в единую картину всё из блока 4: компоненты, состояние, рендеринг.

Суть в двух абзацах

Next.js — это React плюс три добавки

React (урок 0018) — это библиотека для построения интерфейса из компонентов. Next.js — это фреймворк (готовая структура с правилами), который берёт React за основу и добавляет к нему то, чего у «голого» React нет.

Три главных добавки Next.js:
1. Файловая маршрутизация (routing) — структура папок и файлов в проекте автоматически задаёт адреса страниц (URL-маршруты). Создали папку app/about/page.js — появился маршрут /about. Не нужно настраивать вручную.
2. Рендеринг на сервере — SSR и SSG (из предыдущего урока) встроены и работают из коробки.
3. Серверные и клиентские компоненты — самая важная часть, которую разберём подробно ниже.

Именно поэтому в уроке 0001 Next.js сравнивали с «рестораном под ключ»: приходишь и начинаешь работать, а не строишь кухню с нуля.

Серверные и клиентские компоненты: главное, на чём спотыкаются

В современном Next.js (App Router) компоненты по умолчанию серверные. Это означает: они выполняются на сервере, а не в браузере пользователя.

Серверный компонент может напрямую обращаться к базе данных, читать файлы, делать защищённые запросы — и всё это остаётся на сервере. В браузер уходит только готовый HTML-результат, а не JavaScript-код самого компонента. Это быстрее и безопаснее: ключи от базы, секретные токены, тяжёлые библиотеки не путешествуют до пользователя.1

Но серверный компонент не умеет реагировать на действия пользователя. Если внутри него написать useState (состояние из урока 0019) или обработчик клика — Next выдаст ошибку. Причина простая: состояние и обработчики работают в браузере, а этот компонент живёт на сервере.

Решение — директива "use client" в начале файла. Она сигнализирует Next.js: этот компонент клиентский, его нужно отправить в браузер и там выполнять. Только тогда внутри можно использовать состояние, обработчики кликов, ввод с клавиатуры.

"use client"

// Эта директива в начале файла делает компонент клиентским —
// теперь внутри можно использовать состояние и обработку кликов

import { useState } from "react"

export default function Counter() {
  const [count, setCount] = useState(0)
  return <button onClick={() => setCount(count + 1)}>{count}</button>
}

Без "use client" в App Router компонент серверный. Директива в первой строке файла делает его клиентским — интерактивным.

📌 Практическое правило: увидели ошибку «useState is not allowed in Server Components» или «You cannot use hooks here» — значит, компонент серверный, но просит клиентский функционал. Решение: добавить "use client" в самое начало файла, до всех импортов.

Когда Next, а когда нет

Ситуация Рекомендация Почему
Нужен SEO или быстрый первый показ
публичный сайт, блог, каталог
Next.js ✓ SSR/SSG встроены; поисковики видят готовый HTML
Фронтенд и серверная часть вместе
API-маршруты, работа с базой
Next.js ✓ Один проект вместо двух; серверные компоненты обращаются к базе напрямую
Маршрутизация нужна сразу
несколько страниц, навигация
Next.js ✓ Файловый роутинг работает из коробки
Простой SPA или внутренний инструмент за логином
дашборд, личный кабинет без SEO
React + Vite Меньше конфигурации, быстрее запуск, SEO не нужен
Чисто статический сайт
лендинг из одной страницы без данных
Простой генератор или чистый HTML Next — избыточен; лишняя сложность без пользы

Аналогия, которую можно пересказать

Ресторан: кухня и зал

Серверный компонент — кухня, куда гостю нельзя. Там готовят блюдо (берут данные из базы, делают тяжёлую работу), рецепты и ключи от склада остаются на кухне, а в зал выносят только готовый результат.
Клиентский компонент ("use client") — зал с официантом и кнопкой вызова. Всё, что реагирует на гостя (нажатия, ввод, состояние), работает прямо за столом — в браузере.
Файловая маршрутизация — план зала: какая дверь (файл/папка) ведёт в какой зал (страницу). Добавили дверь — появился зал.
«В зал выносят только готовое» — на клиент уходит меньше кода: ключи и тяжёлое остаются на сервере, браузер получает только результат.

Кухня и зал работают вместе. Серверный компонент может включать в себя клиентские — как страница ресторана включает и кухню, и зал. Разграничение даёт скорость и безопасность.

Запомните одно

В App Router всё серверное по умолчанию. «use client» — ключ к интерактивности.

В современном Next.js (App Router) компонент серверный, пока вы явно не сказали обратное. Это хорошо: сервер быстрее, безопаснее, не тащит лишний код в браузер. Но как только нужен интерактив — состояние, клик, ввод — пишете "use client" первой строкой файла, и компонент становится клиентским.

Это и есть главная идея React Server Components (RSC) — разделить мир на «что готовится на кухне» и «что происходит за столом», и явно управлять этой границей.

Что это даёт на практике

Фраза агента → что он имеет в виду

«Это серверный компонент»
Выполнится на сервере — можно брать данные из базы прямо тут. Добавить сюда useState или onClick — будет ошибка. Нужен интерактив? Скажите агенту — он добавит "use client".
«Добавь "use client"»
Поставить эту строку первой в файле компонента, выше всех импортов. После этого внутри заработают состояние, обработчики кликов и всё остальное интерактивное.
«Через App Router / по папкам»
Маршруты (страницы) задаются структурой папок в папке app/. Каждая папка с файлом page.js внутри — это один URL. Никакой ручной настройки роутинга.
«Не тащи это на клиент»
Оставить логику в серверном компоненте: быстрее загрузка, ключи и секреты не попадут в браузер пользователя, тяжёлые библиотеки не увеличат размер JS-бандла.

Next.js — фреймворк на базе React: добавляет файловую маршрутизацию, серверный рендеринг (SSR/SSG) и разделение на серверные и клиентские компоненты.

Файловая маршрутизация — структура папок и файлов в папке app/ задаёт адреса страниц (URL); не нужно настраивать вручную.

Серверный компонент — выполняется на сервере (по умолчанию в App Router), может брать данные напрямую, не отправляет свой JavaScript в браузер; не поддерживает состояние и обработчики.

Клиентский компонент ("use client") — выполняется в браузере; нужен для интерактива: состояние, обработка кликов, ввод, браузерные API.

Проверьте себя

Четыре вопроса с мгновенной проверкой

1. Что Next.js добавляет поверх React?

2. Серверный компонент в Next (по умолчанию в App Router)…

3. Когда компоненту нужна директива "use client"?

4. Когда Next.js — не лучший выбор?

Куда мы идём

Программа курса — 7 блоков