Вступление: 4 часа на деплой контентного сайта

На днях я стряхнул пыль с небольшого пет-проекта. Это простой блог, наверняка каждый из вас хотя бы думал о таком для себя.
В 2015 году я бы просто закинул файлы по FTP на хостинг за 100 рублей. Время деплоя: 30 секунд.
В 2026 году я потратил 4 часа. Я настраивал Edge Middleware, дебажил рассинхрон HTML между клиентом и сервером (hydration mismatch) и разбирался, почему облако не хочет дружить с моей базой данных из-за долгого пробуждения функций (холодного старта).

Где мы свернули не туда?
Это колесо Сансары, которое дало новый оборот.

Помните 2010-е годы? Все писали на PHP.
Как это работало?

  1. Браузер просил страницу.

  2. Сервер шел в базу, клеил HTML и отдавал его.

  3. Пользователь видел контент сразу.

Потом мы сказали: «Фу, перезагрузка страницы – это прошлый век!». И изобрели SPA (Single Page Application). Мы перенесли рендеринг в браузер, убили SEO, заставили телефоны греться, но добились плавных переходов.

Прошло 16 лет. И теперь нам продают React Server Components (RSC).
Давайте посмотрим правде в глаза. Мы вернулись к PHP. Но с одним нюансом.

Скуби-Ду RSC
Скуби-Ду RSC

Найдите 10 отличий

Проведем слепой тест. Первый – код на PHP из 2010-х. Дальше – передовой Next.js код из 2026 года.

PHP (2010):

// index.php
// Без конфигов. Без сборки. Только код.
$db = new SQLite3('products.db');
$result = $db->query('SELECT * FROM items');
?>
<ul>
  <?php while ($row = $result->fetchArray()): ?>
    <li><?= $row['name'] ?></li>
  <?php endwhile; ?>
</ul>

Next.js RSC (2026):

// page.tsx (Server Component)
// Зависимости: Node.js, Webpack, Babel, PostCSS...
import { db } from './db';

export default async function Page() {
  const items = await db.query('SELECT * FROM items');
  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
}

Мы пишем то же самое. Логика та же. Рендеринг на сервере.
Но есть "нюанс" в инфраструктуре.
Чтобы запустить php файл, вам нужен любой шаред-хостинг за 150 рублей.
Чтобы запустить rsc файл, вам нужен:

  • Node.js кластер.

  • CI/CD пайплайн.

  • Система сборки, которая разделяет код на "серверный" и "клиентский".

  • Процесс сериализации данных.

Мы построили космодром, чтобы запустить бумажный самолетик.


Бенчмарк: цена "Hello World!"

Хватит лирики. Смотрим на цифры.
Возьмем пустое приложение, которое просто выводит <h1>Hello World</h1>.

PHP (v8.2):

  • Размер бандла: 0 KB (шлет чистый HTML).

  • Время до интерактивности (TTI): 50 ms.

  • Потребление памяти: 5 MB на процесс.

Next.js (v14, App Router):

  • Размер бандла (JS): 184 KB (React, React DOM, Next Runtime, Webpack runtime). (Даже если вы высушите его минификатором до 80 КБ, это всё ещё 80 КБ против 0 у PHP).

  • Время до интерактивности (TTI): 350 ms (на мобильном 4G).

  • Потребление памяти: 150 MB (Node.js процесс).

Зачем пользователю качать 184 килобайта JavaScript, чтобы увидеть статический текст?
«Но это для будущей интерактивности!» – скажете вы.
Это кредит, который вы берете у пользователя без его спроса. Вы тратите его трафик и батарею на потенциальную возможность, которая может никогда не понадобиться.

Каскад запросов: что происходит в сети

PHP:

[Клиент] -> GET /index.php -> [Сервер]
[Клиент] <- HTML (2kb)   <- [Сервер]
(Готово. Отрисовка в браузере.)

RSC:

[Клиент] -> GET /page -> [Сервер]
[Клиент] <- HTML shell (Skeleton) <- [Сервер] (Первая отрисовка)
[Клиент] -> GET /_next/static/chunks/main.js (React) -> [Сервер]
[Клиент] -> GET /_next/static/chunks/app/page.js (Клиентский код) -> [Сервер]
[Клиент] -> GET /_next/data/.../page.rsc (RSC Payload) -> [Сервер]
[Клиент] (Гидратация...)
(Готово. Интерактив.)
Цена Абстракции
Цена Абстракции

