Rollup — система сборки, в которой режим наблюдения реализуется через
встроенный механизм отслеживания файловой системы и опцию конфигурации
watch. Этот режим используется для инкрементальной
пересборки бандла при изменениях исходного кода, что особенно важно в
процессе разработки библиотек и приложений с быстрым циклом обратной
связи.
Поле watch в конфигурации Rollup определяет параметры
поведения режима наблюдения. Оно не влияет на одиночную сборку и
активируется только при запуске Rollup с флагом --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 задаёт шаблоны файлов, которые должны
отслеживаться.
watch: {
include: ['src/**', 'shared/**']
}
Поддерживаются glob-выражения. Это позволяет ограничивать область наблюдения только важными частями проекта.
exclude исключает файлы из наблюдения:
watch: {
exclude: ['node_modules/**', 'dist/**']
}
Часто используется для предотвращения лишних пересборок и снижения нагрузки на файловую систему.
Rollup использует библиотеку наблюдения файловой системы, основанную
на Chokidar. Поведение watcher можно настроить через параметр
chokidar:
watch: {
chokidar: {
usePolling: false,
interval: 100
}
}
Основные настройки:
usePolling — включает опрос файловой системы вместо
событийinterval — интервал опроса в миллисекундахPolling используется в средах, где native file system events работают нестабильно (например, Docker или виртуальные файловые системы).
Параметр buildDelay задаёт задержку перед запуском
пересборки после изменения файлов.
watch: {
buildDelay: 200
}
Это позволяет сгруппировать несколько быстрых изменений в одну сборку, снижая нагрузку.
skipWrite управляет записью выходных файлов на диск:
watch: {
skipWrite: true
}
При true Rollup выполняет сборку в памяти, не записывая
результат в файловую систему. Это полезно в связке с кастомными
плагинами или dev-серверами, которые сами обрабатывают output.
Параметр clearScreen контролирует очистку консоли перед
каждой пересборкой:
watch: {
clearScreen: false
}
При false история логов сохраняется, что удобно при
отладке.
При запуске в режиме наблюдения происходит несколько этапов:
Главное отличие от полного пересборочного цикла — использование уже построенного графа модулей, что значительно ускоряет процесс.
Rollup не пересобирает весь проект при каждом изменении. Вместо этого:
Это особенно эффективно в проектах с большим количеством модулей и сложной структурой импортов.
При ошибке сборки в watch-режиме процесс не завершается. Вместо этого:
Это позволяет исправлять ошибки без перезапуска процесса.
В монорепозиториях watch часто настраивается на
несколько пакетов одновременно:
watch: {
include: [
'packages/**/src/**',
'shared/**'
],
exclude: [
'node_modules/**',
'packages/**/dist/**'
]
}
Такой подход позволяет отслеживать изменения между пакетами без необходимости ручной пересборки зависимых модулей.
Многие плагины Rollup реагируют на watch-режим:
Некоторые плагины могут добавлять собственные файлы в наблюдение
через this.addWatchFile, расширяя область отслеживания.
На производительность влияют:
Типичные оптимизации:
node_modulesinclude только исходным кодомРаспространённые проблемы:
Слишком широкое include
include: '**/*'
Приводит к отслеживанию системных и временных файлов.
Отсутствие exclude для output
exclude: []
Вызывает бесконечные пересборки при изменении dist.
Использование polling без необходимости
Увеличивает нагрузку CPU без выигрыша в стабильности.
Watch-режим часто используется совместно с dev-серверами. В таком случае Rollup выполняет только сборку, а обновление браузера реализуется внешними инструментами (например, через WebSocket-серверы или middleware).
В таких сценариях skipWrite: true становится стандартной
настройкой, позволяя полностью перенести управление выходными файлами в
память.
Watch-режим не предназначен для:
Его роль ограничивается интерактивной разработкой, где важна минимальная задержка между изменением кода и пересборкой результата.