Поддерживаемые значения target: es5, es2015–es2022, node и браузеры

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

В основе механизма лежит сопоставление возможностей JavaScript с конкретными версиями движков V8, JavaScriptCore, SpiderMonkey и средами выполнения, такими как Node.js и браузеры. Чем старее целевая среда, тем больше синтаксических конструкций подвергается трансформации.


ES5

es5 — наиболее совместимый, но одновременно наиболее «дорогой» по преобразованиям таргет.

Особенности трансформации

При выборе es5 выполняется максимальная деградация синтаксиса:

  • стрелочные функции преобразуются в обычные function
  • const и let заменяются на var
  • классы компилируются в функции-конструкторы с прототипами
  • шаблонные строки превращаются в конкатенацию
  • деструктуризация раскладывается в последовательность присваиваний
  • for...of преобразуется в классические циклы
  • async/await требует внешнего рантайм-хелпера или полифилла

Влияние на производительность сборки

ES5 увеличивает размер выходного кода за счёт вспомогательных функций, таких как helper-реализации классов и генераторов. Это особенно заметно в больших приложениях, где используется современный синтаксис.

Практическое значение

ES5 используется исключительно для поддержки устаревших окружений, где отсутствует поддержка ES2015 и выше. В современных браузерах и Node.js этот уровень обычно не применяется.


ES2015–ES2022

Диапазон es2015es2022 задаёт постепенное уменьшение степени трансформации. Каждое значение соответствует набору возможностей ECMAScript, включённых в соответствующую редакцию стандарта.

ES2015

Минимальная современная база:

  • классы поддерживаются как есть
  • стрелочные функции сохраняются
  • модули ES поддерживаются на уровне синтаксиса (но могут быть транспилированы в CommonJS при необходимости)
  • let/const остаются без преобразований
  • template literals сохраняются

Трансформации касаются в основном генераторов и некоторых новых встроенных функций.


ES2016–ES2018

Эти версии вводят точечные улучшения:

  • оператор возведения в степень **
  • async/await (ES2017)
  • rest/spread в объектах (ES2018)

esbuild при этих таргетах минимизирует вмешательство в код, ограничиваясь только тем, что не поддерживается целевой средой.


ES2019–ES2020

Добавляются:

  • Array.prototype.flat и flatMap
  • Object.fromEntries
  • optional catch binding
  • optional chaining (?.)
  • nullish coalescing (??)

При установке target ниже уровня поддержки этих функций происходит их трансформация в более длинные выражения с проверками и временными переменными.


ES2021–ES2022

  • логические операторы присваивания (&&=, ||=, ??=)
  • Promise.any
  • String.prototype.replaceAll
  • top-level await (в зависимости от формата модулей)

На этих уровнях esbuild почти не выполняет преобразований, если целевая среда поддерживает современные движки.


Node.js как target

При использовании node target учитывается версия среды выполнения Node.js.

Принцип работы

target: nodeXX означает:

  • минимальная версия Node.js задаёт допустимый синтаксис
  • используются встроенные возможности V8 конкретной версии
  • отсутствует необходимость в браузерных полифиллах
  • модули чаще всего остаются в формате CommonJS или ESM в зависимости от конфигурации

Примеры поведения

  • Node 12: ограниченная поддержка optional chaining и nullish coalescing
  • Node 14: более стабильная поддержка ES2020
  • Node 16+: полноценная поддержка современных возможностей
  • Node 18–20: минимальная трансформация кода

Особенности сборки

При target node esbuild:

  • не добавляет браузерные shim-ы
  • оптимизирует под серверный рантайм
  • сохраняет require или import в зависимости от режима

Browser target

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

Основные принципы

  • target задаётся через список браузеров или глобальный уровень (например, современный baseline)
  • учитываются различия между Chrome, Firefox, Safari, Edge
  • трансформация синтаксиса зависит от минимально поддерживаемого набора функций

Пример логики

Если указан современный браузерный таргет:

  • ES2020+ почти не трансформируется
  • optional chaining и nullish coalescing остаются без изменений
  • классы и модули сохраняются

Если указан устаревший набор:

  • включается деградация до ES5
  • добавляются helper-функции
  • увеличивается размер bundle

Отличие от Node.js

Браузерный target всегда предполагает:

  • отсутствие встроенных Node API
  • необходимость учитывать DOM-окружение
  • возможную необходимость полифиллов через внешние библиотеки

Влияние target на генерацию кода

Синтаксическая трансформация

target напрямую определяет, какие конструкции JavaScript считаются «безопасными» для вывода без изменений.

Уровень оптимизации

Более современный target:

  • уменьшает объём кода
  • ускоряет сборку
  • снижает количество runtime-обёрток

Более старый target:

  • увеличивает совместимость
  • повышает сложность результирующего кода
  • требует дополнительных runtime-слоёв

Tree-shaking и target

Хотя tree-shaking формально независим от target, фактически старые трансформации могут ухудшать его эффективность из-за появления дополнительных вспомогательных функций.


Конфигурационные сценарии

Пример конфигурации esbuild

import { build } from "esbuild";

build({
  entryPoints: ["src/index.js"],
  bundle: true,
  outfile: "dist/bundle.js",
  target: ["es2018"]
});

В этом случае код приводится к уровню ES2018: современные конструкции выше этого уровня преобразуются.


Node-ориентированная сборка

build({
  entryPoints: ["server/app.js"],
  platform: "node",
  target: "node18"
});

Поведение:

  • исключается браузерная трансформация
  • сохраняется Node-совместимый синтаксис
  • минимальная транспиляция

Браузерная сборка

build({
  entryPoints: ["src/main.js"],
  platform: "browser",
  target: ["chrome90", "firefox88", "safari14"]
});

Особенности:

  • синтаксис ограничивается возможностями указанных браузеров
  • учитывается совместимость между движками
  • оптимизируется финальный bundle под клиентскую среду

Сравнение уровней target

Target Уровень трансформации Размер кода Совместимость
ES5 максимальный высокий устаревшие среды
ES2015–2018 средний средний большинство современных сред
ES2019–2022 минимальный низкий современные браузеры и Node.js
Node адаптивный низкий серверная среда
Browser зависимый от списка переменный клиентская среда

Поведение при смешанных target

При указании массива target:

target: ["es2018", "chrome80", "node16"]

esbuild выбирает минимально общий знаменатель возможностей:

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

Роль target в архитектуре сборки

target выступает центральным параметром, связывающим:

  • уровень ECMAScript
  • особенности рантайма
  • стратегию транспиляции
  • итоговую производительность кода

В системах сборки он определяет баланс между современным синтаксисом и необходимостью поддержки старых окружений, влияя на всю цепочку преобразований исходного JavaScript-кода.