esbuild представляет собой высокопроизводительный бандлер и
минификатор JavaScript/TypeScript, ориентированный на скорость сборки и
минимальные накладные расходы. В экосистеме Node.js он распространяется
через npm как esbuild, а в Deno может использоваться через
npm-совместимый слой или через сторонние обёртки в репозитории Deno,
включая зависимости из deno.land/x.
В Node.js среде esbuild устанавливается стандартным способом:
npm install esbuild
После установки доступно два основных способа использования:
CLI esbuild позволяет быстро выполнять сборку без написания кода:
npx esbuild src/index.js --bundle --outfile=dist/bundle.js
Ключевые параметры:
--bundle — включает сборку модулей в единый файл--outfile — путь выходного файла--minify — минификация кода--platform=node|browser — целевая среда выполнения--target=es2020 — уровень поддержки ECMAScriptМинимизация и сборка TypeScript без конфигурации:
npx esbuild src/app.ts --bundle --minify --outfile=dist/app.js
API esbuild ориентирован на сценарии интеграции в сборочные системы и dev-серверы.
import * as esbuild from 'esbuild';
await esbuild.build({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/bundle.js',
minify: true,
target: ['es2020']
});
await esbuild.context({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/bundle.js'
}).then(ctx => {
return ctx.watch();
});
Watch-режим работает через инкрементальную пересборку, используя внутренний кэш графа зависимостей.
esbuild написан на Go, что принципиально отличает его от большинства JS-бандлеров. Это даёт:
Ключевая особенность — отказ от сложных плагинных цепочек в пользу упрощённого API трансформаций.
esbuild поддерживает:
import/export)require/module.exports)Пример JSX:
await esbuild.build({
entryPoints: ['src/app.jsx'],
bundle: true,
jsxFactory: 'h',
jsxFragment: 'Fragment',
outfile: 'dist/app.js'
});
Плагинная система esbuild минималистична и основана на хуках
onResolve и onLoad.
import * as esbuild from 'esbuild';
const examplePlugin = {
name: 'example',
setup(build) {
build.onResolve({ filter: /.txt$/ }, args => {
return { path: args.path, namespace: 'txt' };
});
build.onLoad({ filter: /.txt$/, namespace: 'txt' }, args => {
return {
contents: 'export default "text content"',
loader: 'js'
};
});
}
};
await esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/out.js',
plugins: [examplePlugin]
});
В Deno отсутствует классическая node_modules-модель, но существует несколько способов использования esbuild.
Современные версии Deno поддерживают импорт npm-пакетов напрямую:
import * as esbuild from "npm:esbuild";
await esbuild.build({
entryPoints: ["./main.ts"],
bundle: true,
outfile: "./dist/bundle.js"
});
Этот механизм транслирует npm-зависимости в Deno runtime без необходимости установки через npm CLI.
deno.land/x представляет собой реестр сторонних модулей для Deno, где публикуются обёртки и адаптации библиотек.
В контексте esbuild чаще встречаются следующие подходы:
Некоторые модули на deno.land/x предоставляют API для
запуска esbuild как процесса или WASM-версии:
import { build } from "https://deno.land/x/esbuild/mod.ts";
await build({
entryPoints: ["./src/main.ts"],
bundle: true,
outfile: "./dist/app.js"
});
Альтернативная стратегия — WebAssembly-версия:
import * as esbuild from "https://deno.land/x/esbuild_wasm/mod.js";
await esbuild.initialize({
wasmURL: "https://unpkg.com/esbuild-wasm/esbuild.wasm"
});
const result = await esbuild.transform("const x: number = 1", {
loader: "ts"
});
WASM-версия снижает производительность относительно Go-бинарника, но обеспечивает кросс-платформенность.
esbuild поддерживает context API, который особенно
полезен в долгоживущих процессах:
import * as esbuild from 'esbuild';
const ctx = await esbuild.context({
entryPoints: ['src/index.ts'],
bundle: true,
outfile: 'dist/app.js'
});
await ctx.watch();
Инкрементальная модель снижает стоимость повторной сборки за счёт переиспользования AST и графа зависимостей.
esbuild использует собственный алгоритм разрешения модулей:
./, ../)node_modules)package.json
(module, main, browser)В Deno резолвинг отличается:
Несмотря на высокую скорость, архитектура накладывает ограничения:
В смешанных проектах возможна комбинация:
deno.land/xПример конфигурации:
import * as esbuild from "npm:esbuild";
import { copy } from "https://deno.land/x/copy/mod.ts";
await esbuild.build({
entryPoints: ["./src/main.ts"],
bundle: true,
outfile: "./dist/app.js"
});
await copy("./static", "./dist/static");
Такая модель объединяет производительность esbuild и модульную экосистему Deno.