Опция target: понижение синтаксиса под конкретные среды

Опция target в esbuild определяет минимальную версию JavaScript-среды, под которую будет транслироваться исходный код. От этого параметра зависит степень преобразования синтаксиса, набор сохраняемых современных возможностей языка и объём генерируемого вспомогательного кода.

Основная задача target заключается в управлении уровнем совместимости: чем более старое окружение указано, тем больше современных конструкций будет переписано в эквивалентные, но более громоздкие варианты. При более новых значениях компилятор сохраняет современный синтаксис и минимизирует трансформации.

При сборке esbuild анализирует AST и сопоставляет используемые языковые конструкции с возможностями целевой платформы. Если конструкция не поддерживается указанным target, она преобразуется.

Например, использование стрелочных функций, const, optional chaining или nullish coalescing может по-разному обрабатываться в зависимости от целевой среды.

// исходный код
const result = obj?.user?.name ?? "unknown";

При современном target (например, es2020) код может быть оставлен почти без изменений, тогда как для старых окружений он преобразуется в цепочку проверок через временные переменные.

Форматы значений target

esbuild поддерживает несколько типов значений target, влияющих на разные платформы.

ECMAScript версии

Наиболее распространённый вариант — указание версии стандарта:

  • es2015
  • es2016
  • es2017
  • es2018
  • es2019
  • es2020
  • es2021
  • es2022
  • esnext

Каждая последующая версия включает поддержку более современного синтаксиса и снижает необходимость трансформаций.

Браузерные таргеты

Допускается указание конкретных версий браузеров:

target: ["chrome58", "firefox57", "safari11"]

В этом случае esbuild ориентируется не только на ECMAScript-версию, но и на реальные возможности движков.

Node.js таргет

Для серверных приложений используется значение вида:

target: "node18"

Это влияет на обработку модулей, встроенных API и синтаксических возможностей Node.js среды.

Влияние target на трансформацию синтаксиса

Стрелочные функции

При старых target стрелочные функции преобразуются в обычные функции:

// исходный код
const sum = (a, b) => a + b;

В устаревших средах:

var sum = function (a, b) {
  return a + b;
};

При современных target трансформация отсутствует.

Optional chaining и nullish coalescing

Эти конструкции чувствительны к версии ECMAScript.

const name = user?.profile?.name ?? "guest";
  • es2020+ — сохраняется
  • ниже es2020 — преобразуется в цепочку проверок

Async/await

Поддержка зависит от target:

  • es2017+ — сохраняется
  • ниже — преобразуется в генераторы и вспомогательные runtime-функции

Связь target и minify-результата

Опция target влияет не только на синтаксис, но и на итоговый размер кода. Более низкий target увеличивает количество вспомогательных функций, что приводит к росту бандла.

Например, преобразование async/await для старых сред добавляет значительный runtime-код, тогда как в современных окружениях он отсутствует.

Множественные target и приоритеты

esbuild допускает указание нескольких целей одновременно:

target: ["es2020", "chrome80", "firefox78"]

В таком случае используется наиболее строгий набор ограничений — код приводится к минимальному общему знаменателю.

Влияние target на модули

target также определяет, как обрабатываются ES Modules:

  • современные target сохраняют import/export
  • старые target могут преобразовывать модули в CommonJS
export const value = 42;

При старых окружениях:

exports.value = 42;

Оптимизация и пропуск трансформаций

При высоких target esbuild пропускает значительную часть преобразований. Это ускоряет сборку, поскольку уменьшается количество операций над AST.

Ключевой принцип работы заключается в том, что esbuild не трансформирует код “на всякий случай” — преобразование происходит только при наличии реальной несовместимости.

Практическое влияние на поддержку браузеров

Выбор target напрямую определяет список поддерживаемых браузеров:

  • es2015 соответствует широкому спектру современных браузеров, но требует преобразования многих конструкций
  • es2020 охватывает большинство актуальных окружений и минимизирует трансформации
  • esnext предполагает отсутствие трансформаций и рассчитан на новейшие движки

При использовании browser-таргетов учитываются особенности движков, включая поддержку отдельных синтаксических фич вне зависимости от общей версии ECMAScript.

Ограничения и особенности поведения

Некоторые конструкции не полностью зависят от target и обрабатываются дополнительными настройками:

  • JSX требует отдельной конфигурации
  • TypeScript не управляется target напрямую
  • полифилы не добавляются автоматически

target влияет только на синтаксический уровень преобразований, не затрагивая runtime API.

Взаимодействие с другими опциями сборки

target тесно связан с:

  • format — влияет на структуру вывода (ESM, CJS, IIFE)
  • platform — определяет среду выполнения (browser, node, neutral)
  • bundle — влияет на объединение модулей

При комбинации этих опций target становится одним из ключевых факторов, определяющих итоговую форму кода.

Поведение при отсутствии target

Если target не указан, esbuild использует значение по умолчанию, ориентированное на современные браузеры и актуальную версию Node.js. Это приводит к минимальному количеству преобразований и максимально компактному выходному коду при условии современной среды исполнения.