React Router предоставляет мощный механизм
управления навигацией в React-приложениях. Одним из ключевых аспектов
является корректная настройка базового пути (basename) для
маршрутизатора, что особенно важно при развертывании приложения в
подкаталоге или при использовании динамических путей.
BrowserRouter с basenameКомпонент BrowserRouter отвечает за управление историей
браузера через HTML5 History API. Для того чтобы все маршруты работали
корректно при размещении приложения не в корне домена, используется
свойство basename.
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';
function App() {
return (
<BrowserRouter basename="/my-app">
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
);
}
export default App;
В этом примере:
basename="/my-app" указывает, что все пути будут
считаться относительно /my-app./ фактически будет доступен по адресу
/my-app/./about — по адресу
/my-app/about.В некоторых случаях базовый путь может зависеть от переменной окружения, например, при различном развертывании в development и production. Для этого удобно использовать переменные окружения:
const basename = process.env.REACT_APP_BASENAME || '/';
<BrowserRouter basename={basename}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
REACT_APP_BASENAME можно задать в .env
файле: REACT_APP_BASENAME=/my-app/.Если приложение использует вложенные маршруты, basename
будет автоматически применяться ко всем дочерним маршрутам:
<BrowserRouter basename="/dashboard">
<Routes>
<Route path="/" element={<DashboardHome />} />
<Route path="settings" element={<Settings />} />
<Route path="users" element={<Users />} />
</Routes>
</BrowserRouter>
/dashboard/ → DashboardHome/dashboard/settings → Settings/dashboard/users → UsersЭто позволяет не добавлять вручную префикс ко всем путям.
При использовании React Router в связке с серверным
рендерингом через ReactDOMServer, basename
также необходим для корректной генерации маршрутов и ссылок. Например, в
StaticRouter:
import { StaticRouter } from 'react-router-dom/server';
function render(url) {
return (
<StaticRouter location={url} basename="/my-app">
<App />
</StaticRouter>
);
}
location указывает текущий URL запроса.basename обеспечивает, что все пути внутри приложения
соответствуют базовому пути на сервере.basename на компоненты Link и
NavLinkКомпоненты для навигации автоматически учитывают
basename:
<Link to="/">Главная</Link> // Перенаправит на /my-app/
<Link to="/about">О нас</Link> // Перенаправит на /my-app/about
/my-app.Если используется HashRouter, basename
также поддерживается:
import { HashRouter, Routes, Route } from 'react-router-dom';
<HashRouter basename="/my-app">
<Routes>
<Route path="/" element={<Home />} />
<Route path="/contact" element={<Contact />} />
</Routes>
</HashRouter>
/#/my-app/ и
/#/my-app/contact.basename автоматически применяется ко всем маршрутам и
ссылкам.basename для корректной работы навигации.basename хорошо
сочетаются, что позволяет создавать многоуровневые структуры путей без
ошибок.Эти механизмы обеспечивают правильное функционирование маршрутов приложения вне зависимости от структуры URL и способа развертывания, позволяя гибко управлять базовым путем в React-приложениях.