Главная / Статьи

Next.js или обычный React с Vite? Подбор фреймворка под ваш проект.

Подход, основанный на сначала определении требований, для выбора между Next.js и обычным React с Vite, учитывающий SEO, SSR, хостинг, маршрутизацию и комфорт работы команды.

Издатель: REACTAPP.TOP9 мин чтения2085 слов

Источники: When (Not) to Use Next.js: A Guide for React Developers

Во многих командах, использующих React, Next.js становится решением ещё до того, как кто-либо задаёт вопрос. Документация отличная, экосистема огромная, развертывание происходит без проблем, и существует общее мнение, что он делает сайты быстрее и способствует лучшему позиционированию, поэтому начинать каждый проект с него кажется безопасным выбором. Однако фреймворк по-прежнему остаётся инструментом с конкретной задачей, и Next.js может создавать столько же проблем в неподходящем проекте, сколько и помогать в подходящем. Далее приведён практический способ принятия решения: что на самом деле решает Next.js (SSR, SEO, смешанная отрисовка), где он действительно приносит пользу, типичные случаи, когда обычный React с Vite подходит лучше, и как представить этот выбор команде как требование, а не просто предпочтение.

Что на самом деле добавляет Next.js к React

Если отбросить маркетинговые аспекты, Next.js в основном касается того, как и где отрисовывается код React. Конкретно он предоставляет:

  • Обработка на сервере (SSR), статическое генерирование во время сборки (SSG) и их комбинации, реализованные поверх React.
  • Маршрутизация на основе файловой структуры, при которой URL определяются структурой папок вместо ручно написанной таблицы маршрутов.
  • Легкий слой бэкенда, входящий в состав фронтенда: обработчики API-маршрутов, мидлвары и функции на краю сети, что позволяет одной базе кода обслуживать полноценное приложение типа full-stack.
  • Тесная интеграция с современными платформами хостинга, в первую очередь с Vercel, для кэширования, доставки контента на краю сети и развертывания.

Все это можно свести к одном предложению, которое стоит запомнить для дальнейшего обсуждения: Next.js оправдывает свое использование тогда, когда для проекта действительно важны скорость первоначальной загрузки, SEO, а также объединение задач фронтенда и бэкенда в одной фреймворковой среде. Каждый из приведенных ниже случаев на самом деле является проверкой этого утверждения.

Проекты, где Next.js действительно оправдывает себя

Видимость в поиске и первое отображение — это бизнес-требования

Некоторые продукты зависят от органического трафика и первого впечатления:

  • сайты маркетинговых компаний и страницы-лендинги продуктов
  • блоги с большим объемом контента и порталы документации
  • интернет-магазины, зависящие от поисковых систем

Для таких случаев серверная обработка и генерация статического контента не являются роскошью. Браузер получает полный HTML еще до выполнения любого JavaScript, поэтому пользователи видят контент быстрее, а поисковые роботы могут индексировать реальный текст, а не пустой корневой элемент. Next.js также позволяет заранее генерировать страницы вместе с их данными, чисто управлять мета-тегами для каждого маршрута и использовать метод постепенной генерации статики (ISR) для обновления контента без необходимости полной пересборки всего сайта при любых изменениях. Создать аналогичные возможности в рамках простого одностраничного приложения тоже возможно, но редко настолько же эффективно.

Вы хотите одну фреймворковую платформу для всей стек-архитектуры

Рассмотрим такие проекты:

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

Next.js позволяет размещать код API и компоненты React в одном проекте. Вы можете писать обработчики конечных точек в папке app/api (или pages/api при использовании старой версии Pages Router), использовать промежуточные компоненты для проверки аутентификации, локализации и перенаправлений, а также развернуть всё это на любой платформе, поддерживающей Next.js, включая Vercel, но не ограничиваясь им.

Для одиночного разработчика или небольшой команды такая интеграция имеет большую ценность. Не требуется настраивать отдельный сервер Node или Express, а также поддерживать дополнительную схему развертывания. Логика сервера находится рядом с компонентами, которые её используют, причем фреймворк координирует маршрутизацию и отображение данных между ними.

Для публичных и приватных разделов требуется разное отображение

