Механизм нескольких точек входа в Webpack позволяет формировать независимые графы зависимостей внутри одного проекта и собирать их в отдельные бандлы. Это один из базовых способов логического и технического разделения приложения, который применяется как в небольших проектах с разной зоной ответственности модулей, так и в крупных системах с раздельными интерфейсами, страницами или даже микрофронтендами.
Каждая точка входа представляет собой стартовую вершину обхода графа зависимостей. Webpack начинает анализ с указанного файла и рекурсивно включает все импортируемые модули, формируя отдельный бандл для каждой точки входа.
Классический способ определения нескольких точек входа заключается в
использовании объекта в поле entry.
module.exports = {
entry: {
home: './src/home.js',
admin: './src/admin.js',
profile: './src/profile.js'
},
output: {
filename: '[name].bundle.js',
path: __dirname + '/dist'
}
};
В этой конфигурации создаются три независимых бандла:
home.bundle.jsadmin.bundle.jsprofile.bundle.jsКлючи объекта entry становятся именами выходных файлов
через шаблон [name].
Такой подход формирует несколько отдельных графов модулей, каждый из которых начинается со своей точки входа и не пересекается на уровне логического построения бандла.
Наиболее распространённый сценарий использования нескольких точек входа — многостраничные приложения. Каждая страница имеет собственный набор логики и минимально пересекается с другими.
entry: {
landing: './src/pages/landing/index.js',
dashboard: './src/pages/dashboard/index.js',
settings: './src/pages/settings/index.js'
}
Такое разделение позволяет:
Webpack в данном случае строит отдельные dependency graph для каждой страницы.
Несмотря на общий проект и общие зависимости, каждая точка входа формирует собственный граф, но Webpack не дублирует модули автоматически при правильной настройке оптимизации.
Если два entry используют один и тот же модуль:
// home.js
import utils from './utils';
// admin.js
import utils from './utils';
то без дополнительной оптимизации модуль utils может
попасть в оба бандла.
Это поведение приводит к необходимости использования механизмов извлечения общих зависимостей.
При нескольких entry без оптимизации возникает повторение кода. Это особенно заметно в следующих случаях:
Дублирование приводит к:
Webpack решает эту проблему через
optimization.splitChunks.
При нескольких точках входа часто используется настройка:
module.exports = {
entry: {
home: './src/home.js',
admin: './src/admin.js'
},
optimization: {
splitChunks: {
chunks: 'all'
}
}
};
Webpack анализирует пересечения графов и выделяет общие модули в отдельные чанки.
В результате структура сборки меняется:
home.bundle.jsadmin.bundle.jsvendors~home~admin.js или аналогичный общий чанкТаким образом достигается повторное использование кода между entry без дублирования.
При наличии нескольких точек входа Webpack создаёт runtime-код, отвечающий за загрузку модулей и их связывание.
По умолчанию runtime может оказаться в каждом бандле, что также приводит к дублированию.
Для устранения этого используется:
module.exports = {
optimization: {
runtimeChunk: 'single'
}
};
Это выделяет runtime в отдельный файл, который используется всеми entry.
Каждая страница является отдельной точкой входа. Такой подход соответствует архитектуре серверного рендеринга или классических web-приложений без SPA-ядра.
Иногда приложение содержит разные зоны, которые могут загружаться независимо:
Каждая зона собирается как отдельный бандл.
Отдельные entry могут формировать независимые скрипты:
entry: {
chatWidget: './src/widgets/chat.js',
feedbackWidget: './src/widgets/feedback.js'
}
Такие бандлы могут подключаться на сторонних сайтах без загрузки основного приложения.
Несмотря на логическую изоляцию, иногда требуется разделять общий код вручную.
Типичная ошибка — создание скрытых зависимостей между entry через глобальные состояния или импорт одного entry в другой:
import './admin';
Такой подход разрушает независимость графов и приводит к неочевидным связям, усложняющим сборку.
Правильная модель — вынос общего кода в отдельные модули, а не связывание entry между собой.
Webpack позволяет задавать entry не только статически, но и динамически:
module.exports = {
entry: () => ({
home: './src/home.js',
admin: './src/admin.js'
})
};
Это используется в случаях, когда конфигурация генерируется на основе окружения, списка страниц или метаданных проекта.
При нескольких entry необходимо явно управлять подключением бандлов к HTML.
Обычно используется HtmlWebpackPlugin:
plugins: [
new HtmlWebpackPlugin({
chunks: ['home']
})
]
Для каждой страницы указывается свой набор чанков, соответствующий её entry.
В многостраничной архитектуре обычно создаётся несколько HTML-файлов, каждый из которых привязан к своей точке входа.
Несмотря на удобство, модель имеет ограничения:
При масштабировании проекта часто происходит переход к гибридной модели, где несколько entry используются только для отдельных изолированных частей системы.
Разделение на entry напрямую влияет на стратегию кеширования в браузере. При корректной настройке имен файлов с хешами:
output: {
filename: '[name].[contenthash].js'
}
изменения в одном entry не затрагивают другие, что позволяет:
Особенно эффективно это работает в сочетании с выделением vendor и runtime чанков.
Модель нескольких точек входа отражает архитектурное решение о разделении ответственности. Она фактически фиксирует границы модулей на уровне сборки.
Такая структура особенно характерна для:
Webpack в этом случае выступает не только инструментом сборки, но и механизмом архитектурной сегментации кода.