Розробка фронтенду на Next.js: SSR, SSG, ISR і App Router

Повільний відгук і просідання в пошуковій видачі зазвичай зводяться до того, як відрендерено сторінки каталогу. Ми розробляємо фронтенд на Next.js під ключ: серверний рендеринг, статичні сторінки й оновлення кешу налаштовуємо так, щоб сторінки відповідали швидше, а позиції у видачі зростали. Обговоримо задачу й повернемося з планом та оцінкою робіт.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка фронтенду на Next.js: SSR, SSG, ISR і App Router
Середній
від 1 тижня до 3 місяців
Часті запитання

Розробка Next.js: де вузьке місце і що ламається

Вузьке місце рендерингу майже завжди виглядає однаково: сервер віддає порожній каркас, а вся логіка — фільтри каталогу, підстановка цін, підвантаження списків — виконується в браузері.

На середньому мобільному це секунди білого екрана, і зростання відмов починається раніше, ніж метрики встигають його показати.

Повільне завантаження сторінок рідко пояснюється одним важким файлом. Зазвичай це накопичений клієнтський код: кожен новий блок, віджет і зовнішній лічильник підключається одразу до всіх сторінок, бо розділення за маршрутами немає. Пакет зростає монотонно — разом із ним зростає час до першого рендерингу й вартість кожної зміни.

Окрема поломка — сторінки-пустушки у пошуковій видачі. Якщо вміст підставляється скриптом уже після завантаження, робот індексує заглушку: заголовок без тексту, каталог без позицій, статтю без абзаців.

Це пряма втрата позицій у пошуку за запитами, де напрямок раніше тримався в топі, і повернути їх дорожче, ніж не втрачати.

У всіх трьох симптомів одна причина — архітектурне розгалуження: який обсяг роботи віддається серверу, що кешується і на який строк, а що справді має жити в браузері. У Next.js це режими рендерингу та межі між серверними й клієнтськими компонентами, а не вибір бібліотеки. Розбираємо, як це закривається і що змінюється в цифрах.

Що дає серверний рендеринг: ефект у метриках і видачі

Швидкість першого рендерингу

Серверний рендеринг віддає розмітку вже готовою, тому браузер показує контент, не чекаючи завантаження й виконання скриптів. Час до першого рендерингу скорочується до одного мережевого запиту, і на медіанній мобільній мережі розрив із клієнтською збіркою помітний одразу.

Індексація сторінок

Пошуковий робот отримує той самий HTML, що й відвідувач, без черги на виконання скриптів. Частка сторінок в індексі зростає: зникають порожні відповіді та дублі, які з’являлися, коли контент збирався вже в браузері. Метадані й мікророзмітка формуються на сервері, тому сніпети стабільні для кожної картки й розділу.

Навантаження на пристрій клієнта

Сервер надсилає обчислену розмітку, а не дані для її збирання, тому слабкі телефони й бюджетні ноутбуки витрачають менше процесорного часу та заряду. На клієнті залишається лише інтерактивність — форми, фільтри, переходи без перезавантаження сторінки.

Стійкість до пікового трафіку

Готові та кешовані відповіді йдуть із пограничного шару, минаючи застосунок, — сплеск відвідуваності не перетворюється на чергу на бекенді.

Сторінки оновлюються за розкладом або за подією, тому під навантаженням зберігається актуальність даних, а за деградації джерела кеш продовжує віддавати контент.

Розробка Next.js: SSR, SSG, ISR і клієнтський рендеринг

В App Router режим віддачі задається не для всього застосунку, а на рівні сегмента маршруту: каталог може роздаватися статикою, особистий кабінет — рендеритися на сервері під кожен запит, а новинний розділ — оновлюватися за розкладом.

Тому «вибрати один режим для проєкту» — питання поставлено неправильно: рішення ухвалюється для кожного типу сторінок окремо.

Далі вибір зводиться до компромісу між часом до першого байта, свіжістю даних і навантаженням на сервер.

Статика та ISR віддають готовий HTML без звернення до сервера застосунку й тримають трафік, але показують дані на момент останнього оновлення; SSR завжди актуальний, але кожен запит коштує обчислень, а блоки під користувача без серверного рендерингу з’являються лише після гідратації.

Зведення за режимами

Режим Коли підходить Обмеження
SSG Лендінги, документація, довідкові сторінки: контент змінюється під час релізу Зміна потребує перезбирання, персоналізація недоступна
ISR Каталог, картки товарів, новини: контент змінюється, але не щосекунди До оновлення може віддаватися попередня версія, зростає обсяг кешу
SSR Особистий кабінет, кошик, пошукова видача, сторінки під авторизацією Відгук залежить від сервера й зовнішніх джерел, вище навантаження
Клієнтський рендеринг Віджети та інтерактивні панелі всередині вже відрендереної сторінки У цьому блоці немає готового HTML для пошукових систем, дані надходять із затримкою