Многие приложения естественным образом делятся на две части: в основном статические публичные страницы, такие как главная страница, информация о ценах и документация, и динамические разделы для авторизованных пользователей, такие как панель управления или консоль администратора. Next.js хорошо справляется с таким сочетанием. Вы можете статически генерировать содержимое, которое редко меняется, отображать страницы для каждого пользователя на сервере, а высокоинтерактивные виджеты оставлять исключительно на стороне клиента, там где серверная обработка приносит мало пользы. Настоящая преимущество заключается в возможности выбирать стратегию отображения для каждого маршрута, что позволяет настраивать производительность каждой части продукта без необходимости смены фреймворков или поддержки двух наборов кода.

Проекты, для которых обычно лучше подходит чистый React

Такие случаи встречаются часто, и именно в них команды по привычке склонны использовать Next.js.

Приложения с клиентской стороны, которые никто не находит поисковиком

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

Next.js предлагает серверные возможности, которые вы не будете использовать, серверную среду выполнения, которая вам не нужна, а также дополнительные концепции, связанные с маршрутизацией и загрузкой данных. Приложение на React, созданное с помощью Vite, Parcel или даже обычной настройки webpack, часто позволяет быстрее вносить изменения и легче понимается всеми. Если вам нужно вспомнить, что включает в себя такая настройка, ознакомьтесь с нашим пошаговым руководством по созданию первого приложения на React и Vite.

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

Виджеты, библиотеки компонентов и инструменты для встраивания

Иногда итоговым продуктом вовсе не является веб-сайт. Это может быть встраиваемый виджет, опубликованный в npm, общая система дизайна или инструмент с одним экраном, который будет встроен в чужое приложение. Вы предоставляете повторно используемый интерфейс, а не страницы, поэтому маршрутизация, SSR, SSG и определённая структура папок решают проблемы, у вас вообще нет.

Здесь лучшим выбором является лёгкая версия React по трём причинам. Вы можете собирать и публиковать код, не нарушая конвенций фреймворка. Те, кто использует ваш пакет, решают, как и где он будет отображаться. Кроме того, вы избегаете внедрения в код предположений, специфичных для Next.js, в код, который должен работать в любом месте. Если у вашего проекта нет настоящих страниц, фреймворк, ориентированный на страницы, — неверная отправная точка.

Маршрутизация, не связанная с папками

Маршрутизация на основе файлов удобна для многих приложений, но она всё равно представляет собой ограничение. Структура URL связана со структурой каталогов, некоторые сложные шаблоны требуют обходных решений, а маршрутизация, сильно зависящая от данных, может казаться вынужденной. Если у вашего приложения глубоко вложенные и высокодинамичные маршруты, модель навигации, не похожая на дерево файлов, или необычные схемы URL, определяемые бизнес-правилами, то React в сочетании с программным маршрутизатором, таким как React Router, может оказаться более подходящим решением. Определение маршрутов в коде даёт вам полный контроль, вместо того чтобы приспосабливать свою архитектуру к ожидаемой структуре фреймворка.

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

В основном статический контент с небольшим уровнем интерактивности

Next.js может генерировать статические сайты, но результат всё равно включает в себя среду выполнения React и процесс гидратации. Для простых маркетинговых страниц, документации с ограниченной интерактивностью, портфолио и небольших сайтов с контентом это может означать загрузку гораздо большего объёма JavaScript, чем требуется для работы страниц. Инструменты для создания статических сайтов, такие как Astro, Eleventy или Hugo, или даже вручную написанный HTML и CSS с небольшим количеством JavaScript там, где это необходимо, обычно обеспечивают меньший размер данных и проще процесс развертывания.

Короче говоря, если страница ведёт себя как документ, а не как приложение, то мета-фреймворк React представляет собой избыточное оборудование.

Хостинг, не способный запускать серверный код

Next.js работает наилучшим образом, когда его можно развернуть на платформе, поддерживающей Node или безсерверные функции, и когда вы действительно используете SSR, функции на краю сети или API-маршруты. У вас может быть иная ситуация: хостинг только статических файлов, такой как GitHub Pages, Netlify в чисто статическом режиме или S3 за CloudFront; политика, запрещающая длительную работу процессов Node; или бюджет, при котором оплата за каждый вызов безсерверной функции нежелательна.

В таких условиях использование статической сборки React с помощью инструментов вроде Vite проще: генерируются ресурсы, они загружаются, и всё готово. Next.js действительно предлагает режим статического экспорта для таких случаев, но при этом теряются функции, зависящие от сервера, такие как ISR, промежуточные модули и обработчики маршрутов, которые требуют сервера в момент запроса, поэтому обязательно ознакомьтесь с актуальной документацией, чтобы узнать, что именно поддерживается. Если вы используете Next.js, но никогда не применяете SSR, API-маршруты или промежуточные модули, то по сути используете его лишь в качестве сложного инструмента для сборки кода.

