Метод bundle.generate() является ключевой частью
программного API Rollup и используется для получения итогового бандла
без записи файлов на диск. В отличие от bundle.write(),
который выполняет физическую запись результатов сборки,
bundle.generate() формирует структуру выходных данных
полностью в памяти и возвращает её в виде объекта, пригодного для
дальнейшей обработки, анализа или передачи в другие системы сборки.
Этот подход используется в случаях, когда требуется интеграция Rollup в собственные инструменты, CI/CD пайплайны, серверные рендереры или любые сценарии, где файловая система либо не используется, либо контролируется отдельно.
Метод вызывается на экземпляре бандла, полученном через
rollup.rollup():
const bundle = await rollup.rollup(inputOptions);
const result = await bundle.generate(outputOptions);
outputOptions в generate() совпадают по
структуре с опциями bundle.write(), за исключением того,
что любые параметры, связанные с файловой системой, игнорируются.
bundle.generate() возвращает объект следующего вида:
{
output: OutputChunk[] | OutputAsset[]
}
Где output — массив всех сформированных сущностей
бандла:
Каждый элемент массива имеет строго определённую структуру.
Chunk представляет собой итоговый JavaScript-файл или его часть:
{
type: "chunk",
fileName: "index.js",
code: "function test() {}",
map: {...},
isEntry: true,
imports: [],
dynamicImports: [],
modules: {...}
}
Ключевые поля:
code — итоговый JS-код после всех трансформацийmap — sourcemap (если включён)fileName — виртуальное имя файлаisEntry — является ли точкой входаimports — зависимости чанкаmodules — исходные модули, включённые в чанкAsset — это не-JS ресурс:
{
type: "asset",
fileName: "style.css",
source: "body { margin: 0; }"
}
Основные поля:
source — содержимое файла (строка или Buffer-like
данные)fileName — имя файлаtype: "asset"Главное различие заключается в способе обработки результата сборки:
| Метод | Результат | Файловая система |
|---|---|---|
generate() |
объект в памяти | не используется |
write() |
файлы на диске + объект | используется |
generate() не выполняет операций ввода-вывода, что
делает его более быстрым и предсказуемым в контексте тестирования и
серверной обработки.
Формат определяется через outputOptions.format:
await bundle.generate({
format: "es"
});
Поддерживаемые форматы:
es — ES modulescjs — CommonJSamd — AMDiife — самовызывающийся скриптumd — универсальный форматФормат напрямую влияет на структуру code внутри
chunk’ов.
Rollup поддерживает мульти-вывод:
const result = await bundle.generate([
{
format: "es"
},
{
format: "cjs"
}
]);
В этом случае возвращается массив результатов:
[
{ output: [...] }, // ES build
{ output: [...] } // CJS build
]
Каждый набор содержит собственные chunks и assets.
Sourcemap генерируется аналогично write(), но остаётся в
памяти:
await bundle.generate({
format: "es",
sourcemap: true
});
В chunk появится поле:
map: {
version: 3,
file: "index.js",
sources: [...],
mappings: "..."
}
Sourcemap полезен при:
bundle.generate() полностью проходит через pipeline
Rollup-плагинов:
resolveIdloadtransformrenderChunkgenerateBundleФинальный этап generateBundle выполняется, но с важной
особенностью: отсутствует запись файлов, поэтому любые операции,
завязанные на outputOptions.dir или file, не
приводят к созданию файловой структуры.
Плагины могут добавлять новые assets:
generateBundle(options, bundle) {
bundle["virtual.txt"] = {
type: "asset",
fileName: "virtual.txt",
source: "generated in memory"
};
}
Эти данные будут присутствовать в результате
bundle.generate().
Процесс генерации можно условно разбить на этапы:
На этапе 5 Rollup преобразует граф модулей в финальный код, а на
этапе 6 упаковывает результат в структуру output.
import { rollup } from "rollup";
const bundle = await rollup({
input: "src/index.js"
});
const { output } = await bundle.generate({
format: "es",
sourcemap: true
});
for (const chunkOrAsset of output) {
if (chunkOrAsset.type === "chunk") {
console.log(chunkOrAsset.code);
} else {
console.log(chunkOrAsset.fileName, chunkOrAsset.source);
}
}
Поскольку результат полностью находится в памяти, его можно:
Несмотря на гибкость, существуют ограничения:
outputOptions.file как источник
побочного эффектаПосле завершения работы с generate() рекомендуется
закрыть бандл:
await bundle.close();
Это освобождает ресурсы, особенно в длительных процессах или CI-окружениях.
bundle.generate() занимает промежуточное место между
анализом модуля и финальной публикацией результата. Он позволяет
отделить:
Эта модель делает Rollup пригодным для использования как компиляционного движка внутри других инструментов, где файловая система не является обязательной частью пайплайна.