В Webpack конфигурация entry может принимать не только
строку, но и объект, позволяющий задать несколько независимых точек
входа для одного проекта. Такой подход используется в приложениях с
несколькими страницами, административных панелях, микрофронтендах и
любых системах, где логика разбивается на изолированные части.
При использовании нескольких точек входа конфигурация превращается из линейной в структурированную:
module.exports = {
entry: {
home: './src/home.js',
about: './src/about.js',
admin: './src/admin.js'
}
};
Каждое свойство объекта становится отдельным графом зависимостей. Webpack строит для каждого entry свой набор модулей, начиная с указанного файла и рекурсивно добавляя все зависимости.
Ключи объекта (home, about,
admin) определяют имена будущих бандлов.
При множественных entry важно корректно задать шаблон именования:
module.exports = {
entry: {
home: './src/home.js',
about: './src/about.js'
},
output: {
filename: '[name].bundle.js',
path: __dirname + '/dist'
}
};
Плейсхолдер [name] подставляет ключ из объекта entry. В
результате формируются:
home.bundle.jsabout.bundle.jsБез использования шаблона Webpack перезапишет файл, и останется только последний сборочный результат.
Каждая точка входа строит собственный dependency graph. Это означает:
Например, если и home.js, и about.js
используют lodash, то без специальных настроек библиотека
попадёт в оба бандла отдельно.
При масштабировании проекта множественные entry быстро приводят к повторному включению одинаковых зависимостей. Это увеличивает размер сборки и ухудшает загрузку.
Типичный сценарий:
// home.js
import _ from 'lodash';
// about.js
import _ from 'lodash';
В результате:
home.bundle.js содержит lodashabout.bundle.js содержит lodashДля устранения дублирования используется оптимизация
splitChunks:
module.exports = {
entry: {
home: './src/home.js',
about: './src/about.js'
},
optimization: {
splitChunks: {
chunks: 'all'
}
}
};
Webpack автоматически анализирует пересечения модулей и выносит общие зависимости в отдельный файл.
Часто используется более контролируемый вариант:
optimization: {
splitChunks: {
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
Такой подход формирует отдельный vendors.js, содержащий
библиотеки из node_modules, что позволяет:
При множественных entry возникает проблема изменения хешей даже при
небольших правках. Для стабилизации используется
runtimeChunk:
module.exports = {
optimization: {
runtimeChunk: 'single'
}
};
Webpack выносит runtime-логику в отдельный файл, который управляет загрузкой модулей. Это позволяет:
Наиболее распространённый сценарий множественных entry — мультистраничные приложения.
Структура проекта:
src/
home.js
about.js
admin.js
shared/
utils.js
Конфигурация:
module.exports = {
entry: {
home: './src/home.js',
about: './src/about.js',
admin: './src/admin.js'
},
output: {
filename: '[name].[contenthash].js',
path: __dirname + '/dist',
clean: true
}
};
Каждая страница получает собственный JS-бандл, что соответствует классической серверной модели рендеринга.
При множественных entry важно связать каждый бандл с соответствующей HTML-страницей:
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: {
home: './src/home.js',
about: './src/about.js'
},
plugins: [
new HtmlWebpackPlugin({
filename: 'home.html',
chunks: ['home']
}),
new HtmlWebpackPlugin({
filename: 'about.html',
chunks: ['about']
})
]
};
Каждый HTML-файл подключает только свой набор скриптов.
Множественные entry по своей природе изолируют код, но важно учитывать:
window;Такой подход хорошо подходит для:
Хотя Webpack чаще конфигурируется статически, entry можно формировать программно:
const pages = ['home', 'about', 'admin'];
module.exports = {
entry: pages.reduce((config, page) => {
config[page] = `./src/${page}.js`;
return config;
}, {})
};
Это удобно при генерации конфигурации на основе файловой структуры.
Множественные entry часто отражают архитектуру приложения:
home, profile)admin,
dashboard)about, contact)Каждая зона может иметь собственный набор зависимостей и стратегию загрузки.
Использование нескольких entry влияет на поведение загрузки:
Положительные эффекты:
Отрицательные эффекты при неправильной настройке:
Множественные entry не заменяют dynamic import, но могут
сочетаться с ним:
Пример разделения:
home.js — базовая логика страницыhome динамически загружает модули при
необходимостиОдной из распространённых проблем является попытка использовать один и тот же entry для разных страниц без разделения чанков. Это приводит к:
Другой частый случай — отсутствие chunks в
HTMLWebpackPlugin, из-за чего все скрипты подключаются ко всем
страницам.
При проектировании структуры с множественными entry обычно применяют следующие принципы:
splitChunks для автоматической
оптимизации;Такой подход обеспечивает предсказуемость сборки и упрощает масштабирование приложения.