Глобальные объекты и полифилы

JavaScript исторически развивался сразу в нескольких средах, из-за чего понятие глобального объекта не является единым. В контексте трансформации кода SWC важно учитывать, что исходный код может предполагать наличие браузерных, Node.js или универсальных (isomorphic) глобальных сущностей.

В современных спецификациях ECMAScript стандартным глобальным объектом выступает globalThis. Он служит универсальной точкой доступа к глобальной области видимости во всех средах:

  • браузер: window
  • Node.js: global
  • web workers: self
  • универсально: globalThis

SWC при транспиляции не изменяет семантику глобального объекта, но влияет на доступность зависимых API через трансформации и полифилы. Поэтому при сборке критично учитывать целевую платформу через конфигурацию таргетов.


Различия глобальных сред и проблемы совместимости

При компиляции современного JavaScript в более старые окружения возникают несоответствия:

Отсутствие стандартных API

Старые браузеры и ранние версии Node.js не поддерживают:

  • Promise
  • Map, Set, WeakMap
  • Array.prototype.includes
  • Object.assign
  • fetch
  • globalThis

Разные системные глобальные переменные

  • Node.js использует process, Buffer
  • браузер использует document, window
  • тестовые среды могут подменять глобальный объект

SWC не добавляет такие сущности автоматически — они подключаются через полифилы или внешние библиотеки.


Полифилы и их роль в SWC

Полифилы представляют собой JavaScript-реализации стандартных API, отсутствующих в целевой среде выполнения. SWC поддерживает стратегию подключения полифилов через комбинацию:

  • core-js
  • regenerator-runtime
  • режимы usage и entry
  • внешние хелперы @swc/helpers

SWC сам по себе не реализует полифилинг — он лишь управляет тем, как и когда импортировать полифилы.


Подключение полифилов через core-js

Основной механизм совместимости основан на библиотеке core-js. Она предоставляет реализации современных стандартов ECMAScript.

В конфигурации SWC это управляется через секцию jsc.transform и env.

Пример логики:

  • coreJs: 3 — используется версия core-js@3
  • mode: “usage” — добавляет полифилы только для реально используемых возможностей
  • mode: “entry” — требует ручного импорта полифилов в точке входа

Поведение режимов

usage

  • анализирует AST
  • добавляет импорты автоматически
  • минимизирует размер бандла

entry

  • полагается на ручной импорт:

    import "core-js/stable";
    import "regenerator-runtime/runtime";

Regenerator Runtime и генераторы

Асинхронные функции и генераторы требуют поддержки runtime:

  • async/await
  • function*
  • yield

При транспиляции в старые окружения SWC превращает их в генераторные конструкции, требующие regenerator-runtime.

Без него результат компиляции может приводить к ошибкам выполнения в средах без native async support.


Глобальные хелперы SWC

SWC использует вспомогательные функции для снижения дублирования кода при транспиляции:

  • class inheritance helpers
  • async helpers
  • object spread helpers

Эти функции могут быть:

Инлайн-вставленными

Каждый файл содержит копии хелперов.

Вынесенными в общий пакет

Через @swc/helpers

Конфигурация:

{
  "jsc": {
    "externalHelpers": true
  }
}

В этом режиме SWC заменяет вставку кода на импорт из внешнего пакета, уменьшая размер сборки.


Обработка глобального объекта при трансформации

SWC учитывает особенности доступа к глобальным объектам при разных таргетах:

Прямой доступ

window.alert("test");

Может быть оставлен без изменений при browser target.

Универсальный доступ

globalThis.setTimeout(() => {}, 1000);

Такой код сохраняется без трансформации, так как globalThis является стандартом ECMAScript.

Node.js окружение

Для Node.js возможны сценарии, где требуется:

  • добавление process
  • поддержка Buffer
  • замена global на globalThis

SWC не выполняет автоматическую подмену глобальных объектов, но позволяет управлять целевыми платформами через targets.


Конфигурация targets и влияние на глобальные API

Целевая среда задаётся через:

{
  "jsc": {
    "target": "es2017"
  },
  "env": {
    "targets": {
      "chrome": "58",
      "node": "14"
    },
    "mode": "usage",
    "coreJs": "3"
  }
}

Эта настройка определяет:

  • какие синтаксические конструкции будут трансформированы
  • какие API требуют полифилов
  • какие глобальные сущности считаются нативными

Связь глобальных объектов и транспиляции синтаксиса

Глобальные объекты тесно связаны с трансформацией современных возможностей языка:

async/await

Требует:

  • regenerator-runtime
  • корректного Promise

spread оператор

Может требовать helper-функций для старых сред

class syntax

Использует runtime helpers при отсутствии native support

SWC анализирует используемые конструкции и решает, какие глобальные зависимости добавить.


Особенности работы с библиотечным кодом

При сборке библиотек поведение глобальных объектов должно быть максимально изолированным.

Рекомендуемые подходы:

  • использование globalThis вместо window или global
  • отключение агрессивных полифилов
  • external helpers вместо инлайна
  • минимизация side effects

Пример конфигурации для библиотек:

{
  "jsc": {
    "externalHelpers": true
  },
  "env": {
    "mode": "false"
  }
}

Это исключает автоматическое добавление полифилов, оставляя контроль за потребителем библиотеки.


Проблемы конфликтов полифилов

При подключении нескольких библиотек могут возникать конфликты:

  • дублирование core-js
  • несовместимые версии regenerator-runtime
  • повторное определение глобальных методов

SWC снижает риск конфликтов через:

  • external helpers
  • точечное подключение polyfill по usage mode
  • отсутствие глобального инжекта runtime

Глобальные объекты и tree-shaking поведения

Полифилы влияют на оптимизацию:

  • usage mode позволяет импортировать только необходимые части core-js
  • entry mode ухудшает tree-shaking из-за полного импорта

SWC генерирует ES-модули, что позволяет бандлерам:

  • удалять неиспользуемые полифилы
  • оптимизировать runtime зависимости

Итоговая модель взаимодействия глобальных объектов и SWC

SWC в системе глобальных объектов выполняет три ключевые функции:

  • трансформация синтаксиса с учётом целевой среды
  • управление подключением полифилов через core-js и regenerator-runtime
  • оптимизация runtime через external helpers и targets

При этом сам SWC не создаёт глобальные объекты и не модифицирует среду выполнения напрямую, ограничиваясь генерацией кода, совместимого с выбранными платформами.