Параметр target в Esbuild определяет, для каких версий
JavaScript-движков или браузеров должен быть сгенерирован итоговый код.
На основе указанного значения Esbuild принимает решение о необходимости
преобразования современных конструкций языка в более совместимый
синтаксис.
Если целевая платформа не поддерживает определённую возможность JavaScript, Esbuild попытается выполнить соответствующую трансформацию. Если преобразование невозможно, будет выдана ошибка сборки.
Пример:
await build({
entryPoints: ['src/index.js'],
outfile: 'dist/app.js',
bundle: true,
target: 'es2017'
})
В данном случае код будет преобразован таким образом, чтобы соответствовать возможностям стандарта ECMAScript 2017.
Параметр может принимать:
Пример одного значения:
target: 'es2020'
Пример нескольких целей:
target: ['chrome100', 'firefox100']
Esbuild анализирует все указанные платформы и выбирает уровень совместимости, удовлетворяющий каждой из них.
Наиболее распространённый способ настройки — указание версии стандарта ECMAScript.
es5Поддержка старых браузеров и устаревших окружений.
target: 'es5'
Особенности:
Применяется при необходимости поддержки очень старых браузеров.
es2015 (ES6)Первый крупный релиз современного JavaScript.
target: 'es2015'
Поддерживает:
let и const.Пример исходного кода:
const sum = (a, b) => a + b
После трансформации для старых платформ:
var sum = function(a, b) {
return a + b
}
es2016Добавляет оператор возведения в степень.
target: 'es2016'
Пример:
const result = 2 ** 3
es2017Добавляет поддержку асинхронных функций.
target: 'es2017'
Пример:
async function loadData() {
return await fetch('/api/data')
}
es2018Расширяет возможности работы с объектами и регулярными выражениями.
target: 'es2018'
Включает:
Пример:
const clone = {
...original
}
es2019Добавляет ряд улучшений языка.
target: 'es2019'
Поддерживаемые возможности:
Array.prototype.flat;Array.prototype.flatMap;catch.Пример:
try {
doSomething()
} catch {
console.log('Ошибка')
}
es2020Один из наиболее популярных вариантов.
target: 'es2020'
Содержит:
Пример:
const name = user?.profile?.name
es2021Добавляет новые строковые и логические операторы.
target: 'es2021'
Пример:
value ||= defaultValue
Также доступны:
value &&= newValue
value ??= fallbackValue
es2022Расширяет возможности классов.
target: 'es2022'
Поддерживаются:
Пример:
class User {
#name
constructor(name) {
this.#name = name
}
}
es2023Отражает возможности стандарта ECMAScript 2023.
target: 'es2023'
Используется для современных браузеров и актуальных версий Node.js.
es2024Современная цель для новейших платформ.
target: 'es2024'
Подходит для проектов, ориентированных на последние версии браузеров и серверных сред выполнения.
esnextУказывает Esbuild использовать максимально современный синтаксис без попыток понижения версии.
target: 'esnext'
Пример:
await build({
target: 'esnext'
})
Особенности:
Часто используется для библиотек и внутренних проектов, где контроль над окружением полностью известен.
Вместо версии стандарта можно указывать конкретные браузеры.
Формат:
target: 'chrome80'
Пример:
target: 'chrome115'
Формат:
target: 'firefox102'
Пример:
target: 'firefox120'
Формат:
target: 'safari16'
Пример:
target: 'safari17'
Формат:
target: 'edge110'
Пример:
target: 'edge120'
Формат:
target: 'opera95'
Формат:
target: 'ie11'
Используется крайне редко из-за устаревания браузера.
Следует учитывать, что Esbuild не способен полностью эмулировать все современные возможности JavaScript для Internet Explorer.
Формат:
target: 'ios15'
Пример:
target: 'ios17'
Помимо браузеров, поддерживаются различные среды выполнения.
Формат:
target: 'node18'
Примеры:
target: 'node16'
target: 'node20'
target: 'node22'
Очень распространённый вариант для серверных приложений.
Формат:
target: 'deno1.40'
Пример:
target: 'deno1.41'
JavaScript-движок, используемый в React Native.
target: 'hermes'
Либо с указанием версии:
target: 'hermes0.12'
Часто приложение должно работать сразу в нескольких окружениях.
Пример:
target: [
'chrome110',
'firefox110',
'safari16'
]
Esbuild анализирует минимальные возможности среди всех перечисленных платформ и генерирует код, совместимый с каждой из них.
| Значение | Типичный сценарий |
|---|---|
es5 |
Поддержка устаревших браузеров |
es2015 |
Старые корпоративные проекты |
es2017 |
Широкая совместимость |
es2020 |
Современные веб-приложения |
es2022 |
Новые браузеры и Node.js |
esnext |
Максимально современный код |
node18 |
Серверные приложения |
node20 |
Современные backend-проекты |
chrome120 |
Приложение для актуального Chrome |
Наиболее распространённый вариант:
target: 'es2020'
или
target: [
'chrome110',
'firefox110',
'safari16'
]
Если используется современный Node.js:
target: 'node20'
Такой подход позволяет избежать лишних трансформаций.
Часто применяется:
target: 'esnext'
или несколько сборок:
target: 'es2018'
для совместимой версии и
target: 'esnext'
для современного варианта.
target: 'es5'
Следует учитывать увеличение размера сборки и ограничения некоторых современных возможностей языка.
При указании слишком старой цели Esbuild может сообщить о невозможности преобразования определённой конструкции.
Например:
target: 'es5'
и код:
await fetch('/api')
может привести к диагностическому сообщению, если требуемое преобразование невозможно выполнить безопасно без дополнительных инструментов.
В подобных случаях обычно используются:
target;target на производительность сборкиЧем современнее указанная цель, тем меньше преобразований требуется выполнить.
Пример:
target: 'esnext'
Преимущества:
Пример:
target: 'es5'
Недостатки:
Поэтому рекомендуется выбирать наиболее современную цель, которая соответствует требованиям поддерживаемых платформ.