Режим serve в esbuild предназначен для локальной
разработки и представляет собой встроенный HTTP-сервер, который
совмещает две ключевые функции: сборку проекта и раздачу результата
через веб-интерфейс.
В отличие от классического подхода «сначала сборка в папку — затем запуск отдельного сервера», здесь процесс объединён в один шаг. esbuild запускает сервер, который:
Ключевая особенность заключается в том, что сервер интегрирован непосредственно в процесс сборки, а не является внешним инструментом.
Функция serve предоставляется основным API esbuild и
имеет следующий общий вид:
import * as esbuild from 'esbuild';
await esbuild.serve(
{
port: 3000,
servedir: 'public'
},
{
entryPoints: ['src/index.js'],
bundle: true,
outdir: 'dist'
}
);
Первый аргумент описывает поведение HTTP-сервера, второй — параметры сборки.
Во втором аргументе используются стандартные настройки esbuild:
entryPoints — точки входа;bundle — объединение модулей;outdir — директория вывода;format — формат модуля (esm, cjs и т.д.);sourcemap — генерация source map.Механизм serve не является полноценным
продакшен-сервером. Он оптимизирован под разработку и работает по
следующей логике:
При запуске выполняется первичная сборка проекта.
Сервер начинает слушать указанный порт.
При HTTP-запросе:
Статические файлы из servedir отдаются напрямую без
обработки сборщиком.
Важно, что esbuild не внедряет полноценный middleware-слой и не предоставляет маршрутизацию уровня Express.
servedir играет ключевую роль в архитектуре
serve-режима. Он определяет, какие файлы считаются статическими.
Типичная структура проекта:
project/
├─ public/
│ ├─ index.html
│ └─ assets/
├─ src/
│ └─ index.js
В этом случае:
public/index.html отдаётся напрямую HTTP-сервером;src/index.js обрабатывается через esbuild;Serve-режим тесно связан с инкрементальной сборкой. esbuild не пересобирает весь проект с нуля при каждом изменении. Вместо этого используется внутренний механизм кэширования:
Это обеспечивает минимальное время отклика при разработке.
HTTP-сервер esbuild реализован на уровне Go runtime, что даёт несколько особенностей:
Сервер не предоставляет:
Его задача ограничена обслуживанием сборки и статических файлов.
В режиме serve активно используется кэш:
Такой подход исключает необходимость записи на диск, что уменьшает I/O-нагрузку.
Если несколько запросов приходят одновременно:
Это предотвращает дублирование работы и снижает нагрузку на CPU.
Несмотря на удобство, режим имеет ряд архитектурных ограничений:
Serve предназначен исключительно для разработки и проверки сборки.
При использовании servedir HTML-файлы остаются основным
входом для браузера. esbuild не генерирует HTML автоматически, но может
быть интегрирован через:
Пример связки:
<!-- public/index.html -->
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<script src="/dist/index.js"></script>
</head>
<body>
</body>
</html>
Хотя serve и не является заменой watch, он
включает аналогичный механизм:
В отличие от esbuild.build({ watch: true }), здесь нет
необходимости отдельно поднимать HTTP-сервер.
Если в процессе сборки возникает ошибка:
Это позволяет не прерывать сессию разработки.
Serve-режим не изменяет логику путей внутри приложения, но требует корректной настройки:
outdir;servedir определяет корень статических ресурсов.При некорректной настройке возможны ситуации, когда HTML загружается, но бандлы не находятся.
Функция serve возвращает объект управления:
const server = await esbuild.serve(options, buildOptions);
// остановка
server.stop();
При остановке:
Serve-режим esbuild отличается от типичных dev-серверов (Vite, Webpack Dev Server):
Любое изменение параметров сборки требует перезапуска сервера:
entryPoints не применяется динамически;outdir требует нового запуска;Serve не предназначен для динамической реконфигурации во время работы.
Serve-режим используется в ситуациях, где требуется:
Он особенно эффективен в проектах, где esbuild используется как основной bundler без дополнительного dev-слоя.