watch.skipWrite

watch.skipWrite — это параметр конфигурации режима наблюдения Rollup, который управляет тем, будет ли сборка записываться на диск при каждом пересборе. Он влияет исключительно на поведение watch-режима и не затрагивает сам процесс генерации бандла в памяти.

Режим наблюдения в Rollup предназначен для непрерывной пересборки проекта при изменении исходных файлов. При стандартной работе происходит следующий цикл:

  1. Инициализация сборки
  2. Построение графа модулей
  3. Генерация бандла
  4. Запись результата на диск
  5. Ожидание изменений файлов
  6. Повтор цикла при изменениях

Параметр 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 обычно ограничивается тестами и экспериментами с конфигурацией.