Inferno Router — это официальный маршрутизатор для фреймворка Inferno, предоставляющий возможность организации навигации и управления состоянием приложения на основе URL. Он построен с акцентом на высокую производительность и простоту интеграции с компонентами Inferno.
Маршрутизация в Inferno основывается на трех ключевых концептах:
Маршрутизатор поддерживает динамические маршруты, вложенные маршруты и ленивую загрузку компонентов для оптимизации производительности.
Маршруты создаются с использованием компонента Router и
компонентов Route и Switch. Компонент
Router принимает объект истории
(browserHistory или hashHistory), который
контролирует текущее состояние URL:
import { render } from 'inferno';
import { Router, Route, Switch, browserHistory } from 'inferno-router';
import App from './App';
import About from './About';
import NotFound from './NotFound';
render(
<Router history={browserHistory}>
<Switch>
<Route path="/" component={App} exact />
<Route path="/about" component={About} />
<Route component={NotFound} />
</Switch>
</Router>,
document.getElementById('root')
);
Ключевые моменты:
Switch выбирает первый маршрут, который совпадает с
текущим URL, предотвращая одновременный рендеринг нескольких
компонентов.exact указывает, что путь должен совпадать
полностью, предотвращая частичное совпадение с другими маршрутами.Route без указания пути используется как
fallback для обработки 404 страниц.Inferno Router поддерживает динамические сегменты URL, которые
передаются в компонент через объект props.match.params.
Например:
<Route path="/user/:id" component={UserProfile} />
Компонент UserProfile может получить идентификатор
пользователя:
function UserProfile({ match }) {
const { id } = match.params;
return <div>Профиль пользователя: {id}</div>;
}
Динамические маршруты позволяют строить гибкую структуру приложения, например, для страниц профиля, деталей товара или постов блога.
Вложенные маршруты позволяют организовать сложные иерархии страниц без дублирования кода:
<Route path="/dashboard" component={Dashboard}>
<Route path="stats" component={Stats} />
<Route path="settings" component={Settings} />
</Route>
Вложенные маршруты рендерятся внутри родительского компонента через
props.children. Родительский компонент может содержать
общий интерфейс или панель навигации:
function Dashboard({ children }) {
return (
<div>
<h1>Панель управления</h1>
<nav>
<a href="/dashboard/stats">Статистика</a>
<a href="/dashboard/settings">Настройки</a>
</nav>
<div>{children}</div>
</div>
);
}
Иногда необходимо изменять URL без клика по ссылке. Для этого используется объект истории:
function goToAbout(history) {
history.push('/about');
}
Методы истории:
push(path) — добавляет новый URL в историю.replace(path) — заменяет текущий URL.go(n) — перемещает на n шагов в
истории.goBack() и goForward() — переход назад и
вперед.Inferno Router позволяет подключать компоненты динамически с
использованием import() для уменьшения начального размера
бандла:
const About = () => import('./About');
<Route path="/about" component={About} />
Динамический импорт обеспечивает загрузку кода только при переходе на соответствующий маршрут, что ускоряет начальную загрузку приложения.
Для реализации приватных страниц с авторизацией часто используют обертки вокруг маршрутов:
function PrivateRoute({ component: Component, isAuthenticated, ...rest }) {
return (
<Route
{...rest}
render={props =>
isAuthenticated ? <Component {...props} /> : <Redirect to="/login" />
}
/>
);
}
Такой подход позволяет гибко управлять доступом к страницам без дублирования логики авторизации в каждом компоненте.
Inferno Router не парсит query-параметры автоматически, но их можно
извлекать через объект location:
function SearchPage({ location }) {
const params = new URLSearchParams(location.search);
const query = params.get('q');
return <div>Результаты поиска: {query}</div>;
}
Это позволяет строить фильтры, поисковые страницы и другие интерфейсы с параметрами URL.
Редиректы реализуются с использованием компонента
Redirect:
<Route exact path="/">
<Redirect to="/dashboard" />
</Route>
Компонент Redirect автоматически изменяет URL и вызывает
рендер соответствующего маршрута.
Inferno Router легко интегрируется с библиотеками управления состоянием (например, Redux или MobX). Объект истории можно передавать в middleware или слушатели состояния, обеспечивая синхронизацию навигации с состоянием приложения.
Интеграция Inferno Router обеспечивает быстрый и предсказуемый рендеринг компонентов в зависимости от URL, поддерживает динамику, вложенность, ленивую загрузку и защищенные маршруты, что делает его мощным инструментом для построения крупных одностраничных приложений на Inferno.