Разделение кода (Code Splitting) React Router
позволяет организовывать маршрутизацию таким образом, чтобы загружать
только необходимые компоненты для текущего маршрута. Основной инструмент
для этого — динамический импорт с использованием React.lazy
и Suspense.
Пример:
import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
function App() {
return (
<Router>
<Suspense fallback={<div>Загрузка...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</Router>
);
}
Ключевые моменты:
lazy() позволяет импортировать компонент только при его
фактической необходимости.Suspense обеспечивает отображение запасного контента,
пока компонент загружается.Использование маршрутов с ленивой загрузкой для больших приложений В крупных проектах рекомендуется разбивать маршруты на отдельные чанки на уровне папок функциональности:
src/
└─ pages/
├─ Dashboard/
│ └─ index.jsx
├─ Users/
│ └─ index.jsx
└─ Settings/
└─ index.jsx
const Dashboard = lazy(() => import('./pages/Dashboard'));
const Users = lazy(() => import('./pages/Users'));
const Settings = lazy(() => import('./pages/Settings'));
Это позволяет загружать только ту часть приложения, которая действительно нужна пользователю в данный момент.
Предварительная загрузка (Prefetching / Preloading)
Для снижения задержек при навигации можно заранее подгружать компоненты,
которые вероятно понадобятся пользователю. Для этого используют
import().then или библиотеки типа
react-loadable.
Пример предварительной загрузки:
const preloadUsers = () => import('./pages/Users');
document.getElementById('link-to-users').addEventListener('mouseover', preloadUsers);
Ключевой момент: такой подход уменьшает время ожидания при переходе по маршруту без увеличения стартового бандла.
Оптимизация библиотек и маршрутов React Router позволяет объединять маршруты в группы, чтобы минимизировать количество повторных импортов:
const AdminRoutes = lazy(() => import('./routes/AdminRoutes'));
const PublicRoutes = lazy(() => import('./routes/PublicRoutes'));
Использование вложенных маршрутов:
<Routes>
<Route path="/admin/*" element={<AdminRoutes />} />
<Route path="/*" element={<PublicRoutes />} />
</Routes>
Такой подход сокращает общий размер бандлов и упрощает кэширование на стороне клиента.
Tree Shaking и ESM-модули React Router полностью поддерживает модульную систему ES, что позволяет инструментам сборки, например, Webpack или Vite, исключать неиспользуемый код. Для максимальной оптимизации необходимо:
import { Routes, Route } from 'react-router-dom';
Lazy-loading маршрутов с данными (Data Fetching) При
ленивой загрузке маршрутов важно также оптимизировать запросы к серверу.
React Router v6 поддерживает концепцию loader для
маршрутов:
import { createBrowserRouter } from 'react-router-dom';
const router = createBrowserRouter([
{
path: "/users",
element: <Users />,
loader: () => fetch('/api/users').then(res => res.json())
}
]);
Преимущества:
Заключение по оптимизации Оптимизация бандлов с помощью React Router включает несколько взаимосвязанных практик:
React.lazy,
Suspense).Правильное применение этих техник позволяет уменьшить размер основного бандла, ускорить загрузку страниц и повысить отзывчивость приложения.