Поле jsc.experimental
### jsc.experimental в конфигурации SWC
Поле `jsc.experimental` в конфигурации SWC представляет собой набор флагов, включающих поддержку нестабильных или частично реализованных возможностей трансформации JavaScript/TypeScript. Эти опции находятся на границе между текущей стабильной реализацией компилятора и будущими спецификациями ECMAScript, поэтому их поведение может меняться между версиями SWC без сохранения обратной совместимости.
В архитектуре SWC (`Speedy Web Compiler`) поле `jsc` отвечает за всю JavaScript-часть пайплайна: парсинг, трансформации, генерацию кода. Внутри него `experimental` выделен как отдельный слой конфигурации, который активирует дополнительные преобразования, не включённые по умолчанию в основной набор `transform`.
---
### Роль experimental-режима в SWC
Основная задача `jsc.experimental` заключается в предоставлении доступа к:
* экспериментальным предложениям ECMAScript (stage 0–3)
* нестандартным расширениям синтаксиса
* переходным моделям поведения, которые ещё не закреплены в спецификации
* альтернативным стратегиям трансформации, требующим проверки в реальных проектах
Эти возможности часто используются в связке с современными фреймворками и сборщиками, где требуется опережающая поддержка будущих стандартов языка.
---
### Общая структура конфигурации
Фрагмент `.swcrc`, демонстрирующий расположение поля:
```json
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {},
"target": "es2020",
"experimental": {
"keepImportAssertions": true,
"plugins": []
}
}
}
```
Поле `experimental` всегда является вложенным объектом и интерпретируется только в контексте `jsc`. Оно не влияет на `module`, `minify` или другие верхнеуровневые настройки напрямую, но может изменять результат генерации AST и последующих трансформаций.
---
### Поддерживаемые экспериментальные возможности
Состав флагов внутри `jsc.experimental` зависит от версии SWC, однако логически они группируются по функциональным областям.
#### Поддержка нестандартных импортов
Одним из частых сценариев является управление поведением новых типов импортов:
* import assertions
* import attributes
* JSON modules и asset modules в связке с bundler-логикой
Флаг вида:
```json
{
"experimental": {
"keepImportAssertions": true
}
}
```
контролирует сохранение или удаление assertion-части при трансформации модулей. Это критично для пайплайнов, где downstream-бандлер должен получить исходную семантику импорта без деградации.
---
#### Плагинная экспериментальная система
Некоторые версии SWC допускают подключение экспериментальных трансформационных плагинов:
```json
{
"experimental": {
"plugins": [
["some-plugin-name", { "option": true }]
]
}
}
```
Такая система позволяет внедрять кастомные преобразования AST до или после основных трансформаций `jsc.transform`. Это используется для:
* внедрения нестандартных синтаксических расширений
* корпоративных DSL поверх JavaScript
* миграционных трансформаций кода
При этом выполнение плагинов может влиять на производительность компиляции, так как нарушает оптимизированный поток SWC.
---
#### Экспериментальные трансформации stage-пропозалов
SWC периодически добавляет поддержку proposal-ов ECMAScript до их финализации. Включение таких трансформаций может происходить через `experimental` либо через `transform` в зависимости от версии, но концептуально они относятся к одной категории.
Примеры направлений:
* decorators (legacy vs standard)
* pipeline operator
* record/tuple proposals (исторически экспериментальные)
* private methods/fields в нестандартных режимах совместимости
Поведение таких трансформаций может различаться между minor-версиями SWC, что делает их использование чувствительным к фиксации версии компилятора.
---
### Взаимодействие с parser и transform
`jsc.experimental` не является изолированным слоем. Его влияние распространяется на несколько этапов:
#### Парсинг (parser)
Некоторые экспериментальные флаги требуют расширенного синтаксического анализа. Это приводит к изменению грамматики, которую использует SWC при построении AST. Например, поддержка новых видов импортов может изменять структуру узлов уже на этапе парсинга.
#### Трансформация (transform)
Основное влияние происходит на этапе трансформации AST. Здесь experimental-флаги могут:
* изменять порядок применения трансформаций
* включать дополнительные проходы по дереву
* модифицировать правила генерации совместимого ES-кода
#### Генерация кода (codegen)
В отдельных случаях experimental-настройки влияют на финальный output, например:
* сохранение нестандартных синтаксических конструкций
* генерация метаданных для downstream-инструментов
* контроль за сохранением оригинальных модульных спецификаторов
---
### Совместимость с target
Поле `target` внутри `jsc` определяет уровень ECMAScript, к которому приводится код. `jsc.experimental` может конфликтовать с `target`, если экспериментальная функция требует более нового синтаксиса, чем указанный target допускает.
Типичная модель поведения SWC:
* `target` задаёт верхнюю границу совместимости
* `experimental` может временно «обходить» ограничения, вводя нестандартные преобразования
* итоговый результат может содержать полифилоподобные конструкции или расширенные паттерны
---
### Типичные сценарии использования
#### Интеграция с современными фреймворками
Фреймворки, использующие нестабильные спецификации ECMAScript, часто требуют включения experimental-режимов для корректной работы компиляции без дополнительных плагинов Babel.
#### Монорепозитории с нестандартными загрузчиками модулей
При использовании кастомных loaders (например, в связке с Node.js ESM hooks) важно сохранять оригинальные import assertions и метаданные модулей.
#### Постепенная миграция к новым стандартам
Experimental-флаги позволяют включать новые возможности языка до их финализации, сохраняя возможность быстрого отката через конфигурацию без изменения исходного кода.
---
### Поведенческие особенности и ограничения
Использование `jsc.experimental` сопровождается рядом системных особенностей:
* отсутствие гарантий стабильности между версиями SWC
* возможные различия output при одинаковой конфигурации на разных minor-версиях
* повышенная зависимость от версии парсера и трансформеров
* потенциальная несовместимость с некоторыми оптимизациями minifier-а
В некоторых случаях experimental-режим может отключать часть оптимизаций ради сохранения корректности синтаксической трансформации.
---
### Влияние на производительность
Добавление экспериментальных трансформаций обычно увеличивает стоимость компиляции. Основные причины:
* дополнительные проходы по AST
* отсутствие агрессивного кэширования для нестабильных правил
* необходимость проверки нескольких вариантов трансформации
В высоконагруженных сборках использование `jsc.experimental` часто ограничивается минимально необходимым набором флагов.
---
### Конфигурационные паттерны
#### Минимальный experimental-набор
```json
{
"jsc": {
"experimental": {}
}
}
```
#### Сохранение import assertions
```json
{
"jsc": {
"experimental": {
"keepImportAssertions": true
}
}
}
```
#### Плагинная расширяемость
```json
{
"jsc": {
"experimental": {
"plugins": [
["transform-custom-syntax", {}]
]
}
}
}
```
---
### Взаимодействие с экосистемой SWC
`jsc.experimental` тесно связан с общей философией SWC как высокопроизводительного компилятора, ориентированного на быстрые итерации поддержки языка. Экспериментальные флаги выступают как механизм обратной связи между спецификацией ECMAScript и реальными потребностями фреймворков, позволяя тестировать будущие возможности до их стандартизации.