React Router — настройка и лучшие практики
TL;DR
React Router — это библиотека для маршрутизации в одностраничных приложениях на React. В статье показаны установка, базовая настройка, вложенные маршруты, работа с Link, распространённые ошибки и рекомендации по архитектуре маршрутов.

Что такое SPA и зачем нужен маршрутизатор
Single Page Application (SPA) — это веб-сайт или веб‑приложение, которое динамически перезаписывает содержимое одной HTML‑страницы, получая данные с сервера без полной перезагрузки страницы. В React‑приложении компоненты получают данные и рендерят их внутри единого HTML‑файла проекта.
React Router помогает организовать переходы между компонентами и отображать нужные компоненты в той же HTML‑странице. Библиотека управляет URL, историей браузера и позволяет создавать вложенные, ленивые и защищённые маршруты.
Определение терминов (1 строка каждое)
- SPA: одностраничное приложение — приложение, где навигация происходит без перезагрузки страницы.
- Route: правило, связывающее путь URL с компонентом, который нужно отрисовать.
- Link: компонент для переходов между маршрутами без перезагрузки.
Как установить React Router
Установка через npm (в каталоге проекта):
npm i react-router-dom
Установка через Yarn (версия v6):
yarn add react-router-dom@6
Примечание: в большинстве современных проектов используйте версию 6 и выше — API отличается от версии 5 (например, Switch заменён на Routes).
Базовая настройка Router
Добавьте BrowserRouter в корневой файл (обычно index.js), чтобы предоставить доступ к маршрутизации всем компонентам приложения:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot( document.getElementById('root') );
root.render(
);
Важно: BrowserRouter использует History API браузера. Для корректной работы прямых URL запросов на сервере нужно настроить отдачу index.html для всех путей (см. раздел «Развёртывание и серверная конфигурация»).
Создание маршрутов в компоненте App
Пример простейшей настройки маршрутов с тремя страницами:
import { Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Blog from './Blog';
function App() {
return (
} />
} />
}/>
)
}
export default App;
Ключевые моменты:
- Компонент Routes — контейнер для Route.
- Каждый Route принимает path и element.
- Путь ‘/‘ обычно соответствует корневой странице.
Работа с компонентом Link
Link — это компонент React Router для навигации без перезагрузки страницы. Он похож на тег , но использует атрибут to вместо href:
import { Link } from 'react-router-dom';
function Home() {
return (
About page
Blog page
This is the Home Page
)
}
export default Home;
Советы по Link:
- Для активных ссылок используйте NavLink — он даёт класс активной ссылки по совпадению пути.
- Для программной навигации применяйте хук useNavigate().
Вложенные маршруты: зачем и как
Вложенные маршруты позволяют группировать части приложения с общей базовой частью URL. Это упрощает навигацию и поддержку больших наборов связанных страниц.
Пример нелогоичной, но рабочего вида (несколько маршрутов с общей частью /article):
import { Routes, Route } from 'react-router-dom';
import Articles from './Articles';
import NewArticle from './NewArticle';
import ArticleOne from './ArticleOne';
function App() {
return (
}/>
}/>
}/>
)
}
export default App;
Вариант с вложением маршрутов (удобнее поддерживать):
import { Routes, Route } from 'react-router-dom';
import Articles from './Articles';
import NewArticle from './NewArticle';
import ArticleOne from './ArticleOne';
function App() {
return (
}/>
}/>
}/>
)
}
export default App;
Пояснения:
- Родительский Route имеет только path, а дочерние Route описаны внутри него.
- Route с index — это маршрут по умолчанию для родителя (одинаково с переходом на /article).
Рекомендация по архитектуре: выносите набор маршрутов в отдельный компонент (ArticleRoutes) и подключайте его через элемент родителя с wildcard:
import { Routes, Route } from 'react-router-dom';
import ArticleRoutes from './ArticleRoutes';
function App() {
return (
}>
)
}
export default App;
Символы /* означают, что React Router будет сопоставлять любые дочерние пути, начинающиеся с /article.
Когда вложенные маршруты не подходят
- Если страницы логически независимы и не делят общую часть UI, вложения добавят лишней сложности.
- Если требуется разделение кода (code splitting) по каждой странице, лучше комбинировать lazy() и отдельные маршруты.
Альтернативы BrowserRouter и когда их использовать
- HashRouter — полезен при статических хостингах без настройки сервера: URL содержит #, например /#/page. Хорош для GitHub Pages.
- MemoryRouter — хранит историю в памяти (используется в тестах или внутри embedded приложений).
- StaticRouter — применяется на сервере для серверного рендеринга.
Выбор зависит от развёртывания и требований к SEO/History API.
Важно: для SEO на публичных сайтах рассмотрите Server Side Rendering (SSR) или статическую генерацию (SSG), потому что SPA с чистым BrowserRouter без серверной отдачи контента может плохо индексироваться.
Отладка и распространённые ошибки
- 404 при обновлении страницы
- Причина: сервер не отдает index.html для вложенных путей.
- Решение: настроить сервер (NGINX, Apache, Netlify, Vercel и др.) так, чтобы все запросы отдавали index.html, кроме статических ресурсов.
- Неправильное поведение ссылок
- Проверьте, что используете Link/NavLink, а не для внутренних переходов.
- Убедитесь, что BrowserRouter оборачивает приложение.
- Несовпадение версий
- API v6 отличается от v5: Switch заменён на Routes; component в Route заменён на element; useHistory → useNavigate.
Ментальные модели и эвристики
- URL как источник правды: храните в URL состояние, которое важно для восстановления или шаринга ссылки.
- Минимизируйте побочные эффекты при навигации: делайте загрузку данных в эффектах компонентов, опираясь на параметры маршрутов.
- Сгруппируйте маршруты по доменам ответственности: /account/, /admin/, /articles/*.
Роль‑ориентированные чеклисты
Для команды разработчиков:
- Обернуть приложение в BrowserRouter.
- Поддерживать единый файл маршрутов или модульные группы маршрутов.
- Использовать lazy() и Suspense для крупных страниц.
Для команды QA:
- Проверить прямые переходы по URL (обновление страницы) для всех маршрутов.
- Проверить навигацию назад/вперёд в истории браузера.
Для DevOps:
- Настроить отдачу index.html для всех не‑статических путей.
- Убедиться, что сервер не кэширует постоянно index.html без проверки обновлений.
Мини‑методология внедрения маршрутизации (шаги)
- Установить react-router-dom@6.
- Обернуть корень приложения в BrowserRouter.
- Спроектировать структуру URL и обязанности модулей.
- Реализовать базовые маршруты и Link/NavLink.
- Добавить вложенные маршруты и lazy загрузку.
- Настроить серверную часть для поддержки History API.
- Прописать тесты маршрутов и сценарии QA.
Тесты и критерии приёмки
- Перехожу на / — отображается Home.
- Перехожу на /article — отображается список статей.
- Перехожу на /article/new — отображается форма создания статьи.
- Обновляю любую внутреннюю страницу — сервер корректно отдаёт index.html и приложение отображается.
Миграционные заметки (v5 → v6)
- Switch → Routes
- component prop → element (wrap JSX)
- useHistory → useNavigate
- exact больше не нужен; приоритет совпадений другой
Безопасность и приватность
React Router сам по себе не передаёт чувствительные данные через URL. Тем не менее:
- Не храните в URL секреты или персональные токены.
- Валидируйте параметры маршрутов на стороне сервера, если они влияют на доступ к ресурсам.
Шаблон — быстрый чек лист для одной фичи (пример)
- Прописан маршрут в AppRoutes
- Ссылка на страницу добавлена в навигацию
- Реализована загрузка данных по параметрам маршрута
- Обработаны состояния загрузки и ошибки
- Написаны unit/сценарные тесты
Краткое сравнение подходов
- Отдельные маршруты: проще отлаживать, легче разбивать код по чанкам.
- Вложенные маршруты: удобны для групп связанных страниц и общего UI (например, общий layout).
Заключение
React Router — базовый инструмент маршрутизации в современных React SPA. После установки и базовой настройки вы получите гибкий механизм управления навигацией, возможностью вложений и программной навигации. Внедряйте маршрутизацию по этапам: сначала базовый набор, затем вложения, lazy загрузку и тесты.
Ключевые рекомендации:
- Используйте react-router-dom@6;
- Оборачивайте приложение в BrowserRouter;
- Вынесите группы маршрутов в отдельные модули;
- Настройте серверную отдачу index.html для всех внутренних путей;
- Пишите тесты для критичных сценариев навигации.
Источник примеров: официальная документация react-router и практические паттерны из опыта команд фронтенд‑разработки.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone