Code splitting — техника разделения кода на отдельные части, которые загружаются по мере необходимости. В контексте современных JavaScript-приложений это позволяет уменьшить начальный размер бандла, ускорить рендеринг и снизить нагрузку на сеть. В Inferno, благодаря его совместимости с современными инструментами сборки, code splitting реализуется на уровне компонентов с использованием динамического импорта и ленивой загрузки.
ES2020 поддерживает синтаксис динамического импорта через
import(). Это основной инструмент для разделения кода.
Вместо того чтобы включать весь код компонентов в основной бандл, можно
импортировать их только при необходимости:
import { render } from 'inferno';
import { Suspense, lazy } from 'inferno';
const LazyComponent = lazy(() => import('./LazyComponent'));
render(
<Suspense fallback={<div>Загрузка...</div>}>
<LazyComponent />
</Suspense>,
document.getElementById('root')
);
lazy() — функция, которая принимает
колбэк с динамическим импортом и возвращает ленивый компонент.Suspense — компонент, который
отображает запасной UI (fallback) до полной загрузки
ленивого компонента.Важно: Suspense пока в Inferno поддерживается в
экспериментальном режиме, но основной принцип работы совпадает с
React.
Ленивые компоненты позволяют откладывать загрузку тяжелых частей интерфейса до момента их фактического использования. Это критично для страниц с большим количеством маршрутов или компонентов с объемной логикой.
Пример ленивой загрузки компонента на уровне маршрута:
import { BrowserRouter as Router, Route, Switch } from 'inferno-router';
import { lazy, Suspense } from 'inferno';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const App = () => (
<Router>
<Suspense fallback={<div>Загрузка страницы...</div>}>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
</Switch>
</Suspense>
</Router>
);
Для полноценного code splitting необходимо правильно настроить сборщик. Webpack автоматически создает отдельные чанки для динамических импортов:
const LazyComponent = lazy(() => import(/* webpackChunkName: "lazy-component" */ './LazyComponent'));
webpackChunkName позволяет задавать
читаемое имя для отдельного чанка, облегчая отладку и мониторинг
загрузки.Webpack создает отдельный файл lazy-component.[hash].js,
который загружается браузером только при рендере компонента.
При ленивой загрузке компонентов важно учитывать состояние приложения. Часто используется глобальный менеджер состояния (например, Redux, MobX) для хранения данных, доступных даже до полной загрузки компонента:
import { createStore } from 'redux';
import { Provider } from 'inferno-redux';
import App from './App';
const store = createStore(rootReducer);
render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
Preloading и prefetching позволяют браузеру заранее загружать необходимые чанки:
const LazyComponent = lazy(() => import(/* webpackPrefetch: true */ './LazyComponent'));
webpackPrefetch — загружает компонент
в фоновом режиме, снижая задержку при его вызове.webpackPreload — загружает компонент
сразу после основного бандла, ускоряя первый рендер.webpack-bundle-analyzer помогают визуализировать
распределение кода по чанкам.Inferno поддерживает серверный рендеринг (SSR), что усложняет динамическую загрузку компонентов:
import { renderToString } from 'inferno-server';
import App from './App';
const html = renderToString(<App />);
Эффективное применение code splitting в Inferno требует сочетания:
lazy().Suspense для отображения состояния
загрузки.Такой подход позволяет создавать масштабируемые интерфейсы с минимальными задержками, сохраняя быстрый старт приложения и плавную работу пользователя.