Опция target в esbuild определяет минимальную версию
JavaScript-среды, под которую будет транслироваться исходный код. От
этого параметра зависит степень преобразования синтаксиса, набор
сохраняемых современных возможностей языка и объём генерируемого
вспомогательного кода.
Основная задача target заключается в управлении уровнем
совместимости: чем более старое окружение указано, тем больше
современных конструкций будет переписано в эквивалентные, но более
громоздкие варианты. При более новых значениях компилятор сохраняет
современный синтаксис и минимизирует трансформации.
При сборке esbuild анализирует AST и сопоставляет используемые языковые конструкции с возможностями целевой платформы. Если конструкция не поддерживается указанным target, она преобразуется.
Например, использование стрелочных функций, const,
optional chaining или nullish coalescing может по-разному обрабатываться
в зависимости от целевой среды.
// исходный код
const result = obj?.user?.name ?? "unknown";
При современном target (например, es2020) код может быть
оставлен почти без изменений, тогда как для старых окружений он
преобразуется в цепочку проверок через временные переменные.
esbuild поддерживает несколько типов значений target,
влияющих на разные платформы.
Наиболее распространённый вариант — указание версии стандарта:
es2015es2016es2017es2018es2019es2020es2021es2022esnextКаждая последующая версия включает поддержку более современного синтаксиса и снижает необходимость трансформаций.
Допускается указание конкретных версий браузеров:
target: ["chrome58", "firefox57", "safari11"]
В этом случае esbuild ориентируется не только на ECMAScript-версию, но и на реальные возможности движков.
Для серверных приложений используется значение вида:
target: "node18"
Это влияет на обработку модулей, встроенных API и синтаксических возможностей Node.js среды.
При старых target стрелочные функции преобразуются в обычные функции:
// исходный код
const sum = (a, b) => a + b;
В устаревших средах:
var sum = function (a, b) {
return a + b;
};
При современных target трансформация отсутствует.
Эти конструкции чувствительны к версии ECMAScript.
const name = user?.profile?.name ?? "guest";
es2020+ — сохраняетсяes2020 — преобразуется в цепочку проверокПоддержка зависит от target:
es2017+ — сохраняетсяОпция target влияет не только на синтаксис, но и на
итоговый размер кода. Более низкий target увеличивает количество
вспомогательных функций, что приводит к росту бандла.
Например, преобразование async/await для старых сред добавляет значительный runtime-код, тогда как в современных окружениях он отсутствует.
esbuild допускает указание нескольких целей одновременно:
target: ["es2020", "chrome80", "firefox78"]
В таком случае используется наиболее строгий набор ограничений — код приводится к минимальному общему знаменателю.
target также определяет, как обрабатываются ES Modules:
import/exportexport const value = 42;
При старых окружениях:
exports.value = 42;
При высоких target esbuild пропускает значительную часть преобразований. Это ускоряет сборку, поскольку уменьшается количество операций над AST.
Ключевой принцип работы заключается в том, что esbuild не трансформирует код “на всякий случай” — преобразование происходит только при наличии реальной несовместимости.
Выбор target напрямую определяет список поддерживаемых браузеров:
es2015 соответствует широкому спектру современных
браузеров, но требует преобразования многих конструкцийes2020 охватывает большинство актуальных окружений и
минимизирует трансформацииesnext предполагает отсутствие трансформаций и
рассчитан на новейшие движкиПри использовании browser-таргетов учитываются особенности движков, включая поддержку отдельных синтаксических фич вне зависимости от общей версии ECMAScript.
Некоторые конструкции не полностью зависят от target и обрабатываются дополнительными настройками:
target влияет только на синтаксический уровень преобразований, не затрагивая runtime API.
target тесно связан с:
format — влияет на структуру вывода (ESM, CJS,
IIFE)platform — определяет среду выполнения (browser, node,
neutral)bundle — влияет на объединение модулейПри комбинации этих опций target становится одним из ключевых факторов, определяющих итоговую форму кода.
Если target не указан, esbuild использует значение по умолчанию, ориентированное на современные браузеры и актуальную версию Node.js. Это приводит к минимальному количеству преобразований и максимально компактному выходному коду при условии современной среды исполнения.