В экосистеме Node.js стандартным способом автоматизации задач
является использование раздела scripts в
package.json. esbuild органично встраивается в этот
механизм благодаря своей CLI-утилите, которая позволяет запускать сборку
без дополнительного обвязочного кода.
Минимальная конфигурация выглядит следующим образом:
{
"name": "app",
"version": "1.0.0",
"scripts": {
"build": "esbuild src/index.js --bundle --outfile=dist/bundle.js"
},
"devDependencies": {
"esbuild": "^0.25.0"
}
}
При вызове:
npm run build
npm автоматически подставляет бинарник esbuild из
node_modules/.bin, что исключает необходимость глобальной
установки.
Даже при отсутствии записи в scripts можно запускать esbuild напрямую:
npx esbuild src/index.js --bundle --outfile=dist/bundle.js
Однако такой подход теряет преимущества декларативного управления сборкой. В рамках package.json скрипты становятся единым источником правды для всех команд проекта.
Типичная практика — выделение отдельных сценариев сборки под разные среды.
{
"scripts": {
"build": "esbuild src/index.js --bundle --outfile=dist/bundle.js --minify",
"dev": "esbuild src/index.js --bundle --outfile=dist/bundle.js --sourcemap --watch"
}
}
Ключевые различия:
Флаг --watch заставляет esbuild отслеживать файловую
систему и автоматически пересобирать проект при изменениях.
npm позволяет объединять команды через логические операторы:
{
"scripts": {
"clean": "rm -rf dist",
"build": "npm run clean && esbuild src/index.js --bundle --outfile=dist/bundle.js"
}
}
Здесь сначала выполняется очистка каталога, затем сборка.
В Windows для кроссплатформенности часто используется пакет
rimraf:
{
"scripts": {
"clean": "rimraf dist"
}
}
esbuild поддерживает гибкую конфигурацию через аргументы командной строки, которые можно динамически изменять через npm scripts:
{
"scripts": {
"build": "esbuild src/index.js --bundle --outfile=dist/bundle.js --minify=$MINIFY"
}
}
Запуск:
MINIFY=true npm run build
В Windows требуется использование cross-env:
{
"scripts": {
"build": "cross-env MINIFY=true esbuild src/index.js --bundle --outfile=dist/bundle.js --minify"
}
}
esbuild поддерживает несколько входных файлов, что удобно для многостраничных приложений:
{
"scripts": {
"build:main": "esbuild src/main.js --bundle --outfile=dist/main.js",
"build:admin": "esbuild src/admin.js --bundle --outfile=dist/admin.js"
}
}
Альтернативно используется единый вызов с несколькими входами:
{
"scripts": {
"build": "esbuild src/main.js src/admin.js --bundle --outdir=dist"
}
}
В этом случае esbuild автоматически создаёт отдельные бандлы для каждого entry point.
При работе с несколькими файлами предпочтительнее использовать
--outdir:
{
"scripts": {
"build": "esbuild src/*.js --bundle --outdir=dist"
}
}
Особенности:
esbuild поддерживает TypeScript без отдельного компилятора:
{
"scripts": {
"build": "esbuild src/index.ts --bundle --outfile=dist/bundle.js"
}
}
Для строгой проверки типов часто комбинируется с
tsc:
{
"scripts": {
"typecheck": "tsc --noEmit",
"build": "npm run typecheck && esbuild src/index.ts --bundle --outfile=dist/bundle.js"
}
}
При разработке часто требуется одновременно запускать сервер и
сборку. Используется пакет concurrently:
{
"scripts": {
"dev": "concurrently \"esbuild src/index.js --bundle --outfile=dist/bundle.js --watch\" \"node server.js\""
}
}
Такой подход позволяет:
Несмотря на ориентацию esbuild на CLI, сложные проекты часто выносят параметры в JavaScript-скрипт:
// build.js
const esbuild = require('esbuild');
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
minify: true,
sourcemap: true
});
package.json:
{
"scripts": {
"build": "node build.js"
}
}
Такой подход даёт:
Структурирование команд сборки часто оформляется через префиксы:
{
"scripts": {
"build:dev": "esbuild src/index.js --bundle --outfile=dist/bundle.js --sourcemap",
"build:prod": "esbuild src/index.js --bundle --outfile=dist/bundle.js --minify",
"build:analyze": "esbuild src/index.js --bundle --outfile=dist/bundle.js --metafile=meta.json"
}
}
Файл metafile.json используется для анализа зависимостей
и оптимизации структуры бандла.
Для сокращения команд часто вводятся промежуточные скрипты:
{
"scripts": {
"esbuild": "esbuild src/index.js --bundle --outfile=dist/bundle.js",
"build": "npm run esbuild -- --minify"
}
}
Здесь используется передача аргументов через --,
позволяющая расширять базовую команду.
npm поддерживает автоматические хуки:
{
"scripts": {
"prebuild": "rm -rf dist",
"build": "esbuild src/index.js --bundle --outfile=dist/bundle.js",
"postbuild": "echo build complete"
}
}
Порядок выполнения:
Это позволяет строить полноценные пайплайны без внешних инструментов.
При росте проекта целесообразно разделять сборку на независимые блоки:
{
"scripts": {
"build:core": "esbuild src/core/index.js --bundle --outdir=dist/core",
"build:ui": "esbuild src/ui/index.js --bundle --outdir=dist/ui",
"build": "npm run build:core && npm run build:ui"
}
}
Такое разделение:
В монорепозиториях esbuild часто вызывается через root package.json:
{
"scripts": {
"build": "npm run build --workspace=packages/app"
}
}
Или через независимые сборки каждого пакета:
{
"scripts": {
"build:pkg-a": "npm --prefix packages/pkg-a run build",
"build:pkg-b": "npm --prefix packages/pkg-b run build"
}
}
Такой подход обеспечивает независимость пакетов и масштабируемость структуры репозитория.