Опыт команды — часть решения

Техническая совместимость — это лишь половина картинки; важна также знакомость вашей команды с задачей. Предположим, команда хорошо разбирается в React с клиентской стороны и паттернах одной страницы, но имеет мало опыта работы с SSR, стримингом или загрузкой данных в серверных компонентах, и ей необходимо внедрять функции продукта, а не инвестировать в разработку платформы. В таком случае использование Next.js означает необходимость освоения:

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

Такие инвестиции определенно могут окупиться, но это реальные затраты. Для небольшого продукта или внутреннего инструмента часто разумнее оставаться с тем фреймворком, который хорошо знаком команде, чем переходить на что-то более современное. Если вы рассматриваете новые функции фреймворка, наша карта современных функций Next.js и того, что они заменяют — хороший способ оценить объем нового материала, который необходимо изучить.

Чек-лист для принятия решения при создании новых проектов

Рассмотрите эти вопросы в начале любого проекта, в котором активно используется React:

  1. Нужен ли вам SSR или SSG для SEO или улучшения скорости первой загрузки? Если да, Next.js — отличный выбор; если нет, обычный React вполне подойдет.
  2. Является ли это сайтом, состоящим из реальных страниц, или в основном это оболочка приложения? Многие страницы с контентом указывают на использование Next.js; интерфейс с одной оболочкой свидетельствует о применении одностраничного приложения на React.
  3. Хотите ли вы иметь небольшой бэкенд, расположенный рядом с фронтендом? Если вам подходят API-маршруты и промежуточные компоненты в одном репозитории, то Next.js подойдёт. Если уже существует отдельный бэкенд, будь то NestJS, Spring Boot, Laravel или что-то ещё, то добавление Next.js будет менее значимым.
  4. Где будет размещаться приложение и каков бюджет? Возможность и готовность оплачивать работу серверов или вызовы функций позволяют рассматривать Next.js как вариант. Если доступна только статическая хостинговая услуга, обычно лучше использовать упрощённую версию приложения на React.
  5. Чем хорошо владеет команда сейчас? Если все сильны в React, но только немногие понимают SSR и серверные компоненты, стоит уточнить, действительно ли требования проекта оправдывают необходимость изучения этих технологий.

Ничто из этого не требует принятия крайней позиции «всё или ничего». Вам не обязательно использовать Next.js для всего или полностью исключать его. Разумный подход — рассматривать его как один из вариантов в вашем наборе инструментов React, выбираемый осознанно тогда, когда его преимущества соответствуют вашим потребностям.

Формулировка выбора для вашей команды

Если вы тот, кто принимает или влияет на это решение, избегайте формулировок вроде «Next.js — это избыточность», что звучит как вопрос вкуса. Вместо этого сосредоточьтесь на компромиссах, которые команда может оценить:

  • «Эта внутренняя панель управления почти не получает выгоды от SSR или SEO, поэтому использование Next.js приведёт лишь к дополнительной нагрузке без явных преимуществ».
  • «В библиотеке компонентов нет страниц или маршрутов, поэтому для неё более подходит обычная настройка сборки React».
  • «Наш хостинг обслуживает только статические файлы, поэтому большинство функций Next.js останутся неприменимыми».
  • «Мы будем использовать Next.js для публичных продуктов с большим объемом контента, где важны производительность и возможности поиска, а для внутренних инструментов оставим обычный React».
  • Подобные заявления направляют обсуждение на требования, а не на тенденции, что облегчает пересмотр решения в случае изменения этих требований.

    Пусть требования определяют фреймворк

    Выбор между Next.js и обычным React не сводится к вопросу о том, какой из них более современный; речь идет о том, с какими проблемами сталкивается ваш проект. Рендеринг на сервере, SEO, стратегии рендеринга по маршрутам и использование расположенного рядом бэкенда являются реальными преимуществами, когда они нужны, но создают дополнительную нагрузку, когда они не требуются. Начните с требований из приведенного выше списка, учтите ограничения хостинга и опыт вашей команды, и пусть фреймворк выбирается на основе этих ответов, а не наоборот.

    Связанная литература

  • Состояние URL, состояние сервера и BFF: стек Vite для внутренних React-приложений: Почему аутентифицированная внутренняя React-платформа может получать лучшую поддержку благодаря Vite, TanStack Router, TanStack Query и отдельному BFF по сравнению с Next.js, и когда это уже не справедливо.