В системе сборки esbuild ключевую роль играет баланс между скоростью
и корректной обработкой синтаксических возможностей языка. Одним из
механизмов, позволяющих контролировать поведение трансформаций,
выступает параметр supported. Он задаёт набор возможностей
JavaScript, которые считаются доступными в целевой среде выполнения, и
тем самым определяет, какие преобразования должны быть применены, а
какие можно пропустить.
В отличие от абстрактных «target»-ориентированных настроек,
supported предоставляет более низкоуровневый и точный
контроль. Он позволяет вручную переопределять поддержку конкретных
синтаксических конструкций независимо от общего целевого окружения.
Каждая современная версия JavaScript включает набор синтаксических возможностей: optional chaining, nullish coalescing, BigInt, top-level await и другие. Однако не все среды выполнения поддерживают их одинаково.
Внутри esbuild каждая такая возможность представлена как отдельный флаг поддержки:
arrow — стрелочные функцииoptionalChaining — опциональная цепочка
?.nullishCoalescing — оператор ??bigInt — литералы BigInttemplateLiteral — шаблонные строкиdestructuring — деструктуризацияclassFields — поля классовОпция supported позволяет переопределить значения этих
флагов.
supportedВо время компиляции esbuild выполняет анализ AST (абстрактного синтаксического дерева). Для каждой синтаксической конструкции проверяется:
supportedЕсли конструкция помечена как «неподдерживаемая», esbuild применяет трансформацию.
supportedОпция задаётся в виде объекта, где ключи — это конкретные возможности языка:
{
supported: {
arrow: true,
optionalChaining: false,
nullishCoalescing: false,
classFields: true
}
}
Значения:
true — синтаксис считается поддерживаемым и не
трансформируетсяfalse — синтаксис принудительно преобразуется в
совместимый вариантsupported
над targetВ обычной конфигурации используется параметр target,
например:
{
target: "es2018"
}
Он задаёт общий уровень поддержки. Однако supported
обладает более высоким приоритетом на уровне отдельных фич.
supportedtargetТаким образом, supported позволяет «переписать»
поведение target.
Рассмотрим среду, где синтаксис optional chaining недоступен, но сборка должна сохранить его:
{
target: "es2015",
supported: {
optionalChaining: true
}
}
Даже если es2015 не поддерживает ?.,
esbuild не будет транслировать конструкцию.
Обратный сценарий — отключение поддержки даже там, где она обычно включена:
{
target: "es2020",
supported: {
nullishCoalescing: false
}
}
В этом случае оператор ?? будет преобразован в
эквивалентную конструкцию с тернарным оператором:
a != null ? a : b
Опция supported влияет не только на трансформации, но и
на последующие стадии обработки:
Если синтаксис считается поддерживаемым, esbuild может сохранить его в исходном виде, что уменьшает размер итогового бандла и ускоряет сборку.
При работе с TypeScript и JSX опция supported также
влияет на трансформации, но только косвенно.
Например:
supported, но влияет на
генерацию дереваsupportedЭто означает, что supported работает на уровне уже
нормализованного JavaScript AST.
{
target: "es2022",
supported: {
classFields: false
}
}
Даже при высоком target класс-поля будут
транспилироваться.
{
supported: {
optionalChaining: true,
nullishCoalescing: true,
bigInt: true
}
}
Конфигурация фактически отключает трансформации для современных фич независимо от target.
Внутри esbuild каждая функция поддержки реализуется как булевый предикат:
isSupported(feature, context) → boolean
Где:
feature — синтаксическая возможностьcontext — комбинация target + supported overrideРезультат влияет на выбор одного из двух путей:
Хотя supported напрямую не отвечает за удаление кода, он
косвенно влияет на оптимизацию:
Например, optional chaining, оставленный без трансформации, позволяет быстрее анализировать цепочки доступа и потенциально удалять лишние проверки.
supportedНесмотря на гибкость, механизм имеет ограничения:
targetОн работает только на уровне синтаксиса.
Неправильное использование supported может привести к
несовместимому коду:
Например:
supported: {
optionalChaining: true
}
в среде без native support приведёт к syntax error при загрузке скрипта.
Плагины могут влиять на AST до применения supported, но
не после него. Это означает:
supported решает, как их финально кодироватьЦель — ускорение сборки:
{
supported: {
arrow: true,
destructuring: true,
optionalChaining: true
}
}
Цель — поддержка старых сред:
{
target: "es5",
supported: {
classFields: false,
optionalChaining: false,
nullishCoalescing: false
}
}
Механизм supported формирует слой тонкой настройки между
абстрактным уровнем целевой платформы и реальной логикой трансформации
AST. Он позволяет управлять синтаксисом на уровне отдельных языковых
возможностей, создавая точечный контроль над компиляцией без изменения
глобальных параметров сборки.