Поле watch в конфигурации

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

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

Ключевая задача watch заключается в управлении:

  • набором отслеживаемых файлов
  • исключениями из наблюдения
  • поведением пересборки
  • оптимизацией производительности файлового наблюдателя

Базовая структура конфигурации watch

Конфигурация watch задаётся как объект внутри rollup.config.js:

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'esm'
  },
  watch: {
    include: 'src/**',
    exclude: 'node_modules/**'
  }
};

При такой конфигурации отслеживаются только файлы внутри src, а любые изменения в node_modules игнорируются.

Активация режима наблюдения

Само поле watch не запускает наблюдение. Оно работает только вместе с CLI-флагом:

rollup -c --watch

или

rollup -c -w

После запуска процесс остаётся активным, и сборка выполняется повторно при изменениях файлов, соответствующих правилам watch.

Параметры include и exclude

include

include задаёт шаблоны файлов, которые должны отслеживаться.

watch: {
  include: ['src/**', 'shared/**']
}

Поддерживаются glob-выражения. Это позволяет ограничивать область наблюдения только важными частями проекта.

exclude

exclude исключает файлы из наблюдения:

watch: {
  exclude: ['node_modules/**', 'dist/**']
}

Часто используется для предотвращения лишних пересборок и снижения нагрузки на файловую систему.

Параметр chokidar

Rollup использует библиотеку наблюдения файловой системы, основанную на Chokidar. Поведение watcher можно настроить через параметр chokidar:

watch: {
  chokidar: {
    usePolling: false,
    interval: 100
  }
}

Основные настройки:

  • usePolling — включает опрос файловой системы вместо событий
  • interval — интервал опроса в миллисекундах

Polling используется в средах, где native file system events работают нестабильно (например, Docker или виртуальные файловые системы).

buildDelay

Параметр buildDelay задаёт задержку перед запуском пересборки после изменения файлов.

watch: {
  buildDelay: 200
}

Это позволяет сгруппировать несколько быстрых изменений в одну сборку, снижая нагрузку.

skipWrite

skipWrite управляет записью выходных файлов на диск:

watch: {
  skipWrite: true
}

При true Rollup выполняет сборку в памяти, не записывая результат в файловую систему. Это полезно в связке с кастомными плагинами или dev-серверами, которые сами обрабатывают output.

clearScreen

Параметр clearScreen контролирует очистку консоли перед каждой пересборкой:

watch: {
  clearScreen: false
}

При false история логов сохраняется, что удобно при отладке.

Механизм работы watch внутри Rollup

При запуске в режиме наблюдения происходит несколько этапов:

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

Главное отличие от полного пересборочного цикла — использование уже построенного графа модулей, что значительно ускоряет процесс.

Инкрементальная природа пересборки

Rollup не пересобирает весь проект при каждом изменении. Вместо этого:

  • анализирует изменённый модуль
  • обновляет зависимости вверх по графу
  • пересчитывает только затронутые части бандла

Это особенно эффективно в проектах с большим количеством модулей и сложной структурой импортов.

Поведение при ошибках

При ошибке сборки в watch-режиме процесс не завершается. Вместо этого:

  • ошибка выводится в консоль
  • watcher продолжает работать
  • при следующем изменении выполняется новая попытка сборки

Это позволяет исправлять ошибки без перезапуска процесса.

Watch в монорепозиториях

В монорепозиториях watch часто настраивается на несколько пакетов одновременно:

watch: {
  include: [
    'packages/**/src/**',
    'shared/**'
  ],
  exclude: [
    'node_modules/**',
    'packages/**/dist/**'
  ]
}

Такой подход позволяет отслеживать изменения между пакетами без необходимости ручной пересборки зависимых модулей.

Взаимодействие с плагинами

Многие плагины Rollup реагируют на watch-режим:

  • плагины трансформации пересчитывают только изменённые модули
  • плагины генерации ассетов обновляют только затронутые ресурсы
  • плагины кеширования используют инкрементальные данные графа

Некоторые плагины могут добавлять собственные файлы в наблюдение через this.addWatchFile, расширяя область отслеживания.

Производительность watch-режима

На производительность влияют:

  • количество отслеживаемых файлов
  • глубина графа зависимостей
  • использование polling вместо событий
  • количество активных плагинов

Типичные оптимизации:

  • исключение node_modules
  • ограничение include только исходным кодом
  • отключение polling при стабильной среде
  • уменьшение buildDelay при необходимости низкой задержки

Типичные ошибки конфигурации

Распространённые проблемы:

Слишком широкое include

include: '**/*'

Приводит к отслеживанию системных и временных файлов.

Отсутствие exclude для output

exclude: []

Вызывает бесконечные пересборки при изменении dist.

Использование polling без необходимости

Увеличивает нагрузку CPU без выигрыша в стабильности.

Связь watch с CLI и режимом разработки

Watch-режим часто используется совместно с dev-серверами. В таком случае Rollup выполняет только сборку, а обновление браузера реализуется внешними инструментами (например, через WebSocket-серверы или middleware).

В таких сценариях skipWrite: true становится стандартной настройкой, позволяя полностью перенести управление выходными файлами в память.

Границы применения watch

Watch-режим не предназначен для:

  • production-сборок
  • одноразовой компиляции
  • CI/CD пайплайнов

Его роль ограничивается интерактивной разработкой, где важна минимальная задержка между изменением кода и пересборкой результата.