Bundle splitting и code splitting — это техники оптимизации загрузки веб-приложений, направленные на уменьшение времени старта и улучшение производительности. В контексте Riot.js, где компоненты компилируются в JavaScript, эти методы позволяют загружать только необходимые части приложения, а не весь код сразу.
Code splitting — процесс разделения исходного кода на отдельные модули, которые загружаются по мере необходимости. Вместо одного большого файла бандла создаются несколько маленьких, что снижает нагрузку на сеть и ускоряет первый рендер.
Bundle splitting — более широкий термин, включающий code splitting и организацию бандлов на уровне всего приложения. Он позволяет разделить приложение на «основной» бандл, библиотечные бандлы и ленивые части, которые подключаются динамически.
Основная цель — уменьшение time-to-interactive (TTI) и повышение отзывчивости интерфейса.
Riot.js использует стандартный модульный подход через ES Modules или CommonJS. Для динамической загрузки компонентов применяются:
import('path/to/component.tag').then(module => {
const Component = module.default;
riot.mount('#app', Component);
});
Ключевые моменты:
import() возвращает промис, позволяя загружать
компонент асинхронно.Webpack поддерживает dynamic imports и позволяет настраивать chunk naming:
import(/* webpackChunkName: "user-profile" */ './components/UserProfile.tag')
.then(module => {
riot.mount('#profile', module.default);
});
webpackChunkName задает имя отдельного файла./* webpackMode: "lazy" */ гарантирует,
что файл загружается только при необходимости.Vite автоматически разбивает бандлы на основе динамических импортов:
const loadComponent = async () => {
const module = await import('./components/Dashboard.tag');
riot.mount('#dashboard', module.default);
};
Асинхронная загрузка компонентов позволяет ускорить первичный рендер:
riot.register('async-component', async () => {
const module = await import('./components/AsyncComponent.tag');
return module.default;
});
Отдельный бандл для Riot.js и сторонних библиотек помогает:
Пример Webpack-конфигурации:
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
Для мониторинга загрузки чанков удобно использовать DevTools:
Эта практика помогает выявить узкие места и оптимизировать структуру приложения.
Такой подход обеспечивает высокую производительность, улучшает UX и делает приложение масштабируемым при росте функционала.