Метод bundle.write() в программном API Rollup отвечает
за запись уже сгенерированного бандла на файловую систему. Он является
частью низкоуровневого workflow, в котором процесс сборки разделён на
два этапа: генерацию (generate) и запись
(write). Такой подход позволяет контролировать момент
физического вывода файлов, отделяя вычисление графа зависимостей и
кодогенерацию от операций ввода-вывода.
Метод доступен на экземпляре бандла, возвращаемого функцией
rollup(), и применяется после выполнения
bundle.generate() или в качестве самостоятельного шага,
когда Rollup сам выполняет генерацию и запись в одном вызове.
bundle.write(outputOptions)
Метод принимает объект outputOptions, который
соответствует типу OutputOptions и определяет, как именно
будет сформирован итоговый набор файлов: куда записывать, в каком
формате, с какими плагинами и настройками оптимизации.
Возвращаемое значение — Promise<RollupOutput>,
который резолвится после завершения записи всех файлов и ассетов на
диск.
write() и generate()Методы generate() и write() имеют общую
фазу подготовки бандла, но различаются финальным этапом:
generate() Формирует структуру выходного бандла в
памяти и возвращает объект с чанками и ассетами, не выполняя запись на
диск.
write() Выполняет ту же генерацию, но дополнительно
записывает результат в файловую систему.
Ключевое отличие заключается в том, что write() включает
слой emitFile → finalizeAssets →
fs.writeFile через внутренний пайплайн Rollup.
outputOptionsoutputOptions управляет всем процессом формирования
выходных файлов. Наиболее значимые поля:
dir — директория вывода для мульти-чанк сборкиfile — путь к единственному выходному файлу
(используется при single-file bundle)format — формат модуля (esm,
cjs, iife, umd,
system)sourcemap — генерация sourcemap (true,
false, 'inline')entryFileNames — шаблон имени входных чанковchunkFileNames — шаблон имени динамических чанковassetFileNames — шаблон имени ассетовplugins — output-плагиныglobals — внешние зависимости для IIFE/UMDПример базовой конфигурации:
await bundle.write({
dir: 'dist',
format: 'esm',
sourcemap: true,
entryFileNames: '[name]-[hash].js',
chunkFileNames: 'chunks/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash][extname]'
});
write()При вызове метода запускается последовательность этапов, отражающая финальную стадию сборки:
Rollup нормализует outputOptions, применяет дефолтные
значения и валидирует конфликтующие параметры (например, одновременное
использование file и dir в неподходящем
контексте).
Если ранее не был вызван generate(), Rollup выполняет
полный процесс построения графа модулей и генерации чанков.
На этапе генерации выходных данных активируются output-хуки плагинов:
renderStartrenderChunkgenerateBundlewriteBundleЭти хуки могут модифицировать код чанков или добавлять виртуальные ассеты.
Rollup определяет:
Файлы записываются через Node.js fs API:
writeFile для каждого чанка.map файл или инлайнитсяfile) и директориями
(dir)Метод write() строго различает два режима вывода.
fileИспользуется при генерации одного бандла:
await bundle.write({
file: 'dist/app.js',
format: 'iife'
});
Особенности:
dirИспользуется для code-splitting:
await bundle.write({
dir: 'dist',
format: 'esm'
});
Особенности:
import()bundle.write() полностью асинхронен и возвращает
Promise. Внутри используется последовательность асинхронных
операций:
writeBundleЭто позволяет использовать метод в CI/CD пайплайнах без блокировки основного потока Node.js.
При включённой генерации sourcemap Rollup формирует отдельные
.map файлы или инлайн-карты.
await bundle.write({
dir: 'dist',
format: 'esm',
sourcemap: true
});
Поведение:
renderChunkwrite()Плагины получают расширенный контроль над финальной стадией сборки.
generateBundleПозволяет модифицировать набор файлов до записи:
generateBundle(options, bundle) {
delete bundle['unused.js'];
}
writeBundleСрабатывает после записи всех файлов:
writeBundle(options, bundle) {
console.log('Сборка завершена');
}
Важно: на этом этапе файлы уже записаны, поэтому изменения не влияют на результат.
Ассеты обрабатываются отдельно от JS-чанков.
Типичные ассеты:
Процесс:
emitFileassetFileNamesfs.writeFilewrite()В режиме watch API метод write() может вызываться
многократно. При этом:
Это снижает стоимость повторной сборки в дев-среде.
write()file и
dirНедопустимо смешивать режимы вывода:
await bundle.write({
file: 'dist/app.js',
dir: 'dist'
});
Некоторые форматы ограничивают мульти-чанк поведение:
iife — только один файлumd — ограниченная поддержка split chunksПри записи в защищённые директории возникает ошибка
EACCES.
bundle.close()После завершения write() рекомендуется освобождать
ресурсы:
await bundle.write(options);
await bundle.close();
close():
Метод write() применяется в:
В таких сценариях важно учитывать детерминированность имен файлов и стабильность sourcemap.
Плагины могут полностью изменить итоговую структуру файлов:
Таким образом write() становится не просто операцией
записи, а финальной точкой трансформационного пайплайна сборки.