TypeScript-типы в JavaScript API esbuild обеспечивают строгую
типизацию всех ключевых сущностей сборщика: опций, результатов,
сообщений, плагинов и контекстов выполнения. Библиотека поставляется с
встроенными декларациями типов, поэтому дополнительная установка
@types пакетов не требуется.
Типизация охватывает весь жизненный цикл работы сборщика: от
конфигурации build и transform до анализа
метаданных и работы с контекстным API.
Пакет esbuild содержит собственные .d.ts
файлы, экспортирующие основные интерфейсы:
BuildOptionsTransformOptionsBuildResultTransformResultMetafileMessagePluginLoaderPlatformFormatTargetТипы импортируются напрямую из основного пакета:
import { build, transform, BuildOptions, TransformOptions } from "esbuild";
BuildOptions описывает конфигурацию сборки. Это один из
самых объёмных типов в API, содержащий десятки параметров.
Ключевые группы полей:
interface BuildOptions {
entryPoints?: string[] | { [name: string]: string };
stdin?: StdinOptions;
bundle?: boolean;
}
entryPoints — список входных файловstdin — виртуальный входbundle — включает бандлинг зависимостейoutdir?: string;
outfile?: string;
write?: boolean;
format?: "iife" | "cjs" | "esm";
outdir — директория выводаoutfile — единый файл выводаwrite — запись на диск или возврат в памятьformat — формат модуляplatform?: "node" | "browser" | "neutral";
target?: string | string[];
platform влияет на встроенные полифилы и поведение
резолвингаtarget определяет версию ECMAScriptloader?: {
[ext: string]: Loader;
};
Loader — строго типизированное объединение:
type Loader =
| "js"
| "jsx"
| "ts"
| "tsx"
| "json"
| "text"
| "binary"
| "base64"
| "css"
| "file";
plugins?: Plugin[];
Тип Plugin строго описывает структуру расширений:
interface Plugin {
name: string;
setup(build: PluginBuild): void | Promise<void>;
}
TransformOptions используется для преобразования
отдельных файлов без бандлинга.
import { transform, TransformOptions } from "esbuild";
interface TransformOptions {
loader?: Loader;
format?: "iife" | "cjs" | "esm";
target?: string | string[];
sourcemap?: boolean | "inline" | "external";
}
Результат строго связан с входными параметрами:
const result = await transform("const x: number = 1", {
loader: "ts",
});
Тип результата:
interface TransformResult {
code: string;
map?: string;
warnings: Message[];
}
Результат build() содержит как выходные файлы, так и
диагностическую информацию.
interface BuildResult<OutputFile extends boolean = boolean> {
errors: Message[];
warnings: Message[];
metafile?: Metafile;
outputFiles?: OutputFile extends true ? OutputFileData[] : never;
}
interface Message {
text: string;
location?: {
file: string;
line: number;
column: number;
};
detail?: any;
}
Тип Message используется как для ошибок, так и для
предупреждений, что упрощает унификацию обработки диагностик.
Metafile — структурированное описание графа модулей.
interface Metafile {
inputs: {
[path: string]: {
bytes: number;
imports: ImportRecord[];
};
};
}
interface ImportRecord {
path: string;
kind: "import-statement" | "require-call" | "dynamic-import";
}
Metafile активно используется для анализа зависимостей и
построения графов сборки.
type Format = "iife" | "cjs" | "esm";
iife — самовызывающаяся функцияcjs — CommonJSesm — ES Modulestype Platform = "browser" | "node" | "neutral";
Тип влияет на:
Context API добавляет поддержку долгоживущих сборок и инкрементальной компиляции.
import { context } from "esbuild";
Основан на BuildOptions, но расширен:
interface ContextOptions extends BuildOptions {
incremental?: boolean;
}
interface Context {
rebuild(): Promise<BuildResult>;
watch(): Promise<void>;
dispose(): Promise<void>;
}
Контекст используется для:
Инкрементальные сборки связаны с расширением
BuildResult:
interface BuildResult {
rebuild?: () => Promise<BuildResult>;
dispose?: () => void;
}
Типизация отражает возможность повторного использования кеша между сборками.
interface PluginBuild {
onResolve(options: OnResolveOptions, callback: OnResolveCallback): void;
onLoad(options: OnLoadOptions, callback: OnLoadCallback): void;
}
interface OnResolveOptions {
filter: RegExp;
namespace?: string;
}
interface OnLoadOptions {
filter: RegExp;
namespace?: string;
}
interface OnResolveResult {
path: string;
namespace?: string;
}
interface OnLoadResult {
contents: string;
loader: Loader;
}
Некоторые части API используют дженерики для более точного вывода типов.
const result = await build({
write: false,
entryPoints: ["index.ts"],
});
Если write: false, TypeScript выводит наличие
outputFiles:
result.outputFiles?.forEach(file => {
console.log(file.path);
});
interface StdinOptions {
contents: string;
loader?: Loader;
resolveDir?: string;
}
Используется для виртуальных сборок без файловой системы.
type Sourcemap = boolean | "inline" | "external";
interface WatchOptions {
onRebuild?: (error: Error | null, result: BuildResult) => void;
}
any в публичных интерфейсахPluginBuildbuild() и
transform()import { build, BuildOptions, BuildResult } from "esbuild";
const options: BuildOptions = {
entryPoints: ["src/index.ts"],
bundle: true,
platform: "node",
format: "cjs",
sourcemap: true,
write: false,
};
const result: BuildResult = await build(options);
result.errors.forEach(err => {
console.log(err.text);
});
import { transform, TransformOptions, TransformResult } from "esbuild";
const options: TransformOptions = {
loader: "ts",
sourcemap: true,
};
const result: TransformResult = await transform(
"const x: number = 10;",
options
);
import { Plugin } from "esbuild";
const myPlugin: Plugin = {
name: "example",
setup(build) {
build.onResolve({ filter: /.*/ }, args => {
return { path: args.path };
});
build.onLoad({ filter: /.*/ }, args => {
return {
contents: "export const x = 1;",
loader: "js",
};
});
},
};