В SWC управление выходным JavaScript-кодом строится вокруг двух ключевых механизмов: jsc.target и env.targets. Эти параметры определяют, какие синтаксические конструкции будут преобразованы, какие полифилы потенциально учитываются и насколько «современным» или «устаревшим» окажется итоговый бандл.
Параметр jsc.target задаёт минимальную версию ECMAScript, в
которую будет транслироваться код.
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"target": "es5"
}
}
es3 — максимально совместимый код для очень старых сред
es5 — классический уровень совместимости (IE11 и старые
окружения)
es2015 (es6) — поддержка модулей, стрелочных функций и
базовых современных возможностей
es2017 и выше — постепенное приближение к современному
JavaScript
es2020, es2022 — минимальная трансформация,
ориентация на современные движки
При выборе target SWC:
Важно, что jsc.target работает на уровне
синтаксиса, но не отвечает за полифилы или анализ среды
выполнения.
Параметр env.targets описывает реальную среду
исполнения, а не только уровень ECMAScript. Это приближает SWC
к логике Babel preset-env.
{
"env": {
"targets": {
"chrome": "87",
"firefox": "90",
"node": "18"
}
}
}
SWC использует targets для определения:
Поддерживаются несколько форматов описания:
{
"env": {
"targets": {
"chrome": "80",
"safari": "13",
"edge": "88"
}
}
}
{
"env": {
"targets": {
"node": "16"
}
}
}
{
"env": {
"targets": {
"chrome": "90",
"firefox": "88",
"node": "18",
"ios": "14"
}
}
}
Эти параметры часто путаются, но выполняют разные функции.
preset-env
При совместном использовании действует комбинированная логика:
jsc.target задаёт верхний предел возможностей
языка
env.targets уточняет фактическую необходимость
трансформаций
Пример:
{
"jsc": {
"target": "es2017"
},
"env": {
"targets": {
"node": "14"
}
}
}
Поведение:
Параметр env.mode управляет стратегией анализа зависимостей
и полифилов.
{
"env": {
"mode": "usage",
"targets": {
"chrome": "80"
}
}
}
Особенности:
Принцип работы:
{
"env": {
"mode": "entry",
"targets": {
"chrome": "80"
}
}
}
Особенности:
Типичный сценарий:
import "core-js/stable";
import "regenerator-runtime/runtime";
SWC может учитывать необходимость полифилов через конфигурацию
env.
{
"env": {
"targets": {
"ie": "11"
},
"coreJs": "3"
}
}
Поведение:
Некоторые конфигурации SWC поддерживают учёт экспериментальных возможностей языка.
{
"env": {
"targets": {
"chrome": "90"
},
"shippedProposals": true
}
}
Эффект:
При конфигурации среды обычно учитываются три уровня:
Пример сбалансированной конфигурации:
{
"jsc": {
"target": "es2018"
},
"env": {
"targets": {
"chrome": "90",
"firefox": "88",
"safari": "14",
"node": "16"
},
"mode": "usage",
"coreJs": "3"
}
}
Если env не задан:
jsc.target
При таргетах уровня современных браузеров:
{
"env": {
"targets": {
"chrome": "120",
"firefox": "115"
}
}
}
наблюдается:
SWC использует приоритетную схему:
jsc.target
env.targets
env.mode