Вы видите разницу? Мы добавили 3 сетевых запроса и 200ms латенсии просто так.
И это на "Hello World". На реальном проекте Waterfall превращается в Ниагарский водопад.


Проблема гидратации и сериализации

Главный аргумент защитников RSC: "Мы убрали гидратацию!".
Это правда, но лишь отчасти.

Да, RSC не гидратируются. Они прилетают как готовый HTML.
Но как только вам нужна интерактивность хоть для одной кнопки "Купить", вы добавляете директиву 'use client'.
И тут начинается магия сетевого барьера (Network Boundary).

Вместо того чтобы просто отдать HTML, сервер теперь должен:

  1. Отрендерить Server Components.

  2. Сериализовать props для Client Components (и не дай бог вы передадите туда функцию или класс — ошибка сериализации!).

  3. Отправить HTML + JSON с данными гидратации.

  4. Браузер должен скачать React, скачать код клиентских компонентов и снова выполнить код, чтобы "оживить" HTML.

Как мы сломали целый шкаф ради одной петли
Это как если бы вы купили шкаф. Сервер (Server Component) собирает его на складе и привозит вам готовым. Вы видите красивый шкаф. Ура!

Но тут заходит бригада грузчиков (Client Component/Hydration). Они говорят: «Нам нужно убедиться, что дверцы открываются».
Они разбирают ваш собранный шкаф обратно на доски прямо у вас в коридоре.
А потом, сверяясь с инструкцией (JSON-данными), собирают его заново у вас на глазах, тратя ваше время и ресурсы процессора.

Гидратация в лицах
Гидратация в лицах

Мы буквально заставляем компьютер делать работу дважды. Сначала на сервере, потом на клиенте.
Эффективно? Нет.
Модно? Да.


Цена сложности

Вся эта сложность имеет конкретную цену.

Сценарий: простой E-commerce магазин.

Стек PHP/Go/Python (Классика):

  • VPS: 500 руб/мес.

  • База данных: на том же VPS (бесплатно).

  • Деплой: git pull или Docker Compose.

  • Итого: 500 рублей. Предсказуемо. Независимо от санкций.

Стек Next.js (облако):

  • Vercel Pro (чтобы не упереться в лимиты): $20/мес (2000 руб).

  • Оплата зарубежной картой: геморрой с посредниками (+20%).

  • Задержка пробуждения (cold start): ваши бессерверные функции "спят". Первый пользователь ждет несколько секунд.

  • Итого: от 2500 руб + нервы оплатой + риск блокировки аккаунта.

Стек Next.js (Docker):

  • VPS: 500 руб/мес (как у PHP).

  • Сложность: вам нужно написать Dockerfile (многоэтапная сборка), настроить Nginx для статики, Redis для кеша и разобраться, почему sharp не собирается на Alpine Linux.

  • Итого: 500 руб + ваши бесплатные выходные, потраченные на DevOps.

Мы платим не за нагрузку. Мы платим за сложность архитектуры и жесткую привязку к платформе (vendor lock-in).

Ловушка "Edge Runtime"

Есть еще один нюанс, о котором молчат в маркетинговых брошюрах.
Vercel активно продвигает Edge Middleware и Edge Functions.
«Это быстрее! Это работает на CDN!» – говорят они.

Но что такое эта "граничная" среда (Edge Runtime)?
Это кастрированный JS. Забудьте про fs, забудьте про привычный Node API. Вас заперли в песочнице и сказали, что это инновации.
Код, написанный под Edge, не запустится в стандартном Node.js контейнере на вашем дешевом VPS.

Вы пишете код, который может работать только в инфраструктуре Vercel (или Cloudflare Workers).
Вы своими руками надеваете наручники vendor lock-in.
Хотите переехать на свое железо, когда счет за Vercel превысит $1000? Переписывайте половину бэкенда.
Только нужно объяснить это бизнесу.


Культ сложности и Resume Driven Development

