Поле 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"`) происходит обратный эффект — резко увеличивается количество трансформаций и размер итогового кода. ---