Ленивая загрузка и код-сплиттинг — критически важные техники оптимизации современных веб-приложений. В фреймворке Inferno они реализуются с учётом его высокой производительности и минимальной накладной на рендеринг.
Код-сплиттинг (code splitting) позволяет разделять приложение на отдельные части (чанки), которые загружаются по мере необходимости. Это снижает первоначальный размер бандла и ускоряет загрузку страницы.
В Inferno код-сплиттинг можно реализовать через динамический
import():
import { render } from 'inferno';
import { lazy, Suspense } from 'inferno';
const LazyComponent = lazy(() => import('./LazyComponent'));
const App = () => (
<Suspense fallback={<div>Загрузка...</div>}>
<LazyComponent />
</Suspense>
);
render(<App />, document.getElementById('root'));
Ключевые моменты:
lazy используется для обёртки динамического импорта
компонента.Suspense задаёт резервный UI, который отображается до
полной загрузки ленивого компонента.Для крупных приложений важно разделять код по маршрутам, чтобы пользователи загружали только то, что необходимо для текущего пути.
Пример с использованием React Router-подобной маршрутизации в Inferno:
import { BrowserRouter as Router, Route, Switch } from 'inferno-router';
const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));
const App = () => (
<Router>
<Suspense fallback={<div>Загрузка страницы...</div>}>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
</Suspense>
</Router>
);
Особенности:
Suspense может быть обёрнут вокруг каждой страницы для
индивидуальных индикаторов загрузки.Иногда компонент зависит от большого количества библиотек. В таких случаях ленивый импорт позволяет загружать зависимости только при необходимости:
const ChartComponent = lazy(async () => {
const module = await import('./ChartComponent');
await import('chart.js'); // дополнительная зависимость
return module;
});
Особенности:
Для корректной работы ленивой загрузки и код-сплиттинга важно настроить сборку:
output.chunkFilename для генерации уникальных
имен чанков.optimization.splitChunks для
автоматического разбиения общих модулей.import() в
конфигурации Babel.Пример конфигурации Webpack:
module.exports = {
output: {
filename: '[name].bundle.js',
chunkFilename: '[name].chunk.js',
path: path.resolve(__dirname, 'dist'),
},
optimization: {
splitChunks: {
chunks: 'all',
},
},
};
preload или
prefetch.Inferno сохраняет производительность при использовании ленивой загрузки благодаря:
lazy и Suspense,
аналогичной React, но с минимальной накладной.Эти особенности делают ленивую загрузку особенно эффективной для сложных приложений с большим количеством компонентов и маршрутов.