В экосистеме сборки JavaScript-кода esbuild предоставляет два фундаментальных способа взаимодействия: командную строку (CLI) и программный JavaScript API. Эти два интерфейса опираются на одну и ту же внутреннюю реализацию, но различаются по уровню контроля, интеграционным возможностям и характеру использования в проектной архитектуре.
CLI ориентирован на декларативное использование через терминал и конфигурационные параметры, тогда как JS API предназначен для встраивания процесса сборки в кодовую базу, позволяя управлять сборкой динамически.
CLI в esbuild представляет собой слой поверх основного движка, предоставляющий доступ к типовым операциям без необходимости писать дополнительный JavaScript-код.
Основные характеристики CLI:
esbuildCLI особенно эффективен в сценариях, где сборка является линейной операцией: вход → трансформация → выход.
esbuild src/index.js --bundle --minify --outfile=dist/bundle.js
Такая форма выражает декларативную модель: разработчик описывает желаемый результат, а не процесс его достижения.
CLI в контексте esbuild используется преимущественно в ситуациях с низкой динамикой конфигурации:
Одноразовые приложения, небольшие библиотеки, учебные проекты.
Сборка выполняется как отдельный шаг без необходимости программного управления процессом.
Когда параметры сборки не зависят от окружения выполнения или бизнес-логики.
Использование в npm scripts:
{
"scripts": {
"build": "esbuild src/index.js --bundle --minify --outfile=dist/app.js"
}
}
CLI снижает сложность инфраструктуры и минимизирует поверхность ошибок.
Несмотря на простоту, CLI в esbuild имеет архитектурные ограничения:
CLI плохо подходит для сценариев, где сборка зависит от состояния системы или требует реактивного поведения.
JS API в esbuild предоставляет полный программный доступ к движку сборки. В отличие от CLI, он позволяет управлять процессом как частью приложения.
Ключевые особенности:
build() и context()import * as esbuild from 'esbuild';
await esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
minify: true,
outfile: 'dist/bundle.js'
});
JS API в esbuild применяется в более сложных архитектурах, где сборка является частью логики приложения.
Параметры могут зависеть от окружения:
const isProd = process.env.NODE_ENV === 'production';
await esbuild.build({
entryPoints: ['src/index.js'],
minify: isProd
});
Сборка может запускаться по запросу или событию:
JS API позволяет создавать долгоживущие процессы сборки:
const ctx = await esbuild.context({
entryPoints: ['src/index.js'],
bundle: true
});
await ctx.watch();
Такой подход невозможен в CLI в полной мере без внешних обвязок.
JS API позволяет строить сложные цепочки:
Плагины в esbuild тесно связаны с JS API.
CLI может использовать плагины только через конфигурационные обёртки, тогда как JS API:
const plugin = {
name: 'example',
setup(build) {
build.onResolve({ filter: /.*/ }, args => {
return { path: args.path };
});
}
};
await esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
plugins: [plugin]
});
CLI и JS API в esbuild используют общий компиляторный pipeline, однако различия проявляются в:
JS API при использовании context() позволяет:
CLI, напротив, всегда запускает новый процесс.
В практике esbuild часто используется комбинированная модель:
Такой подход разделяет ответственность:
Выбор между CLI и JS API определяет:
CLI фиксирует сборку как внешний процесс. JS API превращает её в часть исполняемой системы.