В системе сборки esbuild определение целевой среды выполнения напрямую влияет на то, какой JavaScript-код будет сгенерирован в результате трансформации. Под целевой средой понимается набор характеристик рантайма: версия ECMAScript, браузер или Node.js, наличие встроенных API и уровень поддержки синтаксиса.
Ключевая идея заключается в том, что esbuild не просто транспилирует код «вниз», а адаптирует результат под заранее заданные ограничения, минимизируя лишний полифил и сохраняя максимально современный синтаксис там, где это возможно.
targetГлавный инструмент управления целевыми средами в esbuild — параметр
target.
Он задаёт минимально поддерживаемый уровень JavaScript-движка, под который будет компилироваться код.
Примеры значений:
es2015, es2016, es2017,
es2018, es2019, es2020,
es2021, es2022, es2023chrome80, chrome90,
chrome120firefox70, firefox110safari13, safari16edge90node12, node14, node18,
node20Пример конфигурации:
import { build } from 'esbuild';
build({
entryPoints: ['src/index.js'],
bundle: true,
target: ['es2019']
});
Здесь esbuild будет избегать синтаксиса и API, появившихся после ES2019.
Установка target влияет сразу на несколько уровней
компиляции:
Если целевая среда не поддерживает современный синтаксис, он будет преобразован:
?.)??)Например:
const value = obj?.user?.name ?? 'default';
Может быть преобразовано в цепочку проверок:
var value = obj == null ? void 0 : obj.user == null ? void 0 : obj.user.name;
if (value == null) value = 'default';
Для старых target-версий классы превращаются в функции-конструкторы с прототипами, если это необходимо.
Хотя target не управляет системой модулей напрямую (это
делает format), он влияет на вспомогательный код вокруг
импортов/экспортов, особенно при генерации вспомогательных функций.
target и «версией Node.js»Указание nodeXX не означает только уровень ECMAScript.
Оно включает:
Пример:
target: ['node14']
Это означает, что esbuild может оставить:
но исключит возможности, отсутствующие в Node 14.
supportedЕсли target задаёт общий уровень среды, то
supported позволяет более точно управлять доступными
возможностями.
Это словарь флагов вида:
supported: {
'arrow': true,
'bigint': false,
'const-and-let': true,
'template-literal': true
}
Такой подход используется для сценариев, где:
target и
supportedПри совместном использовании действует правило приоритета:
target задаёт базовый уровень возможностейsupported переопределяет конкретные фичиПример:
build({
target: ['es2020'],
supported: {
bigint: false
}
});
Даже если ES2020 поддерживает BigInt, он будет отключён.
Выбор значений для target зависит от реальной аудитории
приложения.
Обычно используется стратегия «минимально необходимой поддержки»:
es2020 или вышеes2018 или es2017Пример:
target: ['chrome80', 'firefox78', 'safari13']
Часто выбирается минимальная LTS-версия:
target: ['node18']
или более консервативно:
target: ['node16']
Чем старше target:
Чем новее target:
target: ['es2015', 'chrome120']
В результате esbuild вынужден выбирать общий минимум, что снижает эффективность.
Указание слишком нового стандарта приводит к падению на старых браузерах без явной ошибки на этапе сборки.
target: ['es2022']
Такой подход не учитывает различия между Node.js и браузерами, особенно в отношении встроенных API.
Если target не указан, esbuild использует достаточно
современный уровень ECMAScript по умолчанию, ориентируясь на текущие
возможности движка, что приводит к минимальной транспиляции.
Хотя tree-shaking в первую очередь зависит от структуры модулей,
target влияет на:
target тесно взаимодействует с:
platform (browser / node / neutral)format (esm / cjs / iife)jsx (runtime и трансформация)minify (оптимизация, зависящая от синтаксиса)Особенно важно учитывать, что platform определяет
окружение API, а target — уровень языка.
В монорепозиториях часто используется несколько уровней сборки:
Пример:
const targets = {
modern: ['es2022'],
legacy: ['es2017'],
node: ['node18']
};
Такой подход позволяет разделять артефакты сборки и снижать избыточную транспиляцию.