Основы клиентской маршрутизации

Клиентская маршрутизация является ключевым компонентом современных одностраничных приложений (SPA). Она позволяет изменять содержимое страницы без полной перезагрузки, сохраняя состояние приложения и обеспечивая быстрый отклик интерфейса. В Inferno маршрутизация строится на принципах реактивного обновления DOM с минимальными накладными расходами, что обеспечивает высокую производительность.

Принципы работы маршрутизации

Маршрутизатор сопоставляет URL-адрес с компонентом интерфейса. При изменении пути в адресной строке маршрутизатор перехватывает событие и динамически отображает соответствующий компонент, не перезагружая страницу. Основные принципы работы:

  • Сопоставление маршрутов с компонентами: каждому маршруту соответствует определённый компонент.
  • Слежение за изменениями истории браузера: используется API history.pushState и события popstate для отслеживания переходов.
  • Декларативное описание маршрутов: маршруты описываются в виде конфигурационного объекта или JSX-разметки.

Установка и подключение маршрутизатора

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>
);

Основные компоненты маршрутизации

  1. Router Основной контейнер маршрутизации, который принимает объект истории (browserHistory или hashHistory) и конфигурацию маршрутов.

  2. Route Описывает конкретный путь и компонент, который необходимо отобразить при совпадении URL.

  3. IndexRoute Специализированный маршрут, который отображается по умолчанию, если путь совпадает с родительским маршрутом, но не содержит дочерних сегментов.

  4. 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-последовательность.

Lazy loading компонентов

Для оптимизации загрузки крупных приложений компоненты маршрутов можно загружать динамически с помощью 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 создают основу для масштабируемых одностраничных приложений с высокой производительностью.