Указание целевой среды: targets и env

В SWC управление выходным JavaScript-кодом строится вокруг двух ключевых механизмов: jsc.target и env.targets. Эти параметры определяют, какие синтаксические конструкции будут преобразованы, какие полифилы потенциально учитываются и насколько «современным» или «устаревшим» окажется итоговый бандл.


jsc.target: базовый уровень ECMAScript

Параметр jsc.target задаёт минимальную версию ECMAScript, в которую будет транслироваться код.

{
  "jsc": {
    "parser": {
      "syntax": "ecmascript"
    },
    "target": "es5"
  }
}

Основные значения target

  • es3 — максимально совместимый код для очень старых сред
  • es5 — классический уровень совместимости (IE11 и старые окружения)
  • es2015 (es6) — поддержка модулей, стрелочных функций и базовых современных возможностей
  • es2017 и выше — постепенное приближение к современному JavaScript
  • es2020, es2022 — минимальная трансформация, ориентация на современные движки

Поведение трансформации

При выборе target SWC:

  • преобразует синтаксис (arrow functions → function expressions при es5)
  • при необходимости переписывает классы
  • может транспилировать async/await (в зависимости от уровня цели)
  • убирает или сохраняет современные конструкции в зависимости от совместимости

Важно, что jsc.target работает на уровне синтаксиса, но не отвечает за полифилы или анализ среды выполнения.


env.targets: целевые платформы и контекст выполнения

Параметр env.targets описывает реальную среду исполнения, а не только уровень ECMAScript. Это приближает SWC к логике Babel preset-env.

{
  "env": {
    "targets": {
      "chrome": "87",
      "firefox": "90",
      "node": "18"
    }
  }
}

Логика работы targets

SWC использует targets для определения:

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

Поддерживаются несколько форматов описания:

  1. Браузеры
{
  "env": {
 "targets": {
   "chrome": "80",
   "safari": "13",
   "edge": "88"
 }
  }
}
  1. Node.js
{
  "env": {
 "targets": {
"node": "16"
 }
  }
}
  1. Смешанные среды
{
  "env": {
 "targets": {
"chrome": "90",
"firefox": "88",
"node": "18",
"ios": "14"
 }
  }
}

Различие между jsc.target и env.targets

Эти параметры часто путаются, но выполняют разные функции.

jsc.target

  • управляет синтаксисом
  • задаёт уровень ECMAScript
  • влияет на AST-трансформации
  • не учитывает реальные браузеры

env.targets

  • описывает реальные платформы
  • влияет на выбор трансформаций внутри preset-env
  • ближе к концепции compatibility matrix
  • может игнорировать часть преобразований, если среда поддерживает их нативно

Взаимодействие jsc.target и env.targets

При совместном использовании действует комбинированная логика:

  • jsc.target задаёт верхний предел возможностей языка
  • env.targets уточняет фактическую необходимость трансформаций

Пример:

{
  "jsc": {
 "target": "es2017"
  },
  "env": {
 "targets": {
"node": "14"
 }
  }
}

Поведение:

  • синтаксис ниже ES2017 не генерируется
  • дополнительные трансформации выполняются только если Node 14 их не поддерживает
  • итоговый код может остаться ближе к ES2017, несмотря на Node-таргет

Режимы env: usage и entry

Параметр env.mode управляет стратегией анализа зависимостей и полифилов.

usage

{
  "env": {
 "mode": "usage",
 "targets": {
"chrome": "80"
 }
  }
}

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

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

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

  • SWC анализирует AST
  • определяет используемые современные API
  • добавляет минимально необходимую поддержку

entry

{
  "env": {
 "mode": "entry",
 "targets": {
"chrome": "80"
 }
  }
}

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

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

Типичный сценарий:

import "core-js/stable";
import "regenerator-runtime/runtime";

core-js и полифилы в SWC env

SWC может учитывать необходимость полифилов через конфигурацию env.

{
  "env": {
 "targets": {
"ie": "11"
 },
 "coreJs": "3"
  }
}

Поведение:

  • анализирует недостающие встроенные API
  • предполагает использование core-js v3
  • добавляет совместимые трансформации при необходимости

shippedProposals и экспериментальные возможности

Некоторые конфигурации SWC поддерживают учёт экспериментальных возможностей языка.

{
  "env": {
 "targets": {
"chrome": "90"
 },
 "shippedProposals": true
  }
}

Эффект:

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

Практика определения targets в реальных проектах

При конфигурации среды обычно учитываются три уровня:

  1. Браузерная поддержка
  2. Node.js версия
  3. Корпоративные или встроенные окружения

Пример сбалансированной конфигурации:

{
  "jsc": {
 "target": "es2018"
  },
  "env": {
 "targets": {
"chrome": "90",
"firefox": "88",
"safari": "14",
"node": "16"
 },
 "mode": "usage",
 "coreJs": "3"
  }
}

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

Если env не задан:

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

Особенности при работе с современными движками

При таргетах уровня современных браузеров:

{
  "env": {
 "targets": {
"chrome": "120",
"firefox": "115"
 }
  }
}

наблюдается:

  • минимальное количество трансформаций
  • сохранение native async/await
  • сохранение class fields и optional chaining
  • частичное или полное отсутствие polyfill-инъекций

Приоритеты трансформации

SWC использует приоритетную схему:

  1. ограничение jsc.target
  2. уточнение через env.targets
  3. режим env.mode
  4. наличие polyfill-конфигурации
  5. особенности включённых плагинов и пресетов