В процессе разработки фронтенд-приложений часто требуется одновременно выполнять две задачи: отслеживать изменения исходного кода и мгновенно обновлять результат в браузере через локальный сервер. В esbuild эти возможности реализуются через два механизма — наблюдение за файлами (watch) и встроенный HTTP-сервер (serve). Их совместное использование формирует минималистичную, но высокопроизводительную среду разработки без внешних инструментов сборки.
Режим наблюдения отвечает за автоматический запуск повторной сборки при изменении исходных файлов. В основе лежит файловый watcher, который отслеживает зависимости графа модулей.
При активации watch:
Ключевая особенность — отсутствие постоянного пересоздания процесса сборки. esbuild сохраняет внутреннее состояние, что ускоряет последующие итерации.
import * as esbuild from "esbuild";
await esbuild.build({
entryPoints: ["src/index.js"],
outfile: "dist/bundle.js",
bundle: true,
watch: {
onRebuild(error, result) {
if (error) {
console.error("Ошибка пересборки:", error);
} else {
console.log("Пересборка завершена");
}
}
}
});
Механизм serve предоставляет минимальный HTTP-сервер, предназначенный для разработки. Он не является полноценным production-сервером и используется исключительно для локальной раздачи собранных файлов.
Serve чаще всего используется вместе с watch, чтобы обеспечить автоматическое обновление файлов в браузере.
Совместное использование этих режимов позволяет организовать непрерывный цикл разработки:
Важно понимать, что esbuild не выполняет автоматическую перезагрузку браузера. Обновление страницы остаётся задачей внешнего инструмента (например, livereload-сервера или расширений).
В CLI оба режима активируются одновременно:
esbuild src/index.js \
--bundle \
--outfile=dist/bundle.js \
--serve=8000 \
--watch
Более гибкий контроль достигается через API:
import * as esbuild from "esbuild";
const ctx = await esbuild.context({
entryPoints: ["src/index.js"],
outfile: "dist/bundle.js",
bundle: true
});
await ctx.watch();
await ctx.serve({
port: 8000,
servedir: "dist"
});
Новые версии esbuild используют контекстную модель:
context() создаёт изолированную среду сборки;watch() активирует наблюдение;serve() запускает сервер поверх контекста.Контекст позволяет повторно использовать граф зависимостей между пересборками, уменьшая накладные расходы.
Механизм onRebuild используется для реакции на каждую
пересборку.
watch: {
onRebuild(error, result) {
if (error) {
console.error("Ошибка:", error);
return;
}
console.log("Сборка обновлена");
}
}
Важно учитывать, что onRebuild вызывается только при
изменениях, а не при первой сборке.
Esbuild оптимизирует повторные сборки за счёт инкрементального анализа:
Контекст (context) усиливает этот механизм,
позволяя:
Esbuild не предоставляет hot module replacement. Пересборка обновляет файлы, но не управляет состоянием приложения в браузере.
Встроенный сервер:
При большом количестве файлов возможны ограничения производительности файловых watcher’ов на уровне операционной системы, особенно при глубокой структуре зависимостей.
Комбинация watch и serve формирует цикл:
Такая модель минимизирует задержки между изменением кода и его отражением в браузере, сохраняя при этом низкую сложность конфигурации.