Режим наблюдения в Rollup предназначен для автоматической пересборки бандла при изменении исходных файлов. Он превращает одноразовую сборку в непрерывный процесс, в котором сборщик отслеживает файловую систему, реагирует на изменения модулей и пересобирает только затронутые части графа зависимостей.
Основой механизма выступает отслеживание зависимостей, построенных во время первичного запуска сборки. Rollup анализирует импортируемые модули, формирует граф и далее использует его как основу для инкрементальной пересборки.
Самый простой способ включить режим наблюдения — использовать флаг
--watch в CLI:
rollup -c --watch
или при явном указании входного файла:
rollup src/index.js -o dist/bundle.js --format esm --watch
После запуска процесс не завершается, а продолжает работать, ожидая изменений в файловой системе.
При изменении любого файла из графа зависимостей Rollup автоматически инициирует пересборку и выводит обновлённый бандл.
После активации watch-режима Rollup выполняет следующие шаги:
Выполняется первоначальная сборка.
Строится граф зависимостей.
Активируется наблюдение за файлами.
При изменении файла:
В простых проектах пересборка может быть полной, однако в более сложных графах Rollup старается минимизировать переработку.
Watch-режим может быть задан через конфигурационный файл
rollup.config.js.
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
watch: {
include: 'src/**',
exclude: 'node_modules/**',
clearScreen: true
}
};
include / exclude
Позволяют ограничить набор файлов, за которыми ведётся наблюдение.
include — явно указывает, какие файлы отслеживатьexclude — исключает ненужные директорииwatch: {
include: 'src/**',
exclude: 'src/**/*.test.js'
}
clearScreen
Определяет, очищать ли консоль при каждой пересборке.
watch: {
clearScreen: false
}
При false история сборок сохраняется, что удобно для
анализа логов.
Rollup не пересобирает проект «с нуля» в большинстве случаев. Вместо этого он:
Это особенно важно для крупных приложений, где полная пересборка может занимать значительное время.
Помимо CLI и конфигурации, watch-режим можно запустить через программный API:
import { watch } from 'rollup';
const watcher = watch({
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
}
});
Watcher возвращает объект, позволяющий управлять процессом сборки.
Watcher генерирует события жизненного цикла сборки:
watcher.on('event', event => {
if (event.code === 'START') {
// началась сборка
}
if (event.code === 'BUNDLE_END') {
// сборка завершена
}
if (event.code === 'ERROR') {
// ошибка сборки
}
});
Основные типы событий:
START — запуск новой сборкиBUNDLE_START — начало формирования бандлаBUNDLE_END — завершение сборкиEND — завершение циклаERROR — ошибка во время сборкиПри серии быстрых изменений файлов Rollup применяет механизм debounce:
Это снижает нагрузку на CPU и файловую систему.
Плагины Rollup могут участвовать в процессе наблюдения через хуки:
buildStartloadtransformwatchChangeХук watchChange особенно важен, так как позволяет
реагировать на изменения файлов вручную:
export default function myPlugin() {
return {
name: 'my-plugin',
watchChange(id) {
// обработка изменения файла
}
};
}
Некоторые плагины могут добавлять дополнительные файлы в список отслеживания, например при генерации виртуальных модулей.
Watch-режим имеет ряд архитектурных ограничений:
Rollup не отслеживает изменения в runtime-данных. Изменения должны происходить на уровне файлов.
Пересборка выполняется последовательно, без полноценного параллелизма между чанками.
Некоторые плагины могут нарушать инкрементальность, если:
В больших проектах watch-режим требует дополнительной настройки:
watch: {
include: 'packages/app/src/**',
exclude: 'packages/**/node_modules/**'
}
export default [
{
input: 'src/main.js',
output: { file: 'dist/app.js', format: 'esm' }
},
{
input: 'src/admin.js',
output: { file: 'dist/admin.js', format: 'esm' }
}
];
Каждая конфигурация может иметь собственный watch-процесс.
Watcher можно интегрировать в сервер разработки:
import { watch } from 'rollup';
const watcher = watch(config);
watcher.on('event', event => {
if (event.code === 'BUNDLE_END') {
console.log('Пересборка завершена');
}
});
Типичный сценарий — запуск dev-сервера, который перезагружает приложение после завершения сборки.
Производительность зависит от нескольких факторов:
Оптимизации:
node_modules;transform.Watch-режим применяется в следующих ситуациях:
При изменении зависимого модуля Rollup поднимает пересборку вверх по графу:
Это поведение делает watch-режим эффективным даже при сложных цепочках импортов.
При возникновении ошибки сборки:
watcher.on('event', event => {
if (event.code === 'ERROR') {
console.error(event.error);
}
});
Watcher может быть перезапущен программно:
watcher.close();
После закрытия процесса необходимо заново вызвать
watch().
Watch-режим часто применяется вместе с source map:
output: {
file: 'dist/bundle.js',
format: 'esm',
sourcemap: true
}
Это позволяет отслеживать изменения в исходных файлах напрямую в браузере или отладчике при каждой пересборке.
Rollup использует внутренний кэш для ускорения повторных сборок:
При необходимости кэш может быть сброшен, что приводит к полной пересборке при следующем цикле.