Комментарии 6
Спасибо, очень доступно объяснил!
Около 20 лет назад еще писал на PHP сайт (softodrom) и свою CMS для него, которая собирала страницу и кэшировала ее в memcached вместе с некоторыми метаданными, такие как параметры запроса и внутренние связи между данными.
Например, на странице мог быть блок с данными, которые обновляются по крону или через админку, страница знает какие данные на ней присутствуют и пересобирает себя если обновилось что-то из них, но не весь контент, а только эту часть. Там так же используется свой шаблонизатор, он строит что-то типа AST, кэширует его и пересобирает только ту часть, которая изменилась.
Профилировал весь движок так, чтобы он работал практически мгновенно, еще пришлось Linux + KDE установить, потому что Flamegraph красиво отображать тогда умело только что-то под KDE :)
Были планы еще переписать движок как расширение на PHP, но уже не стал.
Next.js просто собрал общеизвестные практики, но и без него вполне можно добиться необходимого перфоманса и гибкости.
Например - включить SSR (кастомный делается не то, чтобы сложно) и выбрать одну из стратегий оптимизации:
кеширование запросов в апи. Можно по version, который подается в запросе на бэк, можно по max-age, можно по таймауту, можно с ручной инвалидацией. Таким образом, node.js бэк будет в основном только рендерить html без "тяжелых" асинхронных запросов в бэк, этого достаточно для средней нагрузки
кеширование выдаваемого html - можно в node.js сервере в памяти или быстрой базе (Redis и аналоги), можно в прокси-сервере (nginx, Cloudflare). К этому можно прикрутить те же самые инвалидации по таймауту, max-age или вручную. Получится ISR
Комбинация этих стратегий как раз и даст идеальный баланс, причем из-за гибкости (пришла кука - отдается SSR-страница About, не пришла - отдается из кеша прокси-сервера, запрос из Android или IOS - отдается SSR-страница без вызова апи-запросов, которые берутся из кеша) можно выжать максимум и эффективно защититься от DDOS.
Хорошо, конечно, что в Next.js уже включены несколько вариантов оптимизации, но для требовательных проектов думаю лучше делать кастомные решения.
Согласен, всё зависит от конкретного проекта, но мне нравится Next.js тем, что много чего идёт "из коробки" и это повышает шанс не "выстрелить себе в ногу", особенно если ты джун)
Nextjs SSR vs SSG. Приготовить заранее или испечь по заказу? Гайд по рендерингу для пиццерий и разработчиков