React.lazy и Suspense — это две взаимодополняющие API, которые позволяют реализовать ленивую загрузку (lazy loading) компонентов в React-приложениях. Рассмотрим их использование подробно.
import { lazy, Suspense } from 'react';
const LazyComponent = lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Загрузка компонента...</div>}>
<LazyComponent />
</Suspense>
);
}
React.lazy:
Suspense:
Чаще всего используется с React Router:
import { Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
function App() {
return (
<Suspense fallback={<GlobalLoader />}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
);
}
Обязательно сочетайте с Error Boundary:
import { ErrorBoundary } from 'react-error-boundary';
function ErrorFallback({ error }) {
return (
<div role="alert">
<p>Ошибка загрузки компонента:</p>
<pre>{error.message}</pre>
</div>
);
}
<ErrorBoundary FallbackComponent={ErrorFallback}>
<Suspense fallback={<Loader />}>
<LazyComponent />
</Suspense>
</ErrorBoundary>
Для компонентов с именованным экспортом:
const LazyComponent = lazy(() =>
import('./LazyComponent').then(module => ({
default: module.LazyComponent
}))
);
Для улучшения UX можно предзагружать компоненты:
const LazyComponent = lazy(() => import('./LazyComponent'));
// Предзагрузка при наведении или других событиях
function handleMouseEnter() {
import('./LazyComponent');
}
function App() {
return (
<div onMouseEnter={handleMouseEnter}>
<Suspense fallback={<Loader />}>
<LazyComponent />
</Suspense>
</div>
);
}
Можно создавать вложенные Suspense с разными fallback:
<Suspense fallback={<AppLoader />}>
<Header />
<Suspense fallback={<SidebarLoader />}>
<Sidebar />
</Suspense>
<MainContent>
<Suspense fallback={<ContentLoader />}>
<LazyComponent />
</Suspense>
</MainContent>
</Suspense>
Используйте комментарии для webpack:
const LazyComponent = lazy(() => import(
/* webpackChunkName: "lazy-component" */
/* webpackPrefetch: true */
'./LazyComponent'
));
React.lazy и Suspense предоставляют простой способ реализации ленивой загрузки:
React.lazy
для динамических импортов компонентовSuspense
с fallbackЭти инструменты особенно полезны для больших приложений, где важно уменьшить начальный размер бандла и ускорить загрузку.