Клиентская маршрутизация является ключевым компонентом современных одностраничных приложений (SPA). Она позволяет изменять содержимое страницы без полной перезагрузки, сохраняя состояние приложения и обеспечивая быстрый отклик интерфейса. В Inferno маршрутизация строится на принципах реактивного обновления DOM с минимальными накладными расходами, что обеспечивает высокую производительность.
Маршрутизатор сопоставляет URL-адрес с компонентом интерфейса. При изменении пути в адресной строке маршрутизатор перехватывает событие и динамически отображает соответствующий компонент, не перезагружая страницу. Основные принципы работы:
history.pushState и события
popstate для отслеживания переходов.Inferno не включает встроенный маршрутизатор, но официально
поддерживается пакет inferno-router,
который обеспечивает совместимость с React Router-подобным API. Для
установки используется npm:
npm install inferno-router inferno-history
Подключение маршрутизатора в приложении:
import { Router, Route, IndexRoute, browserHistory } from 'inferno-router';
import App from './App';
import Home from './components/Home';
import About from './components/About';
const routes = (
<Router history={browserHistory}>
<Route path="/" component={App}>
<IndexRoute component={Home} />
<Route path="about" component={About} />
</Route>
</Router>
);
Router Основной контейнер маршрутизации, который
принимает объект истории (browserHistory или
hashHistory) и конфигурацию маршрутов.
Route Описывает конкретный путь и компонент, который необходимо отобразить при совпадении URL.
IndexRoute Специализированный маршрут, который отображается по умолчанию, если путь совпадает с родительским маршрутом, но не содержит дочерних сегментов.
Link Компонент для навигации между маршрутами без перезагрузки страницы:
import { Link } from 'inferno-router';
<Link to="/about">О приложении</Link>
Маршрутизатор поддерживает параметризованные маршруты, что позволяет передавать данные через URL. Например:
<Route path="/user/:id" component={UserProfile} />
Внутри компонента UserProfile параметры доступны через
props.match.params:
function UserProfile({ match }) {
const { id } = match.params;
return <div>Профиль пользователя с ID: {id}</div>;
}
Для навигации без использования компонента <Link>
можно вызвать метод history.push:
import { browserHistory } from 'inferno-router';
function goToAbout() {
browserHistory.push('/about');
}
Чтобы отлавливать некорректные пути, используется компонент с
маршрутом *:
<Route path="*" component={NotFound} />
Это позволяет отобразить страницу 404 и сохранить UX-последовательность.
Для оптимизации загрузки крупных приложений компоненты маршрутов
можно загружать динамически с помощью Inferno.lazy и
Suspense:
import { lazy, Suspense } from 'inferno';
const About = lazy(() => import('./components/About'));
<Route path="about" component={() => (
<Suspense fallback={<div>Загрузка...</div>}>
<About />
</Suspense>
)} />
Это уменьшает размер начального бандла и ускоряет первую загрузку приложения.
Вложенные маршруты позволяют создавать сложные интерфейсы с общей
структурой. В дочерних компонентах нужно использовать
props.children для рендеринга вложенного маршрута:
function App({ children }) {
return (
<div>
<nav>
<Link to="/">Главная</Link>
<Link to="/about">О приложении</Link>
</nav>
<main>{children}</main>
</div>
);
}
Inferno-router спроектирован для высокой скорости обновлений. Чтобы добиться максимальной производительности:
shouldComponentUpdate или
Inferno.PureComponent.Маршруты могут быть связаны с глобальным состоянием (например, Redux или MobX). Компоненты маршрутов получают данные из хранилища и реагируют на изменения состояния без вмешательства в логику маршрутизации.
Маршрутизация в Inferno обеспечивает быстрый отклик интерфейса, легкую интеграцию с компонентами и удобное управление путями приложения. Правильная организация маршрутов, динамическая загрузка компонентов и работа с параметрами URL создают основу для масштабируемых одностраничных приложений с высокой производительностью.