Поле watch управляет поведением Rollup в режиме
наблюдения. Этот режим позволяет автоматически пересобирать проект при
изменении файлов исходного кода, конфигурации, шаблонов, ресурсов и
других зависимостей. На практике watch используется во
время разработки, когда необходимо мгновенно получать обновлённую сборку
без ручного запуска команды.
Режим наблюдения активируется через CLI:
rollup -c -w
или:
rollup --config --watch
После запуска Rollup отслеживает изменения файловой системы и инициирует повторную сборку при каждом изменении зависимостей.
Базовая конфигурация:
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
watch: {
clearScreen: false
}
};
После запуска Rollup выполняет несколько этапов:
Rollup отслеживает:
this.addWatchFile().При изменении хотя бы одного отслеживаемого ресурса начинается повторная сборка.
watchПоле watch представляет собой объект с параметрами
режима наблюдения:
watch: {
clearScreen: true,
include: 'src/**',
exclude: 'node_modules/**'
}
Наиболее важные свойства:
| Поле | Назначение |
|---|---|
clearScreen |
Очистка терминала перед сборкой |
include |
Маска отслеживаемых файлов |
exclude |
Исключение файлов из наблюдения |
buildDelay |
Задержка перед пересборкой |
skipWrite |
Отключение записи файлов |
chokidar |
Настройки файлового наблюдателя |
clearScreenПо умолчанию Rollup очищает терминал перед каждой новой сборкой. Это позволяет отображать только актуальные сообщения.
Стандартное поведение:
watch: {
clearScreen: true
}
Отключение очистки:
watch: {
clearScreen: false
}
Полезно в случаях:
includeСвойство include определяет, какие файлы должны
участвовать в наблюдении.
Пример:
watch: {
include: 'src/**'
}
Rollup будет реагировать только на изменения внутри каталога
src.
Допустимы массивы:
watch: {
include: [
'src/**',
'templates/**'
]
}
include поддерживает glob-шаблоны.
Примеры:
watch: {
include: '**/*.js'
}
watch: {
include: 'src/**/*.ts'
}
watch: {
include: [
'src/**/*.js',
'src/**/*.vue'
]
}
Ограничение списка наблюдаемых файлов уменьшает нагрузку на файловую систему и ускоряет работу режима разработки.
Особенно важно:
excludeСвойство exclude позволяет исключить файлы и
каталоги.
Пример:
watch: {
exclude: 'node_modules/**'
}
Исключение нескольких каталогов:
watch: {
exclude: [
'node_modules/**',
'dist/**',
'coverage/**'
]
}
Наиболее часто исключаются:
| Каталог | Причина |
|---|---|
node_modules |
Огромное количество файлов |
dist |
Исключение циклических пересборок |
coverage |
Временные файлы тестов |
.git |
Системные данные Git |
tmp |
Временные артефакты |
Очень важно исключать директорию вывода:
watch: {
exclude: 'dist/**'
}
Без этого возможна ситуация:
buildDelaybuildDelay задаёт задержку перед запуском новой
сборки.
Пример:
watch: {
buildDelay: 100
}
Значение указывается в миллисекундах.
Некоторые редакторы сохраняют файлы в несколько этапов:
Без задержки Rollup может запускать несколько пересборок подряд.
buildDelay сглаживает подобные ситуации.
Задержка полезна при использовании:
Пример:
watch: {
buildDelay: 300
}
skipWriteskipWrite запрещает Rollup записывать результат на
диск.
Пример:
watch: {
skipWrite: true
}
В этом режиме:
skipWriteЧаще всего:
Пример:
import { watch } from 'rollup';
const watcher = watch({
input: 'src/main.js',
output: {
dir: 'dist',
format: 'esm'
},
watch: {
skipWrite: true
}
});
chokidarRollup использует библиотеку Chokidar для отслеживания изменений файлов.
Поле chokidar позволяет передавать параметры напрямую
наблюдателю.
Пример:
watch: {
chokidar: {
usePolling: true
}
}
В некоторых окружениях стандартное отслеживание работает нестабильно:
В таких случаях используется polling.
watch: {
chokidar: {
usePolling: true,
interval: 100
}
}
Rollup начинает периодически опрашивать файловую систему.
Недостатки:
Преимущество — стабильность.
Настройка interval задаёт частоту проверки файлов:
watch: {
chokidar: {
interval: 300
}
}
Чем меньше интервал:
Чем больше интервал:
watchRollup предоставляет программный API для режима наблюдения.
Пример:
import { watch } from 'rollup';
const watcher = watch({
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
}
});
Watcher поддерживает события:
watcher.on('event', event => {
console.log(event);
});
Начало работы watcher.
{
code: 'START'
}
Начало сборки.
{
code: 'BUNDLE_START',
input: ['src/main.js'],
output: ['dist/bundle.js']
}
Успешное завершение сборки.
{
code: 'BUNDLE_END',
duration: 245
}
Ошибка сборки.
{
code: 'ERROR',
error: Error
}
Завершение текущего цикла.
{
code: 'END'
}
addWatchFileПлагины могут вручную добавлять файлы в список наблюдения.
Пример:
export default function myPlugin() {
return {
name: 'my-plugin',
buildStart() {
this.addWatchFile('templates/config.json');
}
};
}
При изменении config.json Rollup инициирует новую
сборку.
addWatchFile часто используется для:
При каждой пересборке многие хуки вызываются повторно:
| Hook | Повторный вызов |
|---|---|
buildStart |
Да |
resolveId |
Да |
load |
Да |
transform |
Да |
generateBundle |
Да |
Некоторые хуки могут вызываться значительно чаще при активной разработке.
Rollup сохраняет внутренний граф модулей и кэширует результаты трансформаций.
Это ускоряет повторные сборки.
Плагины также могут использовать кэш:
buildStart() {
const cache = this.cache.get('key');
if (!cache) {
this.cache.set('key', data);
}
}
При изменении файла Rollup:
Rollup старается минимизировать объём повторной работы.
На скорость влияют:
watch: {
exclude: [
'node_modules/**',
'dist/**'
]
}
watch: {
include: 'src/**'
}
Во время разработки часто отключают Terser:
plugins: process.env.NODE_ENV === 'production'
? [terser()]
: []
Обычно создаются две конфигурации:
Пример:
const isDev = process.env.NODE_ENV === 'development';
export default {
watch: isDev
? {
clearScreen: false
}
: undefined
};
Watch-режим:
HMR:
Rollup watch часто используется вместе с:
В больших проектах возможно создание нескольких watcher.
Пример:
import { watch } from 'rollup';
const jsWatcher = watch(jsConfig);
const cssWatcher = watch(cssConfig);
Отдельные watcher могут обслуживать:
| Watcher | Назначение |
|---|---|
| JS | Javascript |
| CSS | Стили |
| SSR | Серверная сборка |
| Legacy | Старые браузеры |
| Types | Генерация типов |
Причина:
src.Иногда watcher не видит изменения:
Решение:
watch: {
chokidar: {
usePolling: true
}
}
Причины:
export default {
input: 'src/main.js',
output: {
dir: 'dist',
format: 'esm',
sourcemap: true
},
watch: {
clearScreen: false,
include: 'src/**',
exclude: [
'node_modules/**',
'dist/**'
],
buildDelay: 100,
chokidar: {
usePolling: false
}
}
};
Такая конфигурация обеспечивает: