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