esbuild использует собственный высокопроизводительный парсер JavaScript/TypeScript, ориентированный на максимально быстрое построение AST без полноценной семантической проверки. Это определяет ключевую особенность поддерживаемого синтаксиса: инструмент стремится корректно разобрать широкий спектр современных конструкций ECMAScript и популярных расширений, но не реализует всю глубину проверки типов или спецификаций TypeScript-компилятора.
Поддержка синтаксиса в esbuild строится вокруг двух принципов:
В результате esbuild можно рассматривать как синтаксически «толерантный» инструмент, ориентированный на интерпретацию структуры кода, а не на его статический анализ уровня tsc.
esbuild поддерживает широкий набор конструкций современных версий JavaScript, включая ES2015+ и более новые спецификации, применяемые в текущих движках.
Поддерживаются стандартные конструкции модульной системы:
import / exportexport * from)Пример:
import { readFile } from "fs";
export const name = "esbuild";
export default function build() {}
Динамический импорт:
const mod = await import("./module.js");
Особенность esbuild заключается в том, что он не просто парсит эти конструкции, но и активно участвует в бандлинге модулей, сохраняя их семантику или преобразуя в зависимости от режима вывода (ESM/CJS/IIFE).
Поддерживаются все стандартные формы:
letconstvarС учётом блочной области видимости:
if (true) {
let x = 1;
const y = 2;
}
const fn = (a, b) => a + b;
Поддержка включает:
thisesbuild поддерживает современный class-синтаксис:
class A {
#secret = 1;
constructor(value) {
this.value = value;
}
getSecret() {
return this.#secret;
}
static create() {
return new A(10);
}
}
Поддерживаются:
#field#method()Это важная часть современного JS, и esbuild корректно трансформирует их при необходимости для целевых окружений, не поддерживающих данную спецификацию.
Одни из ключевых современных операторов:
const value = obj?.nested?.prop;
const result = input ?? "default";
Поддерживаются без ограничений и корректно транслируются в совместимый код при необходимости.
async function load() {
const data = await fetch("/api");
return data.json();
}
Поддерживаются:
В модулях ES:
const data = await fetch("/config.json").then(r => r.json());
esbuild корректно обрабатывает такую конструкцию при использовании ESM-вывода.
esbuild поддерживает TypeScript не как систему типизации, а как расширенный синтаксис, который удаляется во время трансформации.
Все типовые конструкции полностью удаляются:
function add(a: number, b: number): number {
return a + b;
}
Преобразуется в:
function add(a, b) {
return a + b;
}
Поддерживаются:
enum Color {
Red,
Green,
Blue
}
Преобразуется в объектную структуру Jav * aScript:
var Color = /* @__PURE__ */ ((Color2) => {
Color2[Color2["Red"] = 0] = "Red";
Color2[Color2["Green"] = 1] = "Green";
Color2[Color2["Blue"] = 2] = "Blue";
return Color2;
})(Color || {});
Удаляются без влияния на runtime:
type User = {
name: string;
};
interface Person {
age: number;
}
Поддерживаются:
!class User {
constructor(public name: string) {}
}
Поддержка ограничена и зависит от режима, но базовая трансформация возможна:
namespace App {
export const version = "1.0";
}
esbuild имеет встроенный трансформер JSX, отличающийся высокой скоростью и минимальной конфигурацией.
const el = <div>Hello</div>;
Поддерживаются два режима:
Automatic:
import { jsx } from "react/jsx-runtime";
const el = jsx("div", { children: "Hello" });
Classic:
React.createElement("div", null, "Hello");
const el = <div>{value}</div>;
Поддерживаются:
Комбинация JSX + TypeScript:
type Props = {
title: string;
};
function Comp({ title }: Props) {
return <h1>{title}</h1>;
}
TypeScript-часть удаляется, JSX трансформируется.
const { a, b } = obj;
const [x, y] = arr;
Поддерживаются вложенные структуры и значения по умолчанию:
const { a = 1 } = obj;
const arr2 = [...arr1, 4];
const { a, ...rest } = obj;
const msg = `Hello ${name}`;
Поддерживаются многострочные строки и интерполяция.
function fn(a = 1, ...rest) {}
esbuild строго различает:
При этом синтаксис парсится единообразно, но поведение вывода зависит от target и format.
const fs = require("fs");
module.exports = {};
esbuild поддерживает их при соответствующем режиме сборки.
const mod = require(path);
Поддерживается как часть CommonJS-семантики.
Несмотря на широкую поддержку современного JS, esbuild не является полноценным компилятором языка с глубокой семантической моделью.
TypeScript типы:
Часть stage-3/experimental фич может:
Поддержка декораторов существует, но их поведение зависит от режима (legacy vs TC39 proposal). В современных конфигурациях используется приближённая к стандарту трансформация.
function deco(target: any) {}
@deco
class A {}
Могут не поддерживаться или ограниченно поддерживаться:
Поддерживаемый синтаксис напрямую связан с тем, как esbuild выполняет трансформацию:
Такой подход позволяет обрабатывать даже большие кодовые базы с высокой скоростью, сохраняя при этом поддержку большинства современных конструкций языка без необходимости подключения внешних трансформеров.