Поле jsc.target
Поле `target` внутри блока `jsc` в конфигурации SWC определяет целевую версию JavaScript, в которую будет транслироваться исходный код. Это один из ключевых параметров компиляции, напрямую влияющий на форму итогового AST-преобразования и набор используемых синтаксических трансформаций. От выбранного значения зависит совместимость с окружениями выполнения, поведение полифиллов на уровне трансформаций и степень агрессивности понижения синтаксиса.
### Назначение и роль в процессе трансформации
На этапе компиляции SWC анализирует исходный код и применяет набор преобразований, соответствующий выбранной целевой версии ECMAScript. Параметр `target` выступает как верхняя граница допустимого синтаксиса в выходном коде.
Если исходный код содержит конструкции, не поддерживаемые целевой версией, они переписываются в эквивалентные более старые паттерны. Если конструкция уже совместима с целевой версией, трансформация может быть пропущена, что снижает объем итогового кода и ускоряет компиляцию.
Основной принцип работы:
* `target` задаёт минимально допустимую версию JavaScript для выходного кода
* все конструкции новее указанной версии трансформируются
* код, уже совместимый с целью, сохраняется без изменений
### Поддерживаемые значения и семантика
SWC поддерживает набор ECMAScript-таргетов, соответствующих историческим версиям спецификации:
* `es3`
* `es5`
* `es2015`
* `es2016`
* `es2017`
* `es2018`
* `es2019`
* `es2020`
* `es2021`
* `es2022`
* `es2023`
* `esnext`
Каждое значение не просто ограничивает синтаксис, но и влияет на стратегию генерации вспомогательных конструкций.
#### ES3 и ES5
Цели уровня ES3/ES5 предполагают максимально агрессивную трансформацию:
* классы преобразуются в функции-конструкторы
* стрелочные функции превращаются в обычные функции с привязкой контекста при необходимости
* `const` и `let` заменяются на `var`
* шаблонные строки превращаются в конкатенацию
* деструктуризация раскрывается в последовательность присваиваний
При `es3` дополнительно учитываются ограничения старых сред выполнения, включая отсутствие строгой поддержки `Object.defineProperty` и современных встроенных методов.
#### ES2015–ES2020
На этом уровне трансформации становятся более избирательными:
* классы могут сохраняться частично, но с полифиллом наследования при необходимости
* `async/await` трансформируется в генераторы с runtime-обвязкой
* модули могут быть преобразованы в CommonJS или другие форматы через связку с `module`
* опционально обрабатываются `for..of`, `Map`, `Set` при наличии соответствующих плагинов
#### ES2021 и выше
Начиная с ES2021, SWC минимизирует трансформации:
* современные логические операторы сохраняются
* приватные поля классов могут либо транслироваться, либо сохраняться в зависимости от настроек
* optional chaining и nullish coalescing часто остаются без изменений при целевом окружении
#### ESNext
Режим `esnext` отключает большинство трансформаций, оставляя код максимально близким к исходному. Применяются только те преобразования, которые необходимы для совместимости с самим пайплайном сборки или включёнными плагинами.
### Влияние на генерацию AST и пайплайн SWC
Внутренне SWC опирается на Rust-реализацию компилятора, где `target` влияет на выбор visitor-цепочек трансформации AST. При построении пайплайна учитываются:
* набор активных трансформеров (`transform plugins`)
* уровень синтаксической совместимости
* необходимость вставки runtime helpers
Примерно процесс выглядит так:
1. Парсинг исходного кода в AST
2. Определение целевого уровня через `jsc.target`
3. Выбор набора трансформаций
4. Применение visitor-паттерна к дереву
5. Генерация итогового JavaScript
Чем ниже `target`, тем больше проходов по AST и тем выше стоимость компиляции.
### Связь с другими параметрами `jsc`
Поле `target` не работает изолированно. Оно тесно связано с другими параметрами блока `jsc`.
#### module
Определяет формат модулей (CommonJS, ES Modules, AMD и др.). Даже при высоком `target` модульная система может быть понижена независимо.
#### parser
Парсер способен принимать современный синтаксис независимо от `target`, однако именно `target` определяет, будет ли он трансформирован.
#### transform
Флаг трансформаций (`transform`) может включать или отключать дополнительные преобразования, но итоговая степень понижения всё равно ограничивается `target`.
#### minify
Минификация использует `target` для принятия решений о допустимых оптимизациях. Например, некоторые оптимизации невозможны без изменения семантики в старых версиях JS.
### Практическое влияние на синтаксис
Различие между целевыми версиями особенно заметно на сложных конструкциях.
#### Async/await
При низких `target`:
* преобразуется в генераторы
* добавляется runtime-обёртка
* увеличивается размер бандла
При `es2017+`:
* может сохраняться без изменений
* либо частично транспилироваться в зависимости от окружения
#### Classes
При `es5`:
* превращаются в функции
* наследование реализуется через helper `_inherits`
* свойства экземпляра переносятся в конструктор
При `es2015+`:
* сохраняется ближе к оригиналу
* трансформации минимальны
#### Optional chaining
При старых `target`:
* превращается в цепочку условных проверок
* добавляются временные переменные
При новых:
* сохраняется как есть
### Runtime helpers и их зависимость от target
Некоторые трансформации требуют вспомогательных функций. SWC может инжектировать их автоматически.
Типичные helpers:
* `_extends`
* `_class_call_check`
* `_async_to_generator`
* `_interop_require_default`
Чем ниже `target`, тем выше вероятность появления таких функций. Это влияет на:
* размер итогового бандла
* количество дублируемого кода
* кэшируемость модулей
### Конфигурационные сценарии
#### Современные браузеры
```json
{
"jsc": {
"target": "es2022"
}
}
```
Характеристика:
* минимальные трансформации
* высокая скорость сборки
* сохранение современного синтаксиса
#### Универсальная поддержка
```json
{
"jsc": {
"target": "es2018"
}
}
```
Характеристика:
* баланс совместимости и производительности
* частичная транспиляция async/await
* ограниченные runtime helpers
#### Legacy-окружения
```json
{
"jsc": {
"target": "es5"
}
}
```
Характеристика:
* максимальная совместимость
* глубокая трансформация AST
* значительное увеличение объёма кода
### Влияние на производительность компиляции
Снижение `target` увеличивает нагрузку на компилятор по нескольким причинам:
* расширяется набор активных трансформаций
* увеличивается глубина обхода AST
* возрастает количество генерируемых узлов дерева
* требуется больше операций нормализации кода
При `esnext` компиляция может быть существенно быстрее за счёт минимального числа преобразований.
### Особенности взаимодействия с TypeScript
При использовании SWC как транслятора TypeScript:
* `target` влияет только на JavaScript-часть вывода
* типы полностью удаляются до применения `target`
* декораторы и experimental features могут требовать отдельной настройки
Синтаксис TypeScript сначала понижается до JavaScript уровня AST, затем применяется логика `jsc.target`.
### Edge-cases и неоднозначные сценарии
#### Несовпадение target и runtime
Возможна ситуация, когда `target` выставлен выше, чем поддержка среды выполнения. В этом случае SWC не добавляет полифиллы автоматически, что приводит к ошибкам исполнения.
#### Конфликт с внешними транспиляторами
При цепочке Babel → SWC или SWC → Babel возможны:
* двойные трансформации async/await
* дублирование helpers
* деградация читаемости кода
#### Tree-shaking и target
Хотя `target` не управляет tree-shaking напрямую, он влияет на структуру кода, что косвенно может затруднить статический анализ:
* добавленные helper-функции усложняют граф зависимостей
* преобразованные конструкции менее предсказуемы для оптимизаторов
### Архитектурная значимость
Поле `jsc.target` выступает центральной точкой управления компромиссом между:
* совместимостью с окружениями
* размером итогового кода
* скоростью компиляции
* сохранением современного синтаксиса
Его значение определяет стратегию всей цепочки трансформации, а не только отдельные синтаксические преобразования, формируя базовую модель поведения SWC как компилятора JavaScript.