Режим наблюдения в Rollup основан на отслеживании изменений файлов
графа зависимостей и повторной сборке бандла при модификациях исходного
кода. Внутри этого механизма ключевую роль играют хук-события
watchChange и closeWatcher, которые относятся
к жизненному циклу watcher-инстанса и позволяют интегрировать
пользовательскую логику в процесс наблюдения за файловой системой.
Эти хуки не влияют напрямую на трансформацию модулей или генерацию кода, но управляют поведением процесса наблюдения, его реакцией на изменения и корректным завершением работы watcher-а.
Режим rollup --watch или программный API
rollup.watch() создаёт специализированный watcher-инстанс,
который:
Внутри этого процесса существует отдельный слой событий, отличающийся
от стандартных плагин-хуков (buildStart,
resolveId, load, transform и
др.). Этот слой обслуживает именно поведение наблюдателя.
watchChange вызывается при любом изменении файла,
который отслеживается watcher-ом. Это может быть:
Хук предназначен для реакции на события уровня файловой системы до начала новой сборки.
Хук имеет следующую форму:
watchChange(id, change)
Где:
id — абсолютный путь к изменённому модулю;change — объект, описывающий тип изменения.Пример структуры change:
{
event: 'create' | 'update' | 'delete'
}
watchChange вызывается:
Это делает хук ранней точкой вмешательства в реакцию системы на изменения.
Плагин может определить watchChange следующим
образом:
export default function myPlugin() {
return {
watchChange(id, { event }) {
if (event === 'delete') {
// логика реакции на удаление файла
}
}
};
}
Важно, что watchChange не предназначен для модификации
кода или остановки сборки. Его основная роль — побочные эффекты:
логирование, синхронизация, очистка внешних ресурсов.
Используется для диагностики процессов сборки:
watchChange(id, { event }) {
console.log(`[watch] ${event}: ${id}`);
}
При наличии внешних систем кэширования можно синхронизировать их с изменениями:
watchChange(id, { event }) {
if (event === 'update') {
externalCache.invalidate(id);
}
}
При разработке dev-серверов на базе Rollup можно использовать этот хук для уведомления UI:
watchChange(id, { event }) {
websocket.send(JSON.stringify({ type: 'file-change', id, event }));
}
closeWatcher вызывается при завершении работы
watcher-инстанса. Он используется для корректного освобождения ресурсов,
связанных с наблюдением за файловой системой.
Основные задачи:
closeWatcher()
Хук не принимает аргументов и не возвращает значимого результата.
closeWatcher вызывается:
rollup --watch;watcher.close() из API;Он является финальной точкой жизненного цикла watcher-а.
Плагин может зарегистрировать обработчик:
export default function myPlugin() {
return {
closeWatcher() {
cleanupTemporaryFiles();
closeDatabaseConnections();
}
};
}
Хук вызывается при корректном завершении watcher-а, но не гарантируется при аварийном завершении процесса (например, SIGKILL).
В большинстве реализаций обработка выполняется синхронно или в режиме, не блокирующем критический shutdown-поток.
Хук вызывается единожды для каждого watcher-инстанса.
Оба хука относятся к жизненному циклу наблюдения, но находятся в разных фазах:
watchChange — активная фаза наблюдения;closeWatcher — фаза завершения и очистки.Типичный цикл выглядит следующим образом:
watchChange;closeWatcher.Rollup использует абстракцию поверх файловой системы (обычно
chokidar или аналог), которая:
watchChange вызывается после нормализации этих
событий.
После watchChange Rollup определяет, какие модули:
Таким образом, watchChange находится до фазы graph
invalidation.
При вызове closeWatcher происходит:
closeWatcher во всех плагинах.Использование watchChange и closeWatcher
позволяет выстраивать плагины с учётом жизненного цикла разработки:
Эти хуки особенно важны в сложных сборочных системах, где Rollup выступает частью более широкой инфраструктуры разработки.