Ленивая загрузка (lazy loading) компонентов является важной техникой оптимизации производительности веб-приложений. Она позволяет загружать компоненты только тогда, когда они действительно необходимы для отображения, уменьшая начальный размер бандла и ускоряя время первой отрисовки страницы.
Ленивая загрузка в Inferno строится на механизме динамического
импорта JavaScript-модулей. Вместо того чтобы импортировать компонент
напрямую, используется функция import(), которая возвращает
промис с модулем. Этот промис интегрируется с механизмом рендеринга
через обертку Inferno.Lazy.
Ключевые моменты:
Для ленивого компонента используется функция
Inferno.lazy. Пример:
import { lazy, render } from 'inferno';
import { Suspense } from 'inferno';
const LazyComponent = lazy(() => import('./MyComponent'));
const App = () => (
<Suspense fallback={<div>Загрузка...</div>}>
<LazyComponent />
</Suspense>
);
render(<App />, document.getElementById('root'));
Разбор кода:
lazy(() => import('./MyComponent')) создаёт ленивый
компонент, который будет загружен только при рендеринге.Suspense принимает fallback, который
отображается до полной загрузки ленивого компонента.В приложениях с маршрутизацией ленивые компоненты часто используются
для разделения кода по страницам. Например, при использовании
inferno-router можно лениво подгружать каждый маршрут:
import { lazy } from 'inferno';
import { Router, Route } from 'inferno-router';
import { Suspense } from 'inferno';
const HomePage = lazy(() => import('./pages/HomePage'));
const AboutPage = lazy(() => import('./pages/AboutPage'));
const AppRouter = () => (
<Router>
<Suspense fallback={<div>Загрузка страницы...</div>}>
<Route path="/" component={HomePage} />
<Route path="/about" component={AboutPage} />
</Suspense>
</Router>
);
Преимущества:
Поскольку ленивые компоненты загружаются асинхронно, важно учитывать
возможные ошибки сети или ошибки модуля. Для этого используется
комбинация try/catch в динамическом импорте и
компонентов-обработчиков ошибок.
Пример с обработкой ошибки:
const LazyComponentWithErrorHandling = lazy(() =>
import('./MyComponent').catch(error => {
console.error('Ошибка при загрузке компонента', error);
return { default: () => <div>Ошибка загрузки компонента</div> };
})
);
Особенности:
default позволяет корректно
подставить fallback-компонент.Ленивая загрузка становится особенно эффективной в крупных приложениях с большим числом компонентов:
Пример прелоадинга:
const LazyComponent = lazy(() => import('./MyComponent'));
// Прелоад при наведении
const preload = () => import('./MyComponent');
document.getElementById('loadButton').addEventListener('mouseenter', preload);
Suspense для
отображения fallback-контента.Ленивая загрузка в Inferno обеспечивает баланс между производительностью и удобством разработки, позволяя строить масштабируемые и отзывчивые интерфейсы.