watch.skipWrite — это параметр конфигурации режима наблюдения Rollup,
который управляет тем, будет ли сборка записываться на диск при каждом
пересборе. Он влияет исключительно на поведение watch-режима и не
затрагивает сам процесс генерации бандла в памяти.
Режим наблюдения в Rollup предназначен для непрерывной пересборки
проекта при изменении исходных файлов. При стандартной работе происходит
следующий цикл:
- Инициализация сборки
- Построение графа модулей
- Генерация бандла
- Запись результата на диск
- Ожидание изменений файлов
- Повтор цикла при изменениях
Параметр watch.skipWrite вмешивается именно в четвёртый этап — запись
результата на диск.
Семантика watch.skipWrite
watch.skipWrite определяет, будет ли Rollup выполнять операцию записи
файлов (bundle write) в режиме watch.
При значении:
- false (по умолчанию) — каждый пересбор создаёт и
перезаписывает выходные файлы в файловой системе
- true — сборка выполняется полностью, но результат
остаётся только в памяти, без записи на диск
Ключевой момент: сборка не пропускается, пропускается только запись
результата.
Внутреннее поведение
при skipWrite: true
При включённом skipWrite процесс выглядит так:
- граф модулей строится полностью
- плагины выполняются в полном объёме до генерации бандла
- создаётся output bundle в памяти
- writeBundle и связанные операции записи не
выполняются
- файловая система не изменяется
Таким образом, skipWrite не является оптимизацией вычислений, это
исключительно контроль побочного эффекта записи.
Отличие от watch.skip
watch.skipWrite часто путают с watch.skip, однако это разные
механизмы.
watch.skip
- управляет пропуском пересборки
- позволяет игнорировать конкретные файлы или условия
- влияет на сам факт запуска сборки
watch.skipWrite
- не влияет на запуск сборки
- не влияет на построение графа модулей
- не влияет на генерацию output
- влияет только на запись результата на диск
Иными словами:
- watch.skip = «не собирать»
- watch.skipWrite = «собирать, но не сохранять»
Влияние на плагины и
lifecycle hooks
При включённом watch.skipWrite важно понимать, какие стадии Rollup
всё ещё выполняет.
Хуки, которые выполняются
- buildStart
- resolveId
- load
- transform
- moduleParsed
- generateBundle
- renderChunk
- closeBundle (частично зависит от реализации)
Хуки, связанные с записью
Хуки, которые зависят от факта записи файлов, могут не вызываться или
вести себя иначе:
- writeBundle — не выполняется, поскольку запись на диск
отключена
- любые плагины, завязанные на файловый output, не получают файловых
путей
Это критически важный аспект для плагинов, которые:
- пишут дополнительные файлы
- генерируют сопутствующие артефакты (sourcemaps, manifests)
- выполняют постобработку на уровне файловой системы
Практическое назначение
watch.skipWrite
Этот параметр используется в сценариях, где файловая запись не
требуется или нежелательна.
1. Интеграция с
внешними сборочными пайплайнами
Когда Rollup используется как внутренняя часть системы, которая:
- принимает bundle из памяти
- передаёт его в другой процесс
- обрабатывает результат без файлов
В таких случаях запись на диск становится избыточной.
2. Тестирование плагинов
При разработке плагинов часто важно:
- запускать сборку многократно
- проверять результат трансформации
- избегать загрязнения файловой системы
skipWrite позволяет ускорить цикл тестирования и избежать создания
артефактов.
3.
Использование с виртуальными файловыми системами
Некоторые инструменты подменяют файловую систему или работают
через:
- in-memory filesystem
- dev-server middleware
- custom output handlers
В таких сценариях запись Rollup на диск дублирует функциональность
внешнего слоя.
4. Dev-серверы и HMR-системы
При интеграции с dev-сервером:
- Rollup генерирует бандл
- сервер принимает результат напрямую
- клиент получает обновление через WebSocket или HMR
Запись файлов не требуется, так как итоговый артефакт не используется
как физический файл.
Поведение
sourcemap и дополнительных артефактов
Даже при watch.skipWrite:
- sourcemap генерируются в памяти
- они доступны через объект bundle
- могут передаваться в плагины через generateBundle
Однако физические .map файлы не создаются.
Если логика проекта зависит от файлов sourcemap на диске, skipWrite
делает такое поведение невозможным без дополнительной обработки.
Особенности повторных
пересборок
В watch-режиме Rollup кэширует результаты предыдущих сборок. При
включённом skipWrite:
- кэш продолжает использоваться
- пересборки происходят быстрее за счёт отсутствия IO
- но разница может быть менее заметной, если основной вес в
трансформациях
Важно учитывать, что skipWrite не уменьшает количество пересборок, он
лишь устраняет запись результата.
Ограничения и
потенциальные побочные эффекты
Использование watch.skipWrite может приводить к неочевидным
последствиям:
- плагины, ожидающие файлов на диске, перестают работать
корректно
- инструменты постобработки не получают входные артефакты
- CI-пайплайны, завязанные на файловый output, ломаются
- отладка результата через файловую систему становится
невозможной
При этом сам Rollup продолжает считать сборку успешной, что может
вводить в заблуждение относительно фактического состояния output.
Взаимодействие с writeBundle
writeBundle — один из ключевых hooks, который обычно используется для
работы с финальными файлами. При watch.skipWrite:
- writeBundle не вызывается
- любые операции записи через плагинный API становятся недоступны
- логика, завязанная на asset emission на диск, теряет точку
входа
Это делает skipWrite фактически режимом «headless build», где
результат существует только как объект в памяти.
Рекомендованные сценарии
использования
Наиболее устойчивые применения watch.skipWrite связаны с
архитектурами, где Rollup выступает как:
- генератор модульного графа без файлового вывода
- вычислительный этап внутри более крупной системы
- источник данных для runtime-сборки
В классических проектах с файловым output использование skipWrite
обычно ограничивается тестами и экспериментами с конфигурацией.