При использовании нескольких точек входа Rollup перестаёт формировать единый бандл и переходит к модели графа модулей, в котором общие зависимости между точками входа выделяются в отдельные чанки. Это поведение является основой автоматического code splitting и позволяет эффективно организовать загрузку кода в приложениях среднего и крупного масштаба.
Когда в конфигурации указывается массив или объект точек входа, Rollup строит единый граф зависимостей для всех указанных модулей. Вместо независимой сборки каждого entry point происходит анализ пересечений:
Основная идея заключается в том, что каждый модуль должен быть включён в итоговую сборку ровно один раз, если он может быть переиспользован.
Пример конфигурации:
export default {
input: {
main: 'src/main.js',
admin: 'src/admin.js'
},
output: {
dir: 'dist',
format: 'esm'
}
};
В этом случае Rollup анализирует оба входных файла и их зависимости как единый граф.
При наличии пересечений между графами зависимостей Rollup создаёт отдельные чанки. Например, если оба entry point используют один и тот же модуль:
// src/utils/math.js
export function sum(a, b) {
return a + b;
}
И он импортируется в разных точках входа:
// src/main.js
import { sum } from './utils/math.js';
console.log(sum(2, 3));
// src/admin.js
import { sum } from './utils/math.js';
console.log(sum(10, 20));
Rollup извлечёт math.js в отдельный chunk, если формат
вывода поддерживает динамическую загрузку (например,
esm).
Автоматическое разделение кода при нескольких entry points работает только при выполнении ряда условий:
Code splitting поддерживается только для форматов, допускающих динамическую загрузку:
esmsystem (частично, через плагины)Форматы cjs и iife не поддерживают
разбиение на чанки, так как предполагают единый исполняемый файл.
При использовании code splitting требуется указание директории вместо файла:
output: {
dir: 'dist',
format: 'esm'
}
Попытка использовать file приведёт к ошибке, поскольку
несколько чанков невозможно упаковать в один файл.
Если зависимости строго линейны и не пересекаются, Rollup может не создавать общих чанков. Разделение происходит только при наличии пересечений.
Rollup применяет графовую модель, в которой каждый модуль рассматривается как узел. Процесс включает несколько этапов:
Построение полного dependency graph для всех entry points.
Определение strongly connected components.
Выделение shared modules.
Формирование чанков на основе:
В результате получается набор файлов, каждый из которых соответствует логическому фрагменту графа.
Рассмотрим структуру:
main.js → a.js → shared.js
admin.js → b.js → shared.js
В этом случае shared.js будет вынесен в отдельный chunk.
Остальные модули останутся в своих цепочках.
Если же зависимость используется только в одном entry point, она не выносится отдельно и остаётся внутри соответствующего чанка.
Хотя основная тема связана с множественными entry points, поведение
code splitting усиливается при использовании import():
// src/main.js
button.oncl ick = async () => {
const module = await import('./heavy-module.js');
module.run();
};
В таком случае Rollup:
heavy-module.js;При сочетании нескольких entry points и динамических импортов формируется гибридная структура чанков.
Для корректной работы разделения кода часто требуется дополнительная настройка:
Позволяет управлять логикой разбиения вручную:
output: {
dir: 'dist',
format: 'esm',
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor';
}
}
}
При нескольких entry points это позволяет стабилизировать структуру чанков и избежать избыточного дробления.
При включении этого режима Rollup сохраняет структуру исходных модулей:
output: {
dir: 'dist',
format: 'esm',
preserveModules: true
}
В контексте нескольких entry points это приводит к сохранению модульной структуры без агрессивного объединения, что может быть полезно для библиотек.
External зависимости исключаются из графа и не участвуют в code splitting:
external: ['lodash']
При нескольких entry points такие зависимости остаются ссылочными и не влияют на формирование чанков.
Каждая страница имеет собственный entry point, но использует общий набор утилит и компонентов.
Разделение admin и client с частично
пересекающейся бизнес-логикой.
Каждый entry point соответствует отдельной функциональной зоне API.
Автоматическое code splitting при нескольких entry points имеет ряд ограничений:
Поведение Rollup всегда определяется структурой зависимостей, а не конфигурацией entry points напрямую, что требует внимательного проектирования архитектуры модулей.