Почему мы это делаем?
Потому что никто не хочет писать в резюме: «Поддерживаю легаси на jQuery, бизнес доволен».
Все хотят: «Архитектор микрофронтендов на Next.js App Router, мигрировал проект на Edge Runtime».

Индустрия поощряет сложность. Если ты делаешь просто – ты джун. Если ты делаешь сложно – ты сеньор.
Это работает индустриальный комплекс JavaScript. Мы создаем проблемы, чтобы героически их решать и требовать повышения зарплаты.
А бизнес? Бизнес просто платит за "современные технологии", не понимая, что покупает воздух.


Фреймворк как корсет

Но давайте будем объективны. У RSC и тяжеловесных фреймворков вроде Next.js есть одна бесспорная "киллер-фича" – масштабируемость команды.

Когда у вас 50, 100 или 500 фронтендеров, главная проблема бизнеса – это не скорость загрузки страницы и не стоимость серверов. Главная проблема – это броуновское движение разработчиков. Каждый пишет код в своем стиле, каждый придумывает свой велосипед для управления состоянием и свой архитектурный паттерн для запроса данных.

В этот момент Next.js с его жесткой файловой маршрутизацией и RSC становятся архитектурным корсетом. Они навязывают единые рельсы. Шаг влево, шаг вправо – ошибка компиляции. В кровавом энтерпрайзе вам нужно, чтобы код всех 500 человек выглядел одинаково уродливо, но одинаково. Вы меняете производительность приложения на конвейерную сборку, где любого разработчика можно заменить за неделю.

Но когда вы, будучи инди-разработчиком или техлидом стартапа на 3 человека, добровольно тащите этот энтерпрайз-инструмент в свой проект (да-да, личный блог)... вы надеваете на себя смирительную рубашку без всякой на то причины.


Что делать?

Я не призываю всех вернуться в 2010 год (хотя index.html все еще прекрасен).
Я призываю к инженерной честности.

  1. Считайте TCO (Total Cost of Ownership). В России сейчас проще и дешевле поднять VPS, чем мучиться с оплатой облаков. Не тащите Next.js туда, где хватит простого Go/Python или PHP.

  2. Используйте нативные возможности браузеров. View Transitions API уже делает переходы плавными, а новые возможности HTML/CSS позволяют собирать сложные интерфейсы без гигабайтов JS.

  3. Не ведитесь на маркетинг. Vercel продает хостинг. Им выгодно, чтобы ваш код был сложным и привязанным к их серверам.

Иногда лучший фреймворк – это его отсутствие.

Чек-лист: нужен ли вам Next.js?

Я не противник прогресса. Next.js и RSC – мощные инструменты. Но использовать их для блога – это забивать гвозди микроскопом.
Вот простой алгоритм выбора:

Вам НУЖЕН Next.js / RSC, если:

  1. У вас Facebook*/ AirBnB (сотни маршрутов, сложная стейт-машина).

  2. Вам критичен Optimistic UI (интерфейс реагирует быстрее, чем отвечает сервер).

  3. У вас команда из 50+ фронтендеров, и вам нужны жесткие рельсы фреймворка, чтобы они не написали лапшу.

* Meta Platforms Inc. (владелец Facebook и Instagram) – организация признана экстремистской, её деятельность запрещена на территории РФ

Вам НЕ НУЖЕН Next.js (берите Python, Go, PHP), если:

  1. Вы делаете Блог / Контентный сайт. (HTML кэшируется лучше, чем JSON).

  2. Вы делаете B2B панель управления. (Там не нужен SEO, там нужно надежное управление состоянием приложения, а старый добрый SPA на Vite + React будет проще в отладке).

  3. Вы стартап с бюджетом 0 рублей. (VPS за 300 руб выдержит 10к пользователей на PHP/Go. Vercel выставит счет при первой же DDoS-атаке).


P.S. Эта статья – адаптированный отрывок из моей книги «Поколение JSON». Там я перевожу наши ежедневные инженерные боли на язык денег и показываю, почему "бесплатные" абстракции часто обходятся бизнесу дороже всего.
У себя в Telegram-канале в закрепе я выложил удобный бесплатный PDF-чек-лист для руководителей: «10 признаков того, что ваш проект умирает от техдолга». Забирайте, пока ваши микросервисы не съели весь монолитный бюджет.

