Поле 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 и реальными потребностями фреймворков, позволяя тестировать будущие возможности до их стандартизации.