Файл .swcrc является центральной точкой конфигурации для
SWC (Speedy Web Compiler) и определяет, каким образом исходный
JavaScript или TypeScript код будет трансформироваться. Он описывает
правила компиляции, плагины, пресеты, параметры JSX, модульную систему и
множество других аспектов, влияющих на результат сборки.
Файл .swcrc представляет собой JSON-документ. Это
принципиальный момент: несмотря на то, что SWC поддерживает разные
способы конфигурации (в том числе через JavaScript API и
swc.config.js в некоторых сценариях), именно JSON-формат
считается стандартным и наиболее широко используемым.
Структурно файл выглядит как объект верхнего уровня, содержащий набор ключей конфигурации:
{
"jsc": {
"parser": {
"syntax": "typescript"
},
"transform": null
},
"module": {
"type": "es6"
},
"minify": false
}
Любая ошибка в синтаксисе приводит к падению компиляции, поэтому
.swcrc должен быть валидным JSON.
.swcrc
SWC автоматически ищет файл .swcrc в файловой системе,
начиная с директории запуска процесса.
При запуске компиляции SWC выполняет поиск конфигурации по следующему принципу:
Таким образом, .swcrc может быть размещён:
project/
.swcrc
package.json
src/
index.ts
utils.ts
В данном случае один конфигурационный файл применяется ко всему проекту.
В монорепозиториях возможна ситуация, когда каждый пакет имеет
собственный .swcrc:
repo/
packages/
frontend/
.swcrc
src/
backend/
.swcrc
src/
SWC будет использовать конфигурацию, ближайшую к обрабатываемому файлу, что позволяет задавать разные правила трансформации для разных частей системы.
Файл .swcrc состоит из нескольких ключевых секций, каждая
из которых отвечает за определённую область трансформации.
jsc — ядро трансформации JavaScript
Основной блок конфигурации, определяющий поведение компилятора:
{
"jsc": {
"parser": {},
"transform": {},
"target": "es2020"
}
}
Отвечает за разбор исходного кода.
Пример:
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true
}
Возможные значения:
syntax: “ecmascript” | “typescript”
tsx: включает поддержку JSX в TypeScript
decorators: включает декораторы
dynamicImport: поддержка import()
Определяет правила трансформации AST.
"transform": {
"react": {
"runtime": "automatic"
}
}
Используется для:
Указывает целевую версию ECMAScript:
"target": "es2018"
Чем ниже target, тем более агрессивные преобразования применяются.
module — система модулей
Блок определяет формат выходных модулей.
{
"module": {
"type": "commonjs"
}
}
es6 — ES Modules
commonjs — CommonJS
umd — универсальный формат
amd — устаревший модульный стандарт
"module": {
"type": "es6",
"strict": true,
"noInterop": false
}
strict — строгая модульная семантика
noInterop — отключение interop между CJS и ESM
minify — минификация
SWC может использоваться как минификатор.
{
"minify": true
}
При включении доступны дополнительные настройки:
"minify": {
"compress": {
"unused": true
},
"mangle": true
}
compress — удаление мёртвого кода, упрощение выражений
mangle — переименование переменных
format — управление стилем вывода
sourceMaps
Управление генерацией sourcemaps:
{
"sourceMaps": true
}
Возможные значения:
true — генерация inline или external maps
false — отключение
“inline” — встроенные карты
“external” — отдельные .map файлы
exclude и include
Контроль области применения конфигурации:
{
"exclude": ["node_modules"],
"include": ["src"]
}
.swcrc
exclude имеет приоритет над include
SWC поддерживает каскадную модель конфигурации. Это означает, что:
.swcrc задаёт базовые правила
.swcrc могут переопределять их
Пример поведения:
root/.swcrc
packages/app/.swcrc
Если в корневом файле задан:
{
"module": { "type": "commonjs" }
}
а в локальном:
{
"module": { "type": "es6" }
}
то для packages/app будет использоваться es6.
Хотя .swcrc является стандартом, SWC также поддерживает:
–config-file)
Однако в этих случаях часто используется именно .swcrc как
базовый источник.
SWC не выполняет «мягкую» интерпретацию ошибок. При нарушении структуры:
Типичные ошибки:
syntax
module.type и
jsc.target
.swcrc
Типичный файл для TypeScript-проекта:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"target": "es2020"
},
"module": {
"type": "es6"
},
"sourceMaps": true
}
Для React-проекта:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic"
}
},
"target": "es2018"
},
"module": {
"type": "es6"
}
}
Для библиотек с CommonJS:
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"target": "es2017"
},
"module": {
"type": "commonjs"
}
}