React Suspense в сочетании с ленивой загрузкой позволяет значительно улучшить производительность приложений, загружая компоненты только когда они действительно нужны. Вот полное руководство по этой технологии.
import { lazy, Suspense } from 'react';
const LazyComponent = lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback={<div>Загружаем компонент...</div>}>
<LazyComponent />
</Suspense>
);
}
Что происходит:
Для компонентов, экспортированных по имени:
const LazyComponent = lazy(() => import('./LazyComponent')
.then(module => ({ default: module.LazyComponent })));
Для оптимизации UX можно предзагружать компоненты:
const LazyComponent = lazy(() => import('./LazyComponent'));
// Где-то в обработчике событий (например, при hover на кнопке)
function handleHover() {
import('./LazyComponent');
}
function App() {
return (
<Suspense fallback={<Spinner />}>
<LazyComponent />
</Suspense>
);
}
Типичный пример для роутинга:
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
const Home = lazy(() => import('./routes/Home'));
const About = lazy(() => import('./routes/About'));
function App() {
return (
<Router>
<Suspense fallback={<GlobalLoader />}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
</Router>
);
}
Разные fallback для разных частей приложения:
<Suspense fallback={<AppLoader />}>
<Layout>
<Suspense fallback={<SidebarLoader />}>
<Sidebar />
</Suspense>
<MainContent>
<Suspense fallback={<ContentLoader />}>
<LazyComponent />
</Suspense>
</MainContent>
</Layout>
</Suspense>
Обязательно сочетайте с Error Boundary:
import { ErrorBoundary } from 'react-error-boundary';
function ErrorFallback({ error }) {
return <div>Ошибка загрузки компонента: {error.message}</div>;
}
<ErrorBoundary FallbackComponent={ErrorFallback}>
<Suspense fallback={<Loader />}>
<LazyComponent />
</Suspense>
</ErrorBoundary>
Чтобы избежать "мигания" лоадера при быстрой загрузке:
<Suspense fallback={<DelayedSpinner delay={300} />}>
<LazyComponent />
</Suspense>
Где DelayedSpinner
:
function DelayedSpinner({ delay }) {
const [show, setShow] = useState(false);
useEffect(() => {
const timer = setTimeout(() => setShow(true), delay);
return () => clearTimeout(timer);
}, [delay]);
return show ? <Spinner /> : null;
}
Для Next.js/Gatsby используйте их встроенные решения:
// Next.js пример
import dynamic from 'next/dynamic';
const DynamicComponent = dynamic(
() => import('../components/LazyComponent'),
{
loading: () => <p>Загрузка...</p>,
ssr: false // Отключить для SSR
}
);
React Suspense с ленивой загрузкой — мощный инструмент для:
Используйте эту связку для больших приложений, но помните о необходимости: