PassFront
  1. PassFront
  2. База знаний
  3. Роутинг

В чем разница в маршрутизации Next.js и React Router?

Роутинг

Главное различие: в React Router маршруты описываются кодом в клиентском приложении, в Next.js — файловой структурой, и роутинг работает не только на клиенте, но и на сервере.

React Router: код и клиент

<Routes>
  <Route path="/" element={<Layout />}>
    <Route path="products/:id" element={<Product />} />
  </Route>
</Routes>
  • Конфигурация — JSX/объекты в коде; полная свобода структуры.
  • Работает целиком в браузере (History API): сервер отдаёт один index.html.
  • Code splitting по маршрутам — вручную (React.lazy).
  • Данные — самостоятельно (React Query, loaders в v6.4+).

Next.js: файловая система и сервер

app/
  layout.tsx        → общий layout
  page.tsx          → /
  products/
    [id]/page.tsx   → /products/:id
  • Маршрут = папка/файл; конвенции: page, layout, loading, error, not-found.
  • Серверная составляющая: страницы рендерятся на сервере (SSR/SSG/ISR), App Router делает их серверными компонентами по умолчанию; загрузка данных — прямо в компоненте маршрута (async).
  • Автоматический code splitting по маршрутам, префетч ссылок из коробки (<Link> подгружает следующий маршрут заранее).
  • Вложенные layout'ы сохраняют состояние при навигации; middleware, перехват маршрутов, параллельные маршруты.

Практические следствия

  • React Router — часть SPA: полный контроль, но всё (SSR, сплиттинг, данные) собираешь сам.
  • Next.js — фреймворк: конвенции вместо конфигурации, SEO и производительность из коробки, но меньше свободы и привязка к структуре файлов.

Коротко для собеседования

React Router: маршруты в коде, чисто клиентская навигация, всё остальное — вручную. Next.js: файловый роутинг с конвенциями (page/layout/loading), серверный рендеринг и серверные компоненты, автоматический сплиттинг и префетч. По сути сравнение «библиотека в SPA» против «полноценный фреймворк с сервером».

Другие вопросы раздела