Astro или Next.js: что выбрать для контентного сайта

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

Astro или Next.js: что выбрать для контентного сайта

Выбор фреймворка имеет смысл начинать не с популярности и не с синтетического теста, а с устройства будущего продукта. Блог, документация и каталог статей предъявляют другие требования, чем личный кабинет, визуальный редактор или SaaS с большим количеством пользовательского состояния.

Для Smooth Flow я выбрал Astro. Ниже не попытка объявить один инструмент победителем, а разбор условий, при которых каждый из них оказывается рациональным выбором.

Короткий ответ

Astro обычно удобнее, если основа проекта — документы и страницы, большая часть интерфейса не требует постоянной работы JavaScript в браузере, а контент должен собираться в статический HTML.

Next.js обычно удобнее, если приложение уже живёт в экосистеме React, использует сложную авторизацию, серверные действия, персонализированные данные или большое количество интерактивных компонентов.

Главный вопрос звучит так:

Что является центром продукта: документ, который иногда становится интерактивным, или приложение, которое иногда показывает документы?

Для первого случая естественнее Astro, для второго — Next.js.

Как различается базовая модель

Astro начинает со статического HTML

Компоненты Astro по умолчанию выполняются во время сборки или на сервере и не отправляют свой JavaScript в браузер. Интерактивный компонент подключается отдельно как остров с явной директивой, например client:visible или client:idle.

Это полезное ограничение. Разработчику приходится обозначить, какой элемент действительно нуждается в гидрации, вместо того чтобы автоматически превращать всю страницу в клиентское приложение.

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

Next.js начинает с React

Современный App Router разделяет Server Components и Client Components. Серверные компоненты позволяют выполнять значительную часть работы без отправки соответствующего JavaScript в браузер. Это уже не модель «весь React обязательно гидрируется».

Но интерфейс всё равно строится внутри React-архитектуры. Как только компонент требует состояния, обработчика события или браузерного API, появляется граница "use client", а вместе с ней — клиентский пакет и гидрация.

Для приложения это сильная модель. Для простого контентного сайта она может оказаться дополнительным слоем, который нужно контролировать.

Производительность: не фреймворк, а результат

Нельзя честно сказать, что любой сайт на Astro автоматически быстрый, а любой сайт на Next.js медленный. Производительность ломают изображения без размеров, сторонние виджеты, тяжёлые шрифты, аналитика, большие клиентские компоненты и неудачная работа с кешем.

Разница в стартовой позиции:

КритерийAstroNext.js
JavaScript по умолчаниюНе отправляется для .astro-компонентовЗависит от границ Server/Client Components
Статическая генерацияОсновной сценарийПоддерживается
Частичная гидрацияЯвные островаКлиентские поддеревья React
ИзображенияВстроенный image pipelineВстроенный next/image
Динамический серверПодключается адаптеромЦентральная часть платформы

Для оценки нужен не общий балл Lighthouse, а реальные показатели LCP, INP и CLS на целевых устройствах. Важно также смотреть объём переданного JavaScript, количество долгих задач и поведение страницы после загрузки.

Работа с контентом

Коллекции Astro

Content Collections дают схему frontmatter, типизацию и единый API для Markdown или MDX. Ошибка в категории, дате или обязательном поле обнаруживается во время разработки, а не после публикации.

Для блога это особенно удобно:

  • запись остаётся обычным файлом;
  • метаданные проверяются схемой;
  • список страниц строится из коллекции;
  • заголовки статьи доступны шаблону для автоматического оглавления;
  • содержимое можно хранить рядом с кодом и проверять через Git.

Если редакторы работают только через CMS, преимущество файлового контента уменьшается, но Astro умеет получать данные и из внешних источников.

Данные в Next.js

Next.js не навязывает одну контентную модель. Можно использовать MDX, headless CMS, базу данных или собственный API. Это гибко, особенно когда публикация связана с ролями, предпросмотром, пользовательскими данными и сложным редакционным процессом.

Цена гибкости — больше решений, которые команда принимает самостоятельно: структура данных, кеширование, инвалидация, предварительный просмотр и границы клиентского кода.

Где Astro подходит лучше

Я бы начинал с Astro для следующих проектов:

  1. Личный или корпоративный блог.
  2. Документация продукта.
  3. Маркетинговый сайт с несколькими интерактивными блоками.
  4. Контентное медиа без сложного личного кабинета.
  5. Каталог, основная ценность которого — индексируемые страницы.
  6. Сайт, где важна простая статическая публикация на CDN.

Это не означает, что Astro ограничен статикой. Он поддерживает серверный рендеринг и API-маршруты. Но его архитектура помогает оставить документ документом.

Где Next.js практичнее

Next.js становится сильнее, когда проекту нужны:

  • существующая дизайн-система на React;
  • большая команда React-разработчиков;
  • авторизация и разграничение прав;
  • персонализированный интерфейс;
  • серверные действия, формы и мутации данных;
  • насыщенные интерактивные сценарии;
  • единая платформа для сайта и веб-приложения.

Переносить зрелое React-приложение на Astro только ради уменьшения JavaScript обычно невыгодно. Сначала стоит найти реальные тяжёлые клиентские границы, исправить загрузку данных и проверить сторонние скрипты.

Стоимость поддержки

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

Astro уменьшает количество концепций для простого сайта. Страница, layout, коллекция контента и несколько компонентов часто покрывают весь проект.

Next.js предлагает больше возможностей в одной системе, но требует дисциплины:

  • понимать, где выполняется компонент;
  • контролировать границы "use client";
  • выбирать режим кеширования;
  • учитывать различия между статическим и динамическим рендерингом;
  • проверять, что удобная абстракция не увеличила клиентский пакет.

Сложность оправдана, когда продукт использует эти возможности. Если нет, она превращается в операционный налог.

Как принять решение

Перед стартом я использую простой порядок.

1. Описать интерактивные сценарии

Не «на сайте будет интерактив», а конкретно: фильтр каталога, авторизация, редактор, форма, график, комментарии. Для каждого сценария полезно понять, требуется ли постоянное состояние в браузере.

2. Определить источник данных

Markdown в репозитории, CMS, база данных и пользовательский API требуют разных процессов публикации. Фреймворк должен упрощать основной поток, а не только первый прототип.

3. Проверить ограничения размещения

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

4. Собрать одну реальную страницу

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

5. Измерить

Сравнивайте HTML, JavaScript, изображения, время сборки, доступность и удобство разработки. Оценка «ощущается быстро» полезна, но не заменяет измерения.

Что выбрано для Smooth Flow

Здесь контент хранится в типизированной коллекции, страницы собираются заранее, а JavaScript используется точечно. Такой проект совпадает с базовой моделью Astro и не требует отдельного React-runtime.

Если в будущем появится сложный кабинет автора, совместное редактирование или персонализация, решение можно пересмотреть. Фреймворк — не идентичность проекта, а текущий инженерный компромисс.

Источники