Code splitting — это техника оптимизации загрузки веб-приложений, позволяющая разбивать код на отдельные части (чанки), которые подгружаются по мере необходимости. В JavaScript это особенно актуально для крупных приложений на фреймворках вроде React, Vue или Angular, где основной бандл может достигать десятков мегабайт.
Динамический импорт В JavaScript динамический
импорт реализуется с помощью функции import(). Она
возвращает промис, который загружает модуль только при обращении к
нему:
import('./module.js')
.then(module => {
module.init();
})
.catch(err => console.error('Ошибка загрузки модуля', err));
Это позволяет избежать загрузки всех модулей сразу, снижая время первоначальной загрузки страницы.
Разделение бандлов по маршрутам В SPA (Single Page Application) часто используется подход, при котором каждый маршрут загружает только необходимые компоненты:
const Home = React.lazy(() => import('./Home'));
const About = React.lazy(() => import('./About'));
Такой метод уменьшает начальный размер бандла и ускоряет Time to Interactive.
Разделение сторонних библиотек Webpack и другие
сборщики позволяют выносить зависимости из node_modules в
отдельные чанки:
optimization: {
splitChunks: {
chunks: 'all',
},
}
Это полезно для кэширования: сторонние библиотеки обновляются реже, чем собственный код приложения.
Lighthouse оценивает производительность веб-страниц по метрикам, связанным с загрузкой и рендерингом. Code splitting напрямую влияет на следующие показатели:
Lighthouse может выявлять большие бандлы и рекомендовать динамическую загрузку модулей для снижения времени загрузки.
Webpack предоставляет мощные инструменты для code splitting:
Entry Points Разделение бандлов через разные точки входа:
entry: {
main: './src/index.js',
admin: './src/admin.js',
}
Каждый entry формирует отдельный файл.
Dynamic Imports Использование
import() автоматически создаёт отдельный чанковый файл для
каждого модуля.
SplitChunksPlugin Позволяет автоматически создавать общие чанки для модулей, используемых в нескольких бандлах:
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all',
},
},
}// main.js
import('./core.js').then(core => core.init());
import('./analytics.js'); // асинхронная загрузка, не критично для FCP
// webpack.config.js
module.exports = {
entry: './main.js',
output: { filename: '[name].[contenthash].js' },
optimization: {
splitChunks: { chunks: 'all' },
},
};
Такой подход позволяет обеспечить быстрый старт приложения, минимальный размер начального бандла и корректное кэширование ресурсов, что улучшает показатели Lighthouse и общий UX.
Code splitting является ключевым инструментом для оптимизации крупных приложений и напрямую влияет на скорость загрузки, интерактивность и оценку производительности в Lighthouse.