rollup.rollup() является центральной точкой программного
API Rollup и запускает процесс построения бандла. На этом этапе
происходит анализ зависимостей, построение графа модулей, применение
плагинов и подготовка внутреннего представления будущего результата
сборки.
import { rollup } from 'rollup';
const bundle = await rollup({
input: 'src/index.js'
});
Возвращаемое значение — объект bundle, который
представляет собой результат фазы построения (build phase), но ещё не
содержит финального кода. Это промежуточная сущность, позволяющая
отдельно управлять генерацией и записью выходных файлов.
При вызове rollup.rollup() выполняется
последовательность шагов:
input)Граф модулей в Rollup — это ориентированный граф, в котором каждый
узел соответствует модулю, а ребра представляют зависимости через
import.
Особенность Rollup заключается в том, что он стремится к статическому анализу, поэтому динамические конструкции импорта ограничены и требуют специальных плагинов для корректной обработки.
Плагины активно участвуют уже на этапе rollup.rollup().
Основные хуки, влияющие на сборку:
options — модификация входных параметровbuildStart — начало процесса сборкиresolveId — разрешение путей модулейload — загрузка содержимого модуляtransform — трансформация кодаmoduleParsed — реакция на разобранный модульКаждый модуль проходит через цепочку плагинов, что позволяет изменять код до того, как он попадёт в граф.
Ключевой момент: на этапе rollup() код ещё не
генерируется, но уже полностью формируется структура бандла.
Результат вызова rollup.rollup() — это объект
bundle, содержащий методы:
generate(outputOptions)write(outputOptions)close()Этот объект инкапсулирует весь построенный граф и внутренние оптимизации.
Пример:
const bundle = await rollup({
input: 'src/index.js'
});
const result = await bundle.generate({
format: 'esm'
});
bundle.generate()Метод generate() запускает процесс генерации выходного
кода без записи на диск.
На этом этапе происходят:
Результат:
{
output: [
{
code: '...',
map: {...},
fileName: 'chunk.js',
format: 'esm'
}
]
}
Важно, что generate() возвращает структуру результата в
памяти и не взаимодействует с файловой системой.
bundle.write()write() выполняет те же операции, что и
generate(), но дополнительно записывает результат в
файловую систему.
await bundle.write({
dir: 'dist',
format: 'esm'
});
Функционально процесс включает:
output.pluginsРазличие между generate() и write()
заключается исключительно в финальном этапе I/O.
Объект outputOptions управляет тем, как будет
формироваться финальный бандл:
format — формат вывода (esm,
cjs, iife, umd,
system)dir или file — место записиentryFileNames — шаблон имен входных чанковchunkFileNames — шаблон имен дополнительных чанковassetFileNames — ресурсы (CSS, изображения)sourcemap — генерация source mapsЭти параметры влияют только на фазу генерации, но не на построение
графа в rollup().
После выполнения rollup.rollup() формируется внутреннее
представление:
Rollup стремится минимизировать количество чанков, сохраняя оптимальную структуру зависимостей.
Пример логики формирования чанков:
import() → отдельный чанкrollup.rollup() всегда возвращает Promise, так как
процесс включает:
const bundle = await rollup(inputOptions);
Асинхронность распространяется дальше на generate() и
write(), что позволяет строить сложные пайплайны
сборки.
Tree-shaking начинается уже после построения графа, но его основы
закладываются в rollup.rollup():
import/exportКаждый модуль получает мета-информацию:
Это делает Rollup особенно эффективным для библиотек и ESM-кода.
Если в input передан массив или объект,
rollup.rollup() строит несколько entry-узлов:
await rollup({
input: {
main: 'src/main.js',
admin: 'src/admin.js'
}
});
В этом случае формируется несколько независимых деревьев, которые могут:
Объект bundle требует явного закрытия при использовании
в долгоживущих процессах:
await bundle.close();
Это освобождает:
Особенно важно при использовании Rollup в watch-режиме или серверных сборщиках.
rollup.rollup() можно рассматривать как слой
компиляции:
Дальнейшие методы generate() и write()
являются этапами сериализации этого графа в конкретные форматы.
Такое разделение позволяет:
Один и тот же bundle может использоваться несколько
раз:
const bundle = await rollup(inputOptions);
await bundle.write({ dir: 'dist/esm', format: 'esm' });
await bundle.write({ dir: 'dist/cjs', format: 'cjs' });
Построение графа выполняется один раз, а генерация повторяется, что значительно ускоряет процесс сборки при мультиформатной публикации.