Комментарии (152)


  1. vlsnake
    03.03.2026 07:48

    По идее нужен Кен Томпсон и аналог Go, который заменил C++.


    1. MrTheFirst Автор
      03.03.2026 07:48

      Точно подмечено. Разница лишь в том, что Go создавали инженеры для решения бизнес-проблем Google. А современные веб-абстракции часто создаются вендорами (Vercel и ко) просто для продажи своей инфраструктуры. Упрощать им невыгодно.


      1. firegurafiku
        03.03.2026 07:48

        Go, который заменил C++

        Не напомните, в какой момент это произошло?


        1. anaxita
          03.03.2026 07:48

          В котором хайлоад проекты переписали с С++, особенно заметно в трейдинге и гемблинге. Мой опыт подтверждает


          1. firegurafiku
            03.03.2026 07:48

            У Go, конечно же, есть ниша, из которой он подвытеснил другие языки. Но утверждать, что он заменил собой C++ вообще, я бы не стал. Я вообще с трудом могу представить себе язык, который бы вытеснил C++ изо всех ниш, умудрившись при этом самому не стать драконом.


            1. SerafimArts
              03.03.2026 07:48

              Я вообще с трудом могу представить себе язык, который бы вытеснил C++ изо всех ниш, умудрившись при этом самому не стать драконом.

              Ну пока что мне кажется, что Rust очень меееееееедленно, но постепенно и планомерно это действительно делает и действительно является альтернативой.


  1. TheJudge
    03.03.2026 07:48

    Давненько витают такие мысли. Нахреновертили так, что теперь сам черт ногу сломит. Боролись со сложностью так, что система борьбы со сложностью стала сама сложностью, которую не каждый руками просто так в своем проекте может написать.

    Боремся с избыточными сущностями? А создали еще тысячи их. Если посмотреть что там под капотом и как это работает. Сколько вызовов функций просисходит чтобы сделать что-то элементарное, тогда как вообще, достаточно только одной?

    Да, есть какой-то там процент где возможно так будет лучше. Но в большинстве кейсов, мне это напоминает работу ради работы. Создать себе проблемы, чтобы героически их решать.

    И с грустью смотрю на то что нынче нужно, чтобы вообще начать что-то делать. Минимальный hello world. Раньше достаточно было включить комп, и уже можно писать программу (C64, ZX-Specturm). А теперь чем дальше, тем хуже и медленее. Чтобы что делать? Часто берут теперь здоровенную фигню, и разрабатывают на всем этом комбайне лэндос, который прекрасно отдается просто из файла веб-сервером без всяких скриптов. А сейчас фреймворк на фреймворке и фреймворком погоняет чтобы делать все то-же самое (в 90% случаев).


    1. MrTheFirst Автор
      03.03.2026 07:48

      Золотые слова. «Создать себе проблемы, чтобы героически их решать» – это сегодня девиз индустрии.

      Выстраивание 15 слоев абстракций вокруг вывода строки HTML стало нашей зоной комфорта. Бизнес за это платит временем и дорогими серверами, а мы – выгоранием, пытаясь собрать этот карточный домик из Webpack, гидратации и бандлов.

      Спасибо за крутой и очень жизненный комментарий)


      1. TheJudge
        03.03.2026 07:48

        Зато посмотрите как прекрасно создаются рабочие места, порождая программных монстров в которых чтобы разобраться и поддерживать только нужен небольшой штат специалистов по всем этим технологиям из стэка. Отдельный человек чтобы деплоить, отдельный человек чтобы тестировать, несколько отдельных разработчиков для бэка и фронта. ВВП (прости господи) так и прет прям....


      1. Fedorkov
        03.03.2026 07:48

        «Создать себе проблемы, чтобы героически их решать» – это сегодня девиз индустрии.

        Примерно с такой же мотивацией 12 лет назад я решил больше не тратить своё время на фронтенды. Я думал, что это просто направление молодое, и что оно со временем устаканится и примет более здравый с инженерной точки зрения вид. Но проходят годы, а его состояние только ухудшается.


        1. themen2
          03.03.2026 07:48

          А чем ща занимаетесь?


          1. Fedorkov
            03.03.2026 07:48

            Последние 12 лет занимался бэкендами, десктопом и эмбеддедом.

            Эмбеддед в среднем сильно отстаёт в плане практик и инструментов (IDE относительно примитивные, DevOps начисто отсутствовал в достаточно серьёзных конторах, где я работал).

            С десктопом ситуация лучше, но когда айти ушло в веб, на десктопе осталось много тех, кто не осилил переход и кто долгое время по факту демпинговал рынок труда, что плохо сказалось на этой области в целом.

            В бэкенде сейчас самая приятная для инженера обстановка: много интересных и сложных задач, развитые инструменты и зрелые практики.

            Ещё есть мобильная разработка. З/п выше, чем в бэкенде, но на счёт инструментов/практик я вообще не в курсе.

            И ещё есть геймдев, в который все хотят войти (потому что все любят игры), и это плохо сказывается на зарплатах. Но играми я тоже никогда не занимался.


            1. themen2
              03.03.2026 07:48

              Мобайл, конкретно Андроид , тоже фигня — очень очень много мусора и сложностей на ровном месте...

              А разве в бекенде нету сумасшествия со всякими кубернетс на каждый чих, серверлесс и прочая фигня?


              1. Fedorkov
                03.03.2026 07:48

                Бывают решения, неадекватно сложные для своей функциональности, но это имхо скорее маргинальные случаи.


              1. ivankprod
                03.03.2026 07:48

                Так serverless это больше фронтенд история)


    1. milssky
      03.03.2026 07:48

      и при этом все стало работать хуже


      1. TheJudge
        03.03.2026 07:48

        Ну это и понятно. И это не говоря о производительности. Просто достаточно развернуть стэк вызовов. 20 вызовов чтобы в конце выполнить функцию, которая выполняется быстрее чем эта фигня из вызовов? Это сейчас нормальное явление. Мы греем воздух процессорами, которые 90% времени могут ничего не делать, только переходы, и не всегда даже условные.

        А помните где-то у основоположников в какой-то книге был анализ, не помню у кого, что на каждые несколько строк обязательно да есть одна ошибка? Чем больше уровней и слоев, тем, следовательно, больше вероятность ошибок, просто за счет роста объема кода. И это даже не про скорость еще.


  1. MrEfrem
    03.03.2026 07:48

    «Фу, перезагрузка страницы – это прошлый век!»

    Мы просто трансформировали тонкого клиента в толстого. И в этом огромные преимущества для серверной инфраструктуры. Статический хостинг попробуй за DDOS-ить в отличие от Apache/Nginx + PhP-Fpm. Дак и к тому же накладные расходны гораздо меньше.

    Я тоже непонимаю зачем возвращают серверный рендеринг. Идиотизм какой-то у них там в головах.


    1. MrTheFirst Автор
      03.03.2026 07:48

      Отличный поинт про DDoS, честно говоря, я этот аспект даже не рассматривал в статье)
      А ведь связка SPA + CDN – это самая дешевая и неубиваемая инфраструктура.

      Вся шиза с возвратом рендеринга на сервер началась исключительно из-за SEO – и теперь SEO-адаптированные сайты просто стали модными и дорогими.


      1. artyhedgehog
        03.03.2026 07:48

        А как пришло к тому, что SEO стало актуальным сейчас? Проблема SEO существовала уже когда только пошли попытки рендерить что-то на клиенте. Казалось бы, сейчас поисковые краулеры должны быть поразвитей и спокойно поедать клиентский рендер. Но, выходит, нет?

        Мне казалось, тема с Server Components больше выходит из того, чтобы обратно облегчить клиенты и ускорить полную отрисовку страницы. Или это и имеется в виду под "из-за SEO".


        1. MrTheFirst Автор
          03.03.2026 07:48

          Гугл и яндекс умеют парсить SPA. Только спарсить готовый HTML гораздо легче, чем SPA. Запускать V8 в хедлесс хром для каждого маршрута SPA – дорого по серверному времени. Поэтому поисковики просто пессимизируют тяжелую статику, а бизнес ушел обратно в SSR.


          1. MadeByFather
            03.03.2026 07:48

            На что вы ссылаетесь, что поисковики плохо или совсем не индексируют SPA? Есть тысячи сайтов на любой размер в топ выдачах, которые не имеют никакого SSR

            Или вы просто так, жалеете сервера гугла?