CSR у Next.js. Як працює і що у нього під капотом

Володимир Кириленко

Зайшов на сторінку, а там — спінери, skeleton і порожнеча?

Це не баг, це — CSR у Next.js. Дивимось, як воно працює під капотом, і чому це може зруйнувати твій LCP.

CSR означає, що HTML генерується безпосередньо браузером за допомогою React-компонентів, а не сервером.

Як це працює під капотом?

Сервер віддає мінімальний HTML — лише контейнер для React + скрипти ➡️ Завантажуються JS-чанки (main, framework, use client‑компоненти) ➡️ Hydration — React поєднує серверно згенерований HTML із клієнтськими компонентами ➡️ Запускається інтерактивність — useState, useEffect, Web APIs ➡️ Фетчинг після рендеру — через useEffect, SWR, React Query тощо.

Отож які основні характеристики CSR?

  • App Router за замовчуванням — Server Components. CSR з’являється лише в межах файлів із директивою ‘use client’ або при динамічному імпорті з ssr: false.
  • ‘use client’ потрібно ставити на вході дерева, яке має бути клієнтським. Усе нижче по дереву автоматично стає Client (не завжди, насправді).
  • next/dynamic(…, { ssr: false }) створює клієнтський «острів» навіть у серверному дереві — корисно для важких віджетів/бібліотек.

Переваги CSR:

  • Висока інтерактивність: реактивні UI, миттєвий відгук на події.
  • Web APIs доступні одразу: Clipboard, WebSockets, WebRTC, LocalStorage.
  • Простий фронтенд-хостинг.
  • Менше навантаження на сервер: всі рендери відбуваються на клієнті.

Недоліки та виклики:

  • FCP/LCP можуть провалюватися, якщо великі клієнтські острови блокують гідратацію.
  • TTI/INP ростуть із розміром бандла (масивні UI‑кіти, графічні бібліотеки, синхронні ініціалізації).
  • SEO‑ризики: контент усередині Client‑компонентів не з’являється в первинному HTML (видимий лише після JS). Для SEO‑критичного контенту тримай його в Server Components.

Глобально CSR компонент — звичайний React компонент з ‘use client’ директивою на початку. Він однозначно потребує свідомого підходу. Контролюй розмір бандлів, використовуй серверні компоненти за замовчуванням і додавай клієнтські острівці взаємодії тільки там, де це необхідно.

Цей текст взято з особистого блогу після отримання дозволу автора.

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту та натисніть Ctrl+Enter.

Останні статті

Чому я пишу про факапи?

Таке запитання мені поставив мій знайомий, коли побачив мій профіль. Я настільки над цим задумалась,…

30.07.2025

Як налаштувати штучний інтелект з унікальною базою знань? (безкоштовно)

Нещодавно я вписався в один цікавий проєкт. Довелося розібратись з процесом звітності американських фармацевтичних компаній…

29.07.2025

Одного разу я сильно посварився з СЕО компанії або Коли треба вчасно зупинитися і вміти сказати «ні»

Одного разу я сильно посварився з СЕО компанії. Він кричав на мене, а я у…

28.07.2025

Навіщо тестові, коли є портфоліо?

Одразу два офтопи: Я також виконувала тестові; Тестове має бути коротким, чітким, і, бажано, оплачуваним.…

25.07.2025

Припиніть писати код, як ніби ви працюєте в Google

Давайте відразу розставимо крапки над «і». Ви не працюєте в Google. Я теж. Більшість з…

24.07.2025

Штучний інтелект Tesla. Навіщо?

Моя Tesla зробила мене поганою водійкою. Я завжди приїжджала на кілька хвилин пізніше, ніж передбачав…

23.07.2025