Поле env.shippedProposals
### env.shippedProposals в SWC
Поле `env.shippedProposals` в конфигурации SWC определяет поведение компилятора при обработке предложений ECMAScript (TC39 proposals), которые уже считаются «поставляемыми» (shipped) в современных JavaScript-движках или находятся на финальных стадиях стандартизации, но ещё не гарантированно поддерживаются во всех целевых средах.
Основная задача этого параметра — управлять включением трансформаций, связанных с языковыми возможностями, которые выходят за пределы базового стандарта ECMAScript, но уже достаточно стабильны для использования в продакшене при определённых условиях.
---
## Роль shipped proposals в экосистеме SWC
SWC выполняет транспиляцию современного JavaScript/TypeScript в более совместимый код. Помимо классических стадий стандарта (ES3–ESNext), существует отдельный пласт синтаксических и семантических расширений языка:
* Stage 0–1 — ранние идеи
* Stage 2 — активная разработка
* Stage 3 — почти готово к стандарту
* Shipped proposals — реализованы в ряде движков или считаются де-факто стабильными
Поле `env.shippedProposals` отвечает именно за последний слой.
Когда параметр активен, SWC включает набор трансформаций для таких возможностей, чтобы обеспечить одинаковое поведение кода в средах, где эти фичи ещё отсутствуют или реализованы частично.
---
## Тип и базовое поведение
В типичной конфигурации SWC:
* `env.shippedProposals` имеет логический тип
* либо включается целиком (`true`)
* либо отключается полностью (`false`)
При значении `true` компилятор:
* активирует набор встроенных трансформаций для «почти стандартизированных» фич
* учитывает совместимость с указанными таргетами (`env.targets`)
* добавляет дополнительные шаги транспиляции поверх базового ESNext-пайплайна
При `false` SWC ограничивается только стандартными трансформациями, избегая обработки proposal-функциональности.
---
## Какие возможности затрагиваются
Конкретный набор трансформаций зависит от версии SWC, но обычно `shippedProposals` может включать поддержку таких категорий:
* новые операторы и синтаксические конструкции, уже реализованные в V8/SpiderMonkey
* экспериментальные встроенные методы объектов, перешедшие в стадию широкого внедрения
* улучшения классов и наследования
* изменения в семантике модулей
* оптимизированные паттерны работы с итераторами и асинхронностью
Важно понимать, что SWC не всегда транспилирует shipped proposals в «старый ES5», если это не требуется таргетами. Вместо этого он может лишь корректировать поведение для частичной совместимости.
---
## Взаимодействие с env.targets
Поле `env.shippedProposals` тесно связано с настройкой целевых платформ:
* `env.targets` определяет, какие окружения должны поддерживаться (браузеры, Node.js версии и т.д.)
* `env.shippedProposals` определяет, нужно ли включать дополнительный слой совместимости для современных, но не универсальных возможностей
Если таргет — современные версии Chrome, Edge или Node.js, многие shipped proposals уже нативно поддерживаются, и SWC может:
* либо не трансформировать код вовсе
* либо оставить минимальные полифиллы/патчи
Если таргет включает устаревшие среды, трансформации становятся более агрессивными.
---
## Поведение при включении (true)
При активированном `shippedProposals: true` происходит следующее:
1. Анализ AST выявляет конструкции, относящиеся к стабильным предложениям
2. SWC подбирает соответствующие трансформеры
3. Применяются преобразования до стадии генерации кода
4. Итоговый код становится более предсказуемым в разных движках
Это особенно важно для библиотек, которые:
* публикуются в npm
* должны работать в широком диапазоне версий Node.js
* используются в корпоративных средах с фиксированными версиями движков
---
## Поведение при отключении (false)
При `shippedProposals: false` SWC:
* игнорирует слой трансформаций proposal-функций
* оставляет код максимально близким к исходному ESNext
* уменьшает размер и сложность выходного кода
* повышает риск несовместимости в старых окружениях
Такой режим часто используется, когда:
* сборка предназначена только для современных браузеров
* вся совместимость обеспечивается на уровне runtime
* используется дополнительный Babel-пайплайн или другой транспайлер
---
## Производительность компиляции
Включение `shippedProposals` влияет на производительность сборки:
* увеличивается количество проходов по AST
* добавляются дополнительные visitors для трансформации узлов
* усложняется анализ зависимостей между синтаксическими паттернами
В больших проектах это может приводить к:
* незначительному увеличению времени компиляции
* росту потребления памяти на этапе трансформации
Однако SWC оптимизирован так, что разница обычно заметна только в монорепозиториях и крупных бандлах.
---
## Типичные сценарии использования
### Библиотеки общего назначения
Для библиотек, распространяемых через npm, `shippedProposals` чаще включают:
* требуется максимальная совместимость
* неизвестны конечные окружения пользователей
* важно избегать runtime-ошибок из-за отсутствующих фич
### Приложения под ограниченный стек
В приложениях под контролируемые среды параметр может быть отключён:
* фиксированные версии браузеров
* современный Node.js LTS
* использование native features без транспиляции
---
## Совместимость с TypeScript
SWC часто используется как альтернатива `tsc`. В связке с TypeScript:
* `env.shippedProposals` работает после удаления типов
* трансформации применяются к уже валидному JS AST
* не влияют на типовую систему напрямую
Особенно важно, что некоторые TS-конструкции могут компилироваться в код, который затем дополнительно обрабатывается shipped proposals трансформерами.
---
## Особенности поведения в edge-case сценариях
### Дублирование трансформаций
При комбинировании SWC с другими инструментами возможно:
* повторное преобразование одного и того же синтаксиса
* конфликт порядка трансформаций
* неожиданные различия в runtime поведении
### Tree-shaking и оптимизации
Включённые shipped proposals могут:
* усложнить статический анализ
* повлиять на удаление мёртвого кода
* изменить структуру AST так, что некоторые оптимизации становятся менее эффективными
---
## Архитектурная роль в pipeline SWC
Внутри пайплайна SWC `env.shippedProposals` находится между:
* парсингом исходного кода
* генерацией конечного JavaScript
И выступает как дополнительный слой семантических трансформаций, расширяющий базовый ESNext-компилятор.
Его можно рассматривать как переключатель уровня «строгости» компиляции:
* минимальный уровень — только синтаксис
* средний уровень — базовые трансформации ESNext
* расширенный уровень — shipped proposals + совместимость
---
## Практическое влияние на итоговый код
При включённом параметре итоговый JavaScript может:
* содержать дополнительные вспомогательные функции (helpers)
* иметь изменённую структуру классов или модулей
* включать полифилл-подобные вставки
* отличаться от исходника не только синтаксически, но и семантически
При этом основной принцип SWC сохраняется: предсказуемость и минимальная инвазивность трансформаций без необходимости полного полифиллинга среды выполнения.