Конфигурация SWC строится вокруг единого объекта, который определяет поведение трансформации кода на уровне синтаксиса, модулей, полифиллов, минификации и генерации исходных карт. Несмотря на внешнюю компактность, структура этого объекта охватывает несколько независимых подсистем компилятора, каждая из которых влияет на отдельный этап обработки исходного кода.
Конфигурационный объект SWC условно делится на несколько ключевых блоков:
Каждый блок выполняет строго определённую роль и обрабатывается отдельными частями компилятора.
jsc: ядро трансформации кода
Блок jsc является центральной частью конфигурации и
определяет, как именно SWC интерпретирует и преобразует исходный код.
Основная структура:
{
"jsc": {
"parser": {},
"transform": {},
"target": "",
"loose": false,
"externalHelpers": false,
"keepClassNames": false,
"preserveAllComments": false
}
}
parser: разбор исходного кода
Раздел parser отвечает за синтаксический разбор. Он
определяет язык и расширения, которые поддерживаются на этапе парсинга.
Ключевые параметры:
syntax — базовый синтаксис:
“ecmascript”
“typescript”
“jsx”
jsx — включение поддержки JSX-выражений
tsx — расширение JSX для TypeScript
dynamicImport — поддержка import()
decorators — поддержка декораторов (в различных спецификациях)
decoratorsBeforeExport — старое поведение декораторов
Пример конфигурации:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true,
"dynamicImport": true
}
}
}
Парсер определяет AST-структуру, которая далее используется всеми трансформациями.
transform: преобразование AST
Блок transform управляет преобразованиями синтаксиса и
добавлением вспомогательных конструкций.
Основные подпараметры:
react
{
"transform": {
"react": {
"runtime": "automatic",
"importSource": "react",
"refresh": false
}
}
}
runtime:
“automatic” — JSX без явного
React.createElement
“classic” — старый режим React
refresh — включение Fast Refresh (используется в
dev-средах)
legacyDecorator / decoratorMetadata
legacyDecorator — поддержка старого синтаксиса декораторов
decoratorMetadata — генерация метаданных для декораторов
optimizer
Оптимизатор выполняет локальные преобразования AST:
target: целевая версия JavaScript
Поле target определяет уровень ECMAScript, в который будет
транспилирован код:
“es3”
“es5”
“es2015”
“es2017”
“es2020”
“es2022”
Это влияет на генерацию синтаксиса и доступность современных конструкций.
loose: упрощённые преобразования
Режим loose включает менее строгие, но более быстрые и
компактные трансформации. В этом режиме SWC может отступать от точной
спецификации ECMAScript в пользу производительности.
externalHelpers
Позволяет выносить вспомогательные функции (helpers) в отдельный модуль вместо инлайна в каждый файл. Это уменьшает размер бандла при большом количестве файлов.
keepClassNames
Сохраняет оригинальные имена классов после трансформации, что важно для логирования и некоторых фреймворков отражения типов.
module: система модулей
Раздел module определяет формат модулей, в который будет
преобразован код.
{
"module": {
"type": "es6"
}
}
Поддерживаемые типы:
“es6” — ES Modules
“commonjs” — Node.js require/module.exports
“amd” — Asynchronous Module Definition
“umd” — универсальный формат
“systemjs” — SystemJS loader
Дополнительные параметры:
“use strict”
Выбор типа модулей критически влияет на совместимость с окружением исполнения.
minify: минификация кода
Минификация в SWC реализована как отдельный слой обработки AST.
{
"minify": {
"compress": true,
"mangle": true
}
}
compress
Включает оптимизации:
mangle
Переименование идентификаторов для уменьшения размера:
При этом глобальные имена могут быть защищены через настройки исключений.
sourceMaps: карты исходного кода
Source maps связывают трансформированный код с оригинальным.
Возможные значения:
false — отключено
true — генерация .map
“inline” — встроенные карты в файл
{
"sourceMaps": true
}
Этот механизм критически важен для отладки после транспиляции.
env: транспиляция под окружения
Блок env отвечает за полифиллы и адаптацию под конкретные
runtime-окружения.
{
"env": {
"targets": {
"chrome": "80",
"node": "18"
},
"mode": "usage",
"coreJs": "3"
}
}
targets
Определяет целевые платформы:
mode
“usage” — добавляет полифиллы только при использовании
конкретных API
“entry” — добавляет полифиллы на уровне входной точки
coreJs
Версия библиотеки полифиллов core-js, используемая для совместимости.
isModule
Указывает, является ли входной файл модулем. Это влияет на обработку import/export.
include и exclude
Фильтрация файлов:
include — список путей для обработки
exclude — исключения (node_modules, dist и т.д.)
test
Позволяет применять конфигурацию только к определённым файлам по шаблону (regex или glob).
cwd
Определяет рабочую директорию, от которой строятся относительные пути.
При использовании @swc/core конфигурация передаётся
напрямую в функцию компиляции:
import { transform } from "@swc/core";
const result = await transform(code, {
jsc: {
parser: {
syntax: "typescript"
},
target: "es2020"
},
module: {
type: "commonjs"
},
sourceMaps: true
});
Здесь структура объекта полностью соответствует .swcrc, но
может дополняться полями:
filename — имя входного файла
inputSourceMap — внешняя source map
minify — включение минификации на лету
Каждый блок конфигурации SWC работает на своём этапе пайплайна:
parser формирует AST
jsc.transform модифицирует AST
env добавляет совместимость
module перестраивает систему модулей
minify оптимизирует результат
sourceMaps связывает итог с исходным кодом
Такая последовательность делает конфигурационный объект не просто набором опций, а описанием полного компиляционного конвейера.