PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Серверные компоненты в Next.js 15: когда SSR лучше CSR и наоборот

    Серверные компоненты в Next.js 15: когда SSR лучше CSR и наоборот

    Аватар автора Серверные компоненты в Next.js 15: когда SSR лучше CSR и наоборот

    Антон Ларичев

    Иконка календаря19 марта 2026
    next.jsreacttypescriptmiddleИконка уровня middle
    Картинка поста Серверные компоненты в Next.js 15: когда SSR лучше CSR и наоборот

    Введение

    Серверные компоненты в Next.js 15 изменили подход к построению веб-приложений на React. С переходом на App Router все компоненты по умолчанию выполняются на сервере, что открывает новые возможности для оптимизации производительности и SEO. Но значит ли это, что клиентские компоненты больше не нужны?

    В этой статье разберём, как работают серверные и клиентские компоненты в Next.js 15, когда SSR (Server-Side Rendering) даёт преимущество перед CSR (Client-Side Rendering) и наоборот. Рассмотрим практические примеры и типичные ошибки.

    Как работают серверные компоненты в Next.js 15

    React Server Components (RSC) выполняются исключительно на сервере. Их код не попадает в JavaScript-бандл браузера, что уменьшает объём загружаемых данных. Сервер отрисовывает HTML и стримит его клиенту через React 18 Streaming.

    // app/products/page.tsx — серверный компонент (по умолчанию)
    async function ProductsPage() {
      // Прямой запрос к базе данных — безопасно, код не уходит в браузер
      const products = await db.product.findMany({
        where: { isActive: true },
        orderBy: { createdAt: 'desc' },
      });
    
      return (
        <main>
          <h1>Каталог товаров</h1>
          {products.map((product) => (
            <ProductCard key={product.id} product={product} />
          ))}
        </main>
      );
    }
    
    export default ProductsPage;
    

    Серверный компонент может напрямую обращаться к базе данных, файловой системе или внутренним API. Это устраняет необходимость в промежуточном API-слое для получения данных.

    Когда использовать клиентские компоненты

    Клиентские компоненты нужны для интерактивности: обработки событий, управления состоянием через хуки и работы с API браузера. Чтобы объявить компонент клиентским, добавьте директиву "use client" в начало файла.

    "use client";
    
    // components/SearchFilter.tsx — клиентский компонент
    import { useState, useTransition } from 'react';
    import { useRouter } from 'next/navigation';
    
    export function SearchFilter() {
      const [query, setQuery] = useState('');
      const [isPending, startTransition] = useTransition();
      const router = useRouter();
    
      const handleSearch = (value: string) => {
        setQuery(value);
        startTransition(() => {
          // Обновляем URL с параметрами поиска
          router.push(`/products?search=${encodeURIComponent(value)}`);
        });
      };
    
      return (
        <input
          type="text"
          value={query}
          onChange={(e) => handleSearch(e.target.value)}
          placeholder="Поиск товаров..."
          className={isPending ? 'opacity-50' : ''}
        />
      );
    }
    

    Какие задачи требуют директиву use client

    Используйте "use client", когда компоненту нужны:

    • Хуки React — useState, useEffect, useRef, useContext
    • Обработчики событий — onClick, onChange, onSubmit
    • API браузера — localStorage, window, navigator, IntersectionObserver
    • Сторонние библиотеки с клиентской логикой — карусели, модальные окна, дропдауны

    SSR vs CSR: сравнение подходов рендеринга

    Разница между SSR и CSR в Next.js 15 проявляется на нескольких уровнях.

    Производительность и время загрузки

    SSR через серверные компоненты выигрывает по метрике Time to First Byte (TTFB) и First Contentful Paint (FCP). Пользователь видит контент до загрузки JavaScript. CSR требует сначала загрузить и выполнить JS-бандл, и только потом начинается рендеринг.

    // SSR — данные приходят вместе с HTML
    // app/blog/[slug]/page.tsx
    async function BlogPost({ params }: { params: { slug: string } }) {
      const post = await getPostBySlug(params.slug);
    
      return (
        <article>
          <h1>{post.title}</h1>
          <div dangerouslySetInnerHTML={{ __html: post.content }} />
        </article>
      );
    }
    
    "use client";
    
    // CSR — данные загружаются после монтирования
    import { useEffect, useState } from 'react';
    
    function Dashboard() {
      const [stats, setStats] = useState(null);
    
      useEffect(() => {
        // Запрос выполняется в браузере после гидратации
        fetch('/api/stats')
          .then((res) => res.json())
          .then(setStats);
      }, []);
    
      if (!stats) return <p>Загрузка...</p>;
    
      return <StatsGrid data={stats} />;
    }
    

    SEO и индексация

    Серверный рендеринг критически важен для страниц, которые должны индексироваться поисковиками: блоги, каталоги, лендинги. Поисковые роботы получают готовый HTML без необходимости выполнять JavaScript.

    CSR подходит для закрытых разделов — личных кабинетов, дашбордов, админок, где SEO не играет роли.

    Как передать серверный компонент в клиентский

    Клиентские компоненты не могут импортировать серверные напрямую. Но есть паттерн композиции через children:

    // components/InteractiveWrapper.tsx
    "use client";
    
    import { useState } from 'react';
    
    export function InteractiveWrapper({ children }: { children: React.ReactNode }) {
      const [isOpen, setIsOpen] = useState(false);
    
      return (
        <div>
          <button onClick={() => setIsOpen(!isOpen)}>
            {isOpen ? 'Скрыть' : 'Показать'}
          </button>
          {isOpen && children}
        </div>
      );
    }
    
    // app/page.tsx — серверный компонент
    import { InteractiveWrapper } from '@/components/InteractiveWrapper';
    
    async function ServerContent() {
      const data = await fetchData(); // Выполняется на сервере
      return <pre>{JSON.stringify(data, null, 2)}</pre>;
    }
    
    export default function Page() {
      return (
        <InteractiveWrapper>
          <ServerContent />
        </InteractiveWrapper>
      );
    }
    

    Серверный компонент ServerContent передаётся как children в клиентский InteractiveWrapper. Рендеринг серверного компонента происходит на сервере, а клиентский добавляет интерактивность.

    Разница между SSR и серверными компонентами

    Важно не путать классический SSR и React Server Components. При SSR (через getServerSideProps в Pages Router) весь компонент рендерится на сервере, но затем полностью гидратируется на клиенте — весь JavaScript отправляется в браузер.

    Серверные компоненты в App Router работают иначе: их код вообще не попадает в клиентский бандл. Гидратация происходит только для клиентских компонентов, что существенно уменьшает размер JavaScript.

    // Pages Router (старый SSR) — код уходит в бандл
    export async function getServerSideProps() {
      const data = await fetchData();
      return { props: { data } };
    }
    
    // App Router (RSC) — код остаётся на сервере
    async function Page() {
      const data = await fetchData();
      return <div>{data.title}</div>;
    }
    

    Частые ошибки при работе с серверными компонентами

    Избыточное использование "use client". Не делайте клиентским весь компонент, если интерактивность нужна только в его части. Выносите интерактивную логику в отдельный мелкий клиентский компонент.

    Попытка использовать хуки в серверном компоненте. useState, useEffect и другие хуки работают только в клиентских компонентах. Если видите ошибку гидратации — проверьте, не забыли ли вы директиву "use client".

    Импорт серверного компонента в клиентский. Вместо прямого импорта используйте паттерн с children или props, как показано выше.

    Хранение секретов в серверных компонентах без проверки. Хотя код серверных компонентов не попадает в бандл, убедитесь, что вы не передаёте секреты через props в клиентские компоненты.

    Заключение

    Серверные компоненты в Next.js 15 — это не замена клиентских, а дополнение. Используйте SSR и серверные компоненты для контентных страниц, SEO-критичных разделов и работы с данными. Оставьте CSR и клиентские компоненты для интерактивных элементов интерфейса. Гибридный подход, где серверные и клиентские компоненты комбинируются через композицию — это оптимальная стратегия для современных Next.js-приложений.

    Иконка глаза877

    Комментарии

    0

    Постройте личный план изучения JavaScript с нуля - основы языка и практика для начинающих до уровня Middle — бесплатно!

    JavaScript с нуля - основы языка и практика для начинающих — часть карты развития Frontend, Backend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Продвинутый JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    TypeScript с нуля

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Neovim

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста TypeScript дженерики на практике: примеры и лучшие приёмы
    Иконка аватараАнтон
    Иконка календаря11 сентября 2026
    typescriptдженерикиgenerics+ 1middleИконка уровня middle

    TypeScript дженерики на практике: примеры и лучшие приёмы

    TypeScript дженерики на практике: как писать переиспользуемые типобезопасные функции, интерфейсы и хуки без потери контроля над типами.

    Иконка чипа0
    Иконка глаза155
    Иконка комментариев0
    Картинка поста REST API: best practices проектирования для бэкенд-разработчиков
    Иконка аватараАнтон
    Иконка календаря16 сентября 2026
    REST APIбэкендархитектура APImiddleИконка уровня middle

    REST API: best practices проектирования для бэкенд-разработчиков

    REST API best practices: как проектировать понятные, безопасные и масштабируемые эндпоинты — от именования ресурсов до версионирования и обработки ошибок.

    Иконка чипа0
    Иконка глаза30
    Иконка комментариев0
    Картинка поста Как найти удалённую работу разработчиком без опыта
    Иконка аватараАнтон
    Иконка календаря15 сентября 2026
    удалённая работакарьераджуниор+ 2juniorИконка уровня junior

    Как найти удалённую работу разработчиком без опыта

    Удалённая работа разработчиком без опыта — реальная цель. Разбираем, как собрать портфолио, оформить GitHub и найти первый проект.

    Иконка чипа0
    Иконка глаза83
    Иконка комментариев0
    Иконка чипа0