Режим наблюдения (watch mode) — механизм автоматического
отслеживания изменений файлов проекта с последующей повторной сборкой.
После запуска Webpack не завершает процесс, а остаётся активным и следит
за изменениями зависимостей.
Простейший запуск:
webpack --watch
Альтернативный вариант через конфигурацию:
module.exports = {
mode: 'development',
watch: true
};
После изменения любого подключённого модуля Webpack выполняет повторную компиляцию и обновляет файлы в каталоге сборки.
Пример вывода:
asset bundle.js 210 KiB
cached modules 180 KiB
webpack compiled successfully in 430 ms
Ключевая особенность watch mode — отсутствие
HTTP-сервера. Webpack только пересобирает проект, но не обслуживает его
в браузере.
Во время первой сборки Webpack формирует граф зависимостей:
index.js
├── app.js
├── styles.css
└── utils.js
После этого система отслеживает изменения файлов:
При изменении файла происходит:
Если проект использует:
output: {
path: path.resolve(__dirname, 'dist')
}
то после каждой пересборки обновляется содержимое директории
dist.
watch не запускает веб-сервер:
Нет:
- localhost
- live reload
- HMR
- автоматического обновления браузера
Для просмотра изменений требуется отдельный сервер:
npx serve dist
или:
php -S localhost:3000
В режиме watch результат сборки физически
сохраняется:
dist/
├── bundle.js
└── styles.css
Это важно для:
watch mode не создаёт:
Из-за этого режим:
watchOptionsWebpack позволяет гибко управлять механизмом наблюдения.
Пример:
module.exports = {
watch: true,
watchOptions: {
aggregateTimeout: 300,
poll: 1000,
ignored: /node_modules/
}
};
aggregateTimeoutЗадержка перед пересборкой.
aggregateTimeout: 300
Если файл изменяется несколько раз подряд, Webpack подождёт указанное время и выполнит одну сборку вместо нескольких.
pollВключает polling-режим.
poll: 1000
Webpack будет проверять изменения раз в секунду.
Используется:
ignoredИсключение директорий:
ignored: /node_modules/
Позволяет уменьшить нагрузку на файловую систему.
webpack-dev-server — отдельный пакет, создающий
полноценную среду разработки.
Установка:
npm install webpack-dev-server --save-dev
Запуск:
npx webpack serve
или:
{
"scripts": {
"dev": "webpack serve"
}
}
webpack-dev-server объединяет несколько механизмов:
Фактически это надстройка над обычным watch mode.
Во время запуска создаётся:
Browser
↕ WebSocket
Dev Server
↕
Webpack Compiler
Процесс работы:
Файлы сохраняются:
dist/bundle.js
По умолчанию сборка хранится в памяти:
Memory FS
Физического файла может вообще не существовать.
Это ускоряет работу, поскольку отсутствуют операции записи на диск.
webpack --watch
После сборки:
dist/
└── bundle.js
Файл реально существует.
webpack serve
В браузере bundle работает, но файл может отсутствовать:
dist/
└── (пусто)
Потому что используется виртуальная файловая система.
Цепочка работы:
Изменение файла
↓
Пересборка
↓
Запись на диск
↓
Обновление вручную
Цепочка:
Изменение файла
↓
Пересборка в памяти
↓
WebSocket уведомление
↓
Автообновление браузера
Из-за отсутствия дисковых операций dev server обычно быстрее.
Не поддерживает автоматическое обновление браузера.
После изменения кода требуется:
F5
Поддерживает Live Reload автоматически.
Пример:
module.exports = {
devServer: {
liveReload: true
}
};
При изменении файла браузер автоматически перезагружается.
HMR отсутствует полностью.
Изменение файла требует:
полной пересборки
+ полной перезагрузки страницы
Поддерживает HMR.
Пример:
module.exports = {
devServer: {
hot: true
}
};
Изменяется только конкретный модуль:
styles.css
без полной перезагрузки страницы.
При изменении модуля:
Button.js
Webpack:
Это существенно ускоряет разработку крупных SPA.
Не предоставляет сервер.
Для запуска проекта необходим отдельный инструмент:
Содержит встроенный HTTP-сервер.
По умолчанию:
http://localhost:8080
Proxy отсутствует.
Имеется встроенный proxy middleware.
Пример:
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:3001'
}
}
}
};
Запрос:
/api/users
будет проксирован на backend.
Это особенно важно для:
Не умеет обрабатывать SPA-маршруты.
Поддерживает fallback:
module.exports = {
devServer: {
historyApiFallback: true
}
};
Маршрут:
/profile/settings
будет перенаправлен на:
index.html
Не предоставляет middleware API.
Работает поверх Express middleware.
Поддерживаются:
Пример:
module.exports = {
devServer: {
setupMiddlewares: (middlewares, devServer) => {
devServer.app.get('/ping', (req, res) => {
res.json({ status: 'ok' });
});
return middlewares;
}
}
};
Особенно для:
Причина проста:
backend ожидает реальные файлы
Например:
<script src="/dist/bundle.js"></script>
Backend читает файл из файловой системы.
Особенно для:
Обычно:
Дополнительно запускает:
Потребление ресурсов выше.
| Возможность | Watch Mode | Dev Server |
|---|---|---|
| Автоматическая пересборка | Да | Да |
| HTTP-сервер | Нет | Да |
| Live Reload | Нет | Да |
| HMR | Нет | Да |
| Proxy | Нет | Да |
| History API Fallback | Нет | Да |
| Запись файлов на диск | Да | Обычно нет |
| WebSocket | Нет | Да |
| Middleware | Нет | Да |
| Скорость обновления | Ниже | Выше |
| Подходит для backend | Да | Частично |
| Подходит для SPA | Ограниченно | Отлично |
Например:
Backend работает с физическими файлами:
/dist/app.js
Node.js-серверу нужны реальные assets:
fs.readFileSync()
Когда не нужны:
watch mode ближе к реальной production-сборке,
поскольку:
React/Vue/Angular-проекты получают:
Изменение:
.button {
color: red;
}
мгновенно появляется в браузере без полной перезагрузки страницы.
Frontend запускается отдельно:
localhost:8080
Backend:
localhost:3000
API связывается через proxy.
Иногда используются оба варианта одновременно.
Пример:
{
"scripts": {
"watch": "webpack --watch",
"dev": "webpack serve"
}
}
npm run watch
npm run dev
Ошибка:
webpack --watch
не поддерживает hot reload.
При использовании:
webpack serve
файлы могут отсутствовать физически.
Backend пытается читать:
dist/bundle.js
но dev server хранит сборку в памяти.
devMiddleware.writeToDiskDev server умеет записывать файлы на диск.
Пример:
module.exports = {
devServer: {
devMiddleware: {
writeToDisk: true
}
}
};
Теперь:
dist.Это полезно для интеграции frontend и backend.
Основа:
Webpack Compiler
Основа:
Webpack Compiler
+ Dev Middleware
+ Express Server
+ WebSocket Server
+ HMR Runtime
По сути, webpack-dev-server — полноценная платформа
разработки поверх обычного compiler API Webpack.