JavaScript исторически развивался сразу в нескольких средах, из-за чего понятие глобального объекта не является единым. В контексте трансформации кода SWC важно учитывать, что исходный код может предполагать наличие браузерных, Node.js или универсальных (isomorphic) глобальных сущностей.
В современных спецификациях ECMAScript стандартным глобальным объектом
выступает globalThis. Он служит универсальной точкой
доступа к глобальной области видимости во всех средах:
window
global
self
globalThis
SWC при транспиляции не изменяет семантику глобального объекта, но влияет на доступность зависимых API через трансформации и полифилы. Поэтому при сборке критично учитывать целевую платформу через конфигурацию таргетов.
При компиляции современного JavaScript в более старые окружения возникают несоответствия:
Старые браузеры и ранние версии Node.js не поддерживают:
Promise
Map, Set, WeakMap
Array.prototype.includes
Object.assign
fetch
globalThis
process, Buffer
document, window
SWC не добавляет такие сущности автоматически — они подключаются через полифилы или внешние библиотеки.
Полифилы представляют собой JavaScript-реализации стандартных API, отсутствующих в целевой среде выполнения. SWC поддерживает стратегию подключения полифилов через комбинацию:
core-js
regenerator-runtime
usage и entry
@swc/helpers
SWC сам по себе не реализует полифилинг — он лишь управляет тем, как и когда импортировать полифилы.
Основной механизм совместимости основан на библиотеке
core-js. Она предоставляет реализации современных
стандартов ECMAScript.
В конфигурации SWC это управляется через секцию
jsc.transform и env.
Пример логики:
coreJs: 3 — используется версия core-js@3
mode: “usage” — добавляет полифилы только для реально
используемых возможностей
mode: “entry” — требует ручного импорта полифилов в точке
входа
usage
entry
полагается на ручной импорт:
import "core-js/stable";
import "regenerator-runtime/runtime";
Асинхронные функции и генераторы требуют поддержки runtime:
async/await
function*
yield
При транспиляции в старые окружения SWC превращает их в генераторные
конструкции, требующие regenerator-runtime.
Без него результат компиляции может приводить к ошибкам выполнения в средах без native async support.
SWC использует вспомогательные функции для снижения дублирования кода при транспиляции:
Эти функции могут быть:
Каждый файл содержит копии хелперов.
Через @swc/helpers
Конфигурация:
{
"jsc": {
"externalHelpers": true
}
}
В этом режиме SWC заменяет вставку кода на импорт из внешнего пакета, уменьшая размер сборки.
SWC учитывает особенности доступа к глобальным объектам при разных таргетах:
window.alert("test");
Может быть оставлен без изменений при browser target.
globalThis.setTimeout(() => {}, 1000);
Такой код сохраняется без трансформации, так как globalThis
является стандартом ECMAScript.
Для Node.js возможны сценарии, где требуется:
process
Buffer
global на globalThis
SWC не выполняет автоматическую подмену глобальных объектов, но
позволяет управлять целевыми платформами через targets.
Целевая среда задаётся через:
{
"jsc": {
"target": "es2017"
},
"env": {
"targets": {
"chrome": "58",
"node": "14"
},
"mode": "usage",
"coreJs": "3"
}
}
Эта настройка определяет:
Глобальные объекты тесно связаны с трансформацией современных возможностей языка:
Требует:
regenerator-runtime
Promise
Может требовать helper-функций для старых сред
Использует runtime helpers при отсутствии native support
SWC анализирует используемые конструкции и решает, какие глобальные зависимости добавить.
При сборке библиотек поведение глобальных объектов должно быть максимально изолированным.
Рекомендуемые подходы:
globalThis вместо window или
global
Пример конфигурации для библиотек:
{
"jsc": {
"externalHelpers": true
},
"env": {
"mode": "false"
}
}
Это исключает автоматическое добавление полифилов, оставляя контроль за потребителем библиотеки.
При подключении нескольких библиотек могут возникать конфликты:
core-js
regenerator-runtime
SWC снижает риск конфликтов через:
Полифилы влияют на оптимизацию:
usage mode позволяет импортировать только необходимые части
core-js
entry mode ухудшает tree-shaking из-за полного импорта
SWC генерирует ES-модули, что позволяет бандлерам:
SWC в системе глобальных объектов выполняет три ключевые функции:
core-js и
regenerator-runtime
При этом сам SWC не создаёт глобальные объекты и не модифицирует среду выполнения напрямую, ограничиваясь генерацией кода, совместимого с выбранными платформами.