На практиці режими комбінуються всередині одного дерева маршрутів: сторінка віддається статикою, а її персональні блоки підвантажуються окремо.

Етапи впровадження: від аудиту до передачі інженерам

Порядок етапів визначається ризиками, а не зручністю: спочатку знімаємо невизначеність щодо поточного коду, потім змінюємо маршрутизацію, і тільки згодом торкаємося навантаження й приймання.

На кожному кроці фіксуємо стан до і після — приймання робіт спирається на вимірювання, а не на враження.

  1. Аудит фронтенду. Розбираємо структуру сторінок і маршрутів, джерела даних і обсяг коду, що йде в браузер. На виході — карта вузьких місць з оцінкою впливу на швидкість віддачі.
  2. Схема маршрутів і даних. Розкладаємо сторінки за режимами: статика, збирання на сервері під запит, оновлення за розкладом або подією. Для кожного маршруту — джерело даних і поведінка за його недоступності.
  3. Налаштування рендерингу. Переносимо схему в App Router, розмічаємо серверні та клієнтські компоненти, задаємо правила оновлення й точкову інвалідацію за тегами, щоб правка однієї сутності не скидала весь кеш.
  4. Міграція без простою. Нові маршрути працюють паралельно зі старими, звіряння відповідей відбувається на живому трафіку, перемикання — у міру збігу.
  5. Перевірка під навантаженням. Вимірюємо час до першого байта, частку помилок, холодний старт і поведінку за відмови зовнішніх сервісів.
  6. Приймання робіт. Звіряємо метрики до і після, фіксуємо чек-ліст маршрутів, сценарій відкату на попередню версію та регламент оновлення контенту.
  7. Передача інженерам. Архітектурна документація, схема маршрутів, доступи й регламенти — команда веде проєкт далі сама.

Артефакти проєкту: репозиторій, схеми, регламенти

Проєкт передається не архівом файлів, а робочою системою: за нею новий інженер піднімає середовище й випускає реліз, не розшукуючи автора. Нижче — перелік артефактів, які залишаються в замовника разом із вихідним кодом.

  • Репозиторій і структура маршрутів — дерево сегментів, вкладені макети, межі завантаження й обробки помилок. За ним одразу видно, яка адреса віддається статикою, яка рендериться на сервері, а яка живе на клієнті.
  • Конфігурація маршрутів — переадресації, переписування адрес, заголовки відповіді та правила доступу зібрані в одному місці, а не розкидані по обробниках.
  • Схема потоків даних — звідки надходять дані, де серверний шар, де клієнтський, які запити кешуються, а які йдуть напряму до джерела.
  • Політики кешування — для кожного маршруту зафіксовано режим віддачі, строк життя запису та умову його скидання за подією, а не за таймером. Це те, що найчастіше ламається під час доопрацювань без документації.
  • Регламент релізів і розгортання — порядок збирання, обов’язкові перевірки, схема гілок, порядок розгортання на тестове середовище й відкат на попередній випуск.
  • Інструкції із супроводу фронтенду — оновлення залежностей, поведінка в разі розбіжності даних і кешу, точки контролю в разі падіння збірки.
  • Документація проєкту — схема середовищ, змінні, порядок доступів, журнал відомих обмежень і передача з розбором для команди замовника.

Кейс: каталог на мільйон сторінок почав відповідати помітно швидше

Каталог на мільйоні товарних сторінок рендерився на сервері на кожен запит: час відповіді на піку сягав 1,9 с, пошукові роботи обходили розділи повільно, в індексі трималося менше половини карток.

У дні розпродажів, коли трафік зростав у шість разів, сервіс починав віддавати помилки, і частина аудиторії йшла до конкурентів.

Ми розвели контент за режимами: категорії та ходові картки віддаємо статикою, решту — за зверненням із фоновим оновленням за правилами перевірки, а персональні блоки (наявність у регіоні, ціну з карткою лояльності) винесли в клієнтські компоненти.

Вітрину перезібрали на серверних компонентах Next.js і потоковій віддачі, а серверну частину каталогу закрили кешем із точковим скиданням за повідомленням про зміну товару: замість повного перезбирання на 40 хвилин оновлюються лише зачеплені сторінки.

Що змінилося за метриками: час відповіді сервера на 95-му процентилі — з 1,9 до 0,3 с, частка сторінок у пошуковому індексі — з 43 до 91%, органічний трафік виріс приблизно у 2,3 раза за квартал.

Шестикратний пік розпродажу сервіс проходить без помилок і деградації, а масова правка цін перестала вимагати повного перезбирання каталогу.

