Плагин @rollup/plugin-multi-entry используется в Rollup
для объединения нескольких входных файлов в единый граф модулей без
необходимости вручную описывать каждый entry point. Его основная задача
— позволить задавать несколько точек входа через один виртуальный
входной модуль, который затем импортирует все указанные файлы. Это
особенно полезно в сценариях, где структура проекта содержит набор
независимых модулей, которые требуется собрать как единый пакет или
библиотеку.
Плагин относится к категории entry-handling инструментов и решает
проблему ограничения Rollup, связанного с тем, что стандартная
конфигурация input ожидает либо один файл, либо явный
список входов. При масштабировании проекта поддержка таких списков
становится неудобной, особенно если они генерируются динамически.
Внутри Rollup каждый входной файл рассматривается как корень графа
зависимостей. @rollup/plugin-multi-entry добавляет
дополнительный слой абстракции: он создает виртуальный модуль, который
агрегирует список файлов через последовательность export
или import.
Фактически плагин выполняет следующие действия:
Такой подход позволяет использовать стандартный механизм tree-shaking, поскольку все зависимости остаются частью единого графа.
Плагин подключается как зависимость проекта:
npm install @rollup/plugin-multi-entry --save-dev
или
yarn add @rollup/plugin-multi-entry -D
После установки он становится доступен для использования в конфигурации Rollup.
Минимальная настройка включает подключение плагина в список
plugins и передачу входных файлов через
input.
import multiEntry from '@rollup/plugin-multi-entry';
export default {
input: 'src/index.js',
plugins: [
multiEntry()
],
output: {
file: 'dist/bundle.js',
format: 'esm'
}
};
В этом примере src/index.js может быть виртуальной
точкой входа, которая агрегирует другие модули через конфигурацию
плагина.
Основная функциональность проявляется при работе с массивом файлов:
import multiEntry from '@rollup/plugin-multi-entry';
export default {
input: 'src/entries.js',
plugins: [
multiEntry({
exports: false
})
],
output: {
file: 'dist/bundle.js',
format: 'cjs'
}
};
Где entries.js может содержать:
import './moduleA.js';
import './moduleB.js';
import './moduleC.js';
Такой подход позволяет явно управлять списком входных модулей, сохраняя контроль над порядком импорта.
Часто используется совместно с glob-паттернами для
автоматического подключения файлов:
import multiEntry from '@rollup/plugin-multi-entry';
export default {
input: 'src/entries.js',
plugins: [
multiEntry({
exports: true
})
]
};
И внутри entries.js:
export * from './modules/*.js';
Плагин интерпретирует это как набор отдельных модулей, добавляя их в граф сборки.
exports определяет способ экспорта модулей.
false — файлы подключаются через import,
но не агрегируются как экспортируемые сущности.true — создаются реэкспорты всех модулей.Пример:
multiEntry({
exports: true
})
В этом режиме Rollup формирует единый интерфейс экспорта из множества файлов.
Хотя сам плагин не всегда предоставляет полноценные фильтры, он часто используется совместно с внешними механизмами отбора файлов:
import glob from 'glob';
const files = glob.sync('src/modules/**/*.js');
Затем список передается в виртуальный entry-файл.
Ключевая концепция @rollup/plugin-multi-entry — создание
виртуального entry-модуля.
Rollup ожидает файл входа, но плагин подменяет его содержимое:
import './a.js';
import './b.js';
import './c.js';
Этот файл может не существовать физически или генерироваться динамически. Плагин перехватывает запрос и подставляет сгенерированный код.
Когда проект состоит из набора независимых функций:
src/utils/date.js
src/utils/string.js
src/utils/math.js
Можно собрать их в один пакет без ручного перечисления:
import multiEntry from '@rollup/plugin-multi-entry';
export default {
input: 'src/utils/index.js',
plugins: [multiEntry()]
};
При разработке библиотеки важно сохранять возможность частичного импорта:
export { a } from './a.js';
export { b } from './b.js';
multi-entry позволяет автоматически формировать такие агрегаты.
Если структура модулей формируется автоматически (например, из CMS или API), плагин позволяет подключать их без статической конфигурации.
Все входные файлы фактически становятся частью одного графа. Это
означает отсутствие изолированных чанков, как при использовании массива
input.
Если используется режим exports: true, Rollup может
включать больше кода, чем при явных точках входа, особенно если модули
имеют побочные эффекты.
Rollup учитывает sideEffects в
package.json, но при multi-entry важно явно
контролировать:
{
"sideEffects": false
}
Иначе некоторые модули могут быть включены полностью.
Использование одновременно с @rollup/plugin-alias или
динамическими входами требует аккуратной настройки порядка плагинов.
После обработки multi-entry Rollup строит граф следующим образом:
Это означает, что multi-entry не изменяет саму модель Rollup, а лишь влияет на начальную точку графа.
Rollup позволяет напрямую задавать массив входов:
export default {
input: ['src/a.js', 'src/b.js']
};
Однако @rollup/plugin-multi-entry отличается:
Плагин корректно работает с современными модулями:
import multiEntry from '@rollup/plugin-multi-entry';
export default {
input: 'src/index.ts',
plugins: [
multiEntry()
],
output: {
format: 'esm'
}
};
При этом TypeScript-компиляция выполняется до этапа Rollup или через
отдельный плагин, например @rollup/plugin-typescript.
В реальных проектах multi-entry часто используется как промежуточный слой:
src/modules → entries generator → virtual entry → Rollup → bundle
Генератор может быть Node-скриптом:
import fs from 'fs';
const files = fs.readdirSync('./src/modules');
fs.writeFileSync(
'./src/entries.js',
files.map(f => `import './modules/${f}'`).join('\n')
);
Далее Rollup использует multi-entry для интерпретации результата.
При большом количестве файлов важно учитывать:
Однако сам плагин не выполняет тяжелых вычислений, его стоимость в основном линейна относительно числа входных файлов.
При использовании rollup -w изменения в любом из входных
файлов приводят к пересборке всего графа, поскольку виртуальный entry
зависит от всех модулей сразу.
Это делает watch-режим менее гранулярным по сравнению с отдельными input-чанками.
Плагин обычно используется совместно с:
@rollup/plugin-node-resolve@rollup/plugin-commonjs@rollup/plugin-typescriptrollup-plugin-terserПорядок подключения влияет на итоговую структуру графа, особенно при работе с CommonJS-модулями.
@rollup/plugin-multi-entry закрывает разрыв между
статической моделью входов Rollup и динамическими сценариями сборки, где
список модулей формируется во время разработки или даже во время
выполнения Node-скриптов.
Он фактически превращает Rollup в систему с управляемой динамической агрегацией входных файлов, сохраняя при этом его основной принцип — построение единого графа зависимостей без лишней магии на уровне рантайма.