rollup.rollup() запускает процесс сборки и возвращает объект сборки (bundle), который является центральной точкой дальнейшего взаимодействия с результатом компиляции. В отличие от привычных одношаговых инструментов, Rollup разделяет этапы анализа графа модулей и этапы генерации выходного кода, что позволяет гибко управлять выводом: получать результат в памяти или записывать его в файловую систему.
Функция rollup.rollup(inputOptions) принимает объект конфигурации, который описывает входные точки, плагины и поведение резолвинга.
Основная задача этого этапа — построить граф зависимостей и подготовить внутреннее представление модулей без генерации финального кода.
Типичная форма вызова:
import { rollup } from 'rollup';
const bundle = await rollup({
input: 'src/index.js',
plugins: []
});
На этом этапе происходит:
Важно, что на данном шаге ещё не создаются финальные файлы. Все операции работают в памяти.
Если в процессе сборки возникает ошибка (например, неразрешённый импорт), она будет выброшена именно на этапе rollup().
Результатом вызова rollup() является объект bundle. Он содержит методы генерации и записи, а также внутреннее состояние графа.
Основные методы:
Этот объект можно рассматривать как «собранный проект», который можно многократно использовать для разных целей вывода.
Метод bundle.generate(outputOptions) используется для получения итогового кода без записи на диск. Это ключевой инструмент для:
Пример:
const result = await bundle.generate({
format: 'esm',
sourcemap: true
});
console.log(result.output);
На выходе возвращается объект следующей структуры:
{
output: [
{
type: 'chunk',
code: '...',
map: {...},
fileName: 'index.js'
}
]
}
Типичный сценарий — генерация нескольких форматов:
const esm = await bundle.generate({ format: 'esm' });
const cjs = await bundle.generate({ format: 'cjs' });
Таким образом один граф модулей переиспользуется без повторного анализа зависимостей.
Метод bundle.write(outputOptions) выполняет генерацию кода и запись файлов в файловую систему. По сути, это комбинация generate + emit файлов.
Пример:
await bundle.write({
dir: 'dist',
format: 'esm',
sourcemap: true
});
Основное отличие от generate заключается в том, что результат не только формируется, но и сохраняется физически.
Несмотря на схожесть внутренней логики, методы решают разные задачи.
Ключевая идея: generate — это «виртуальная сборка», write — «физическая сборка».
И generate, и write используют единый механизм генерации:
Tree-shaking играет критическую роль: Rollup анализирует статические импорты и удаляет неиспользуемые экспорты, формируя минимальный результат.
Объект bundle может быть использован несколько раз до вызова close():
const bundle = await rollup(config);
await bundle.generate({ format: 'esm' });
await bundle.generate({ format: 'cjs' });
await bundle.write({ dir: 'dist/esm', format: 'esm' });
await bundle.write({ dir: 'dist/cjs', format: 'cjs' });
Это позволяет:
Output options определяют поведение генерации:
Эти параметры применяются уже после построения графа, на этапе генерации кода.
И rollup(), и методы bundle работают асинхронно, что связано с:
После завершения работы рекомендуется вызывать:
await bundle.close();
Это освобождает ресурсы плагинов (например, watcher, соединения, кеши).
Ошибки могут возникать:
Особенность модели Rollup — строгая детерминированность графа: если зависимость не может быть разрешена, генерация останавливается до bundle.
Разделение на два метода позволяет строить сложные системы сборки:
Такая архитектура делает Rollup не просто CLI-инструментом, а программируемым компилятором модульного графа JavaScript.