Відгук технічного директора замовника: «Каталог перестав бути вузьким місцем — розпродажі та оновлення цін більше не потребують ручного втручання чергової команди».

Чим серверний рендеринг відрізняється від статичної генерації?

В основі — момент, коли формується HTML. Статична генерація готує сторінки один раз, під час збирання: кожен запит віддає вже зібраний файл із кешу на найближчому до користувача вузлі.

Серверний рендеринг збирає розмітку в момент запиту — під конкретного користувача і з актуальними даними.

Різницю зручно дивитися за трьома осями: актуальність даних на сторінці, поведінка під навантаженням і вимоги до інфраструктури.

У Next.js це не жорсткий вибір із двох варіантів: інкрементальне оновлення віддає сторінку з кешу, а перегенерацію запускає у фоні за інтервалом або на вимогу, коли контент змінився.

Режим віддачі Коли підходить Обмеження
Статична генерація Каталог, лендінги, документація — дані змінюються рідко Правка контенту потребує перезбирання; персоналізація недоступна
Рендеринг за запитом Особисті кабінети, залишки й ціни під конкретного користувача Кожен запит займає ресурс застосунку; піки потребують запасу потужностей
Інкрементальне оновлення Контентні сторінки з частими правками Потрібно керувати кешем і часом життя: залишається вікно застарівання

Під навантаженням поведінка відрізняється принципово. Статика тримає пік завдяки кешуванню відповідей на краю мережі — кількість запитів майже не доходить до застосунку, і вартість інфраструктури зростає повільно.

Рендеринг за запитом щоразу звертається до даних, тому ємність планується під трафік: допомагає кеш проміжного шару, але для персональних відповідей він не працює.

Тому на практиці режими розводять за маршрутами, а не вибирають один на весь проєкт: статика — для публічних розділів, рендеринг за запитом — для персоналізованих, інкрементальне оновлення — для каталогів із регулярними правками.

Сумніви щодо App Router, кешу й маршрутизації

Сумніви перед стартом зазвичай технічні, і знімаються вони на проєктуванні, а не в бою. Нижче — питання, які найчастіше звучать, коли команда вже вибрала Next.js і обговорює перехід на App Router.

Чи можна переходити частинами, не переписуючи сайт повністю?

Так. Нові розділи піднімаємо на App Router, старі маршрути продовжують працювати й переносяться зонами, по одній. Шар даних, стилів і розмітки залишається єдиним, тому відвідувач не бачить швів, а релізи не зупиняються на час переходу.

Чи не почне кеш віддавати старі ціни й залишки?

Кешуємо за типами даних: тексти й каталог — надовго, ціни, наявність і персональні блоки — із коротким строком або без збереження взагалі. Скидання прив’язане до події: змінився товар — перезбираються лише пов’язані сторінки, а не весь сайт.

У нас свій сервер і своє розгортання — доведеться все перебудовувати?

Як правило, ні. Застосунок вирушає в контейнері за ваш проксі, домен, сертифікати й балансування залишаються на місці, змінюються лише кроки збирання. Плани на статичну видачу обговорюємо до старту — від цього залежить набір доступних режимів рендерингу.

Зовнішні сервіси відповідають повільно — сайт буде чекати?

Ні. Відповіді зовнішніх систем забираємо на своїй стороні, з обмеженням часу очікування й запасним значенням: відвідувач отримує готову сторінку, а не очікування чужого сервера. Якщо сервіс недоступний, показуємо коректний варіант і фіксуємо збій для розбору.

Обговоримо задачу: повернемося з планом і оцінкою робіт

Почати можна з обговорення задачі — докладне технічне завдання на вході не потрібне.

Достатньо описати продукт і те, як він має працювати: які сторінки й розділи потрібні, звідки надходять дані, чи потрібна роздача через серверний рендеринг або достатньо статичної генерації з фоновим оновленням.

Корисно побачити поточний код або прототип, якщо він є, і отримати доступи до репозиторію, панелі керування контентом і тестового середовища. Якщо проєкту ще немає — вистачить карти розділів, вимог до авторизації та прикладів інтерфейсів, які вам близькі за логікою.

На виході ви отримуєте:

  • карту маршрутів App Router: які сторінки рендеряться на сервері, які збираються статично;
  • схему джерел даних і правила оновлення кешу;
  • план робіт за етапами з порядком і залежностями;
  • оцінку трудомісткості та строків за кожним етапом;
  • склад команди й точки, де потрібне ваше рішення;
  • перелік ризиків і порядок відкату до попереднього стану.

Це робочий документ, за яким видно, з чого почнеться старт проєкту і що ви отримаєте на кожному кроці. Опишіть задачу в зручному вигляді — повернемося з планом робіт і оцінкою проєкту, а деталі за потреби уточнимо на дзвінку з інженерами.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060