React Router предоставляет несколько типов роутеров, каждый из которых предназначен для определённых сценариев использования и среды выполнения. Понимание различий между ними критически важно для построения корректной и предсказуемой навигации в приложениях на React.
BrowserRouter использует History API браузера для
управления навигацией. Он работает с URL без символа # и
идеально подходит для современных веб-приложений, где сервер настроен на
обработку всех запросов к приложению через один точечный вход
(index.html).
Особенности:
/about, /users/123)
без хэш-сегмента.history.push() и
history.replace() для программной навигации.Пример использования:
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
HashRouter использует часть URL после символа
# для навигации. Это особенно полезно для приложений, где
сервер не может быть настроен на обработку всех маршрутов, например, при
размещении на статических хостингах.
Особенности:
/#/about, /#/users/123.Пример использования:
import { HashRouter, Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
function App() {
return (
<HashRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</HashRouter>
);
}
MemoryRouter хранит историю навигации в памяти. Он не взаимодействует с адресной строкой браузера, что делает его полезным для тестирования или приложений, встроенных в десктопные и мобильные оболочки.
Особенности:
initialEntries.Пример использования:
import { MemoryRouter, Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
function App() {
return (
<MemoryRouter initialEntries={['/']}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</MemoryRouter>
);
}
StaticRouter используется для серверного рендеринга
(SSR). Он не управляет состоянием истории, а принимает текущий путь
через проп location и возвращает результат рендеринга
компонентов в зависимости от маршрута.
Особенности:
context для определения
редиректов или статуса ответа сервера.Пример использования:
import { StaticRouter, Routes, Route } from 'react-router-dom/server';
import Home from './Home';
import About from './About';
function renderApp(url) {
const context = {};
return (
<StaticRouter location={url} context={context}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</StaticRouter>
);
}
| Роутер | URL в браузере | Подходит для | Требования к серверу |
|---|---|---|---|
| BrowserRouter | /about |
SPA с чистыми URL | Нужна поддержка всех маршрутов |
| HashRouter | /#/about |
Статические сайты | Не требуется |
| MemoryRouter | нет изменений URL | Тестирование, встроенные приложения | Не требуется |
| StaticRouter | задаётся вручную | SSR | Не требуется |
Эти различия определяют стратегию навигации, обработку URL и взаимодействие с сервером, что напрямую влияет на производительность, SEO и пользовательский опыт.