Поле env.targets
### Поле `env.targets`
Поле `env.targets` в конфигурации SWC определяет целевые среды выполнения, для которых будет производиться трансформация современного JavaScript-кода. Оно напрямую влияет на то, какие синтаксические конструкции будут транспилироваться, какие полифиллы могут быть учтены (в зависимости от интеграции), а также на общий уровень совместимости результирующего кода.
SWC использует `env.targets` как ключевой механизм принятия решений о необходимости понижения версии JavaScript. Это позволяет избегать лишней трансформации и сохранять современные возможности языка там, где целевая среда их уже поддерживает.
---
### Структура `env.targets`
Поле представляет собой объект, в котором ключи соответствуют целевым окружениям, а значения задают минимально поддерживаемую версию.
Пример базовой конфигурации:
```json
{
"env": {
"targets": {
"chrome": "100",
"firefox": "110",
"safari": "15",
"node": "18"
}
}
}
```
Каждое поле внутри объекта интерпретируется как условие поддержки определённого рантайма.
---
### Поддерживаемые ключи
SWC ориентируется на список известных окружений. Наиболее часто используемые:
* `chrome`
* `firefox`
* `safari`
* `edge`
* `ie`
* `opera`
* `node`
* `android`
* `ios`
Каждое значение задаётся строкой или числом версии. Внутренне SWC сравнивает версии с данными о поддержке ECMAScript-фич.
---
### Логика выбора целевой среды
При наличии нескольких целей SWC применяет стратегию пересечения требований: итоговый набор ограничений формируется так, чтобы код работал во всех указанных окружениях.
Например:
```json
{
"env": {
"targets": {
"chrome": "110",
"safari": "14"
}
}
}
```
В данном случае учитывается более строгая среда. Safari 14 имеет более ограниченную поддержку современных возможностей JavaScript, чем Chrome 110, поэтому трансформации будут ориентированы на Safari 14.
---
### Влияние на трансформации
`env.targets` определяет необходимость включения или отключения следующих преобразований:
* преобразование стрелочных функций
* замена `const` и `let` при старых средах
* транспиляция классов
* преобразование optional chaining (`?.`)
* преобразование nullish coalescing (`??`)
* генерация вспомогательных функций (helpers)
Если целевые окружения поддерживают современный синтаксис, SWC может полностью пропустить соответствующие трансформации, уменьшая размер итогового бандла.
---
### Использование с Browserslist-подобной логикой
SWC может интерпретировать `env.targets` в стиле Browserslist, хотя формат отличается.
Пример более декларативного подхода:
```json
{
"env": {
"targets": "> 0.25%, not dead"
}
}
```
Такой формат позволяет описывать цели через долю рынка браузеров, а не через конкретные версии. В этом случае SWC опирается на внешние данные о поддержке ECMAScript-фич.
---
### Приоритет значений
Если одновременно используются разные способы задания целей, действует следующая логика:
1. Явно указанные версии браузеров имеют высший приоритет
2. Затем учитываются выражения типа Browserslist
3. Дефолтные значения применяются только при отсутствии конфигурации
Пример конфликтной конфигурации:
```json
{
"env": {
"targets": {
"chrome": "120"
}
}
}
```
и одновременно:
```json
{
"env": {
"targets": "> 0.5%"
}
}
```
В таком случае явное указание Chrome 120 будет учитываться как более строгая и конкретная цель.
---
### Работа с Node.js целями
Цель `node` влияет на трансформации особенно сильно, поскольку Node.js имеет собственную эволюцию поддержки ECMAScript.
Пример:
```json
{
"env": {
"targets": {
"node": "16"
}
}
}
```
Для Node.js 16 могут быть включены трансформации:
* optional chaining может оставаться без изменений
* dynamic import может обрабатываться частично
* некоторые экспериментальные синтаксические конструкции могут требовать понижения
Для Node.js 12 и ниже набор трансформаций существенно расширяется.
---
### Оптимизация под современные среды
При указании современных версий (например, Chrome 120+, Safari 16+, Node 18+) SWC стремится минимизировать трансформации.
Это приводит к:
* уменьшению размера output-кода
* снижению количества runtime-helpers
* более быстрому build-time
* сохранению оригинальной структуры AST в большей степени
---
### Взаимодействие с `coreJs` и полифиллами
Хотя SWC сам по себе не всегда управляет полифиллами напрямую, `env.targets` часто используется совместно с настройками `coreJs`.
Логика взаимодействия:
* `targets` определяют необходимость фич
* `coreJs` определяет способ их заполнения (если подключено через сборщик)
Например:
```json
{
"env": {
"targets": {
"ie": "11"
},
"coreJs": "3.30"
}
}
```
В такой конфигурации почти все современные фичи будут требовать замены или полифиллов.
---
### Детектирование необходимости трансформации
SWC использует таблицы поддержки ECMAScript, где каждая фича имеет набор минимальных версий браузеров.
Алгоритм упрощённо выглядит так:
1. Получить список целевых окружений
2. Для каждой JS-фичи проверить поддержку
3. Если хотя бы одно окружение не поддерживает фичу — применить трансформацию
4. Иначе оставить код без изменений
---
### Пример влияния на код
Исходный код:
```js
const result = user?.profile?.name ?? "guest";
```
Если целевые окружения современные:
```json
{
"env": {
"targets": {
"chrome": "110"
}
}
}
```
код может остаться без изменений.
Если же указано:
```json
{
"env": {
"targets": {
"ie": "11"
}
}
}
```
результат трансформации будет примерно:
```js
var _a, _b;
var result = (_b = (_a = user === null || user === void 0 ? void 0 : user.profile) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : "guest";
```
---
### Частые ошибки конфигурации
**1. Смешивание несовместимых форматов**
```json
{
"env": {
"targets": ["chrome 100"]
}
}
```
Некоторые версии SWC не интерпретируют массив строк корректно без предварительного парсинга Browserslist.
---
**2. Завышенные требования**
Указание слишком новых версий без учёта реальных пользователей приводит к:
* отсутствию необходимых трансформаций
* потенциальным runtime-ошибкам в старых окружениях
---
**3. Игнорирование Safari**
Safari часто требует более строгих трансформаций, чем Chromium-браузеры той же эпохи, что приводит к неожиданным несовместимостям при неверной оценке цели.
---
### Роль в архитектуре SWC
`env.targets` является центральным элементом подсистемы совместимости. Он связывает:
* парсер ECMAScript
* трансформер AST
* систему helpers
* оптимизатор вывода
Без корректного определения targets SWC либо избыточно трансформирует код, либо оставляет несовместимые конструкции.
---
### Влияние на производительность сборки
Чем точнее и современнее задан `env.targets`, тем меньше операций трансформации выполняется:
* уменьшается время компиляции
* сокращается количество проходов AST
* снижается нагрузка на генератор кода
При слишком широких целях (например, `ie: "8"`) происходит обратный эффект — резко увеличивается количество трансформаций и размер итогового кода.
---