Экосистема SWC построена как модульный набор пакетов, разделяющих компиляцию, интерфейсы взаимодействия и вспомогательные runtime-компоненты. Такая архитектура позволяет использовать SWC как внутри сборщиков (Next.js, Vite-плагины, Webpack-лоадеры), так и напрямую в CLI или серверных инструментах.
SWC реализует компиляцию JavaScript и TypeScript на языке Rust, что обеспечивает значительный прирост скорости по сравнению с традиционными JS-трансформерами. Однако ключевое значение в реальной разработке имеет не только ядро, но и взаимодействие между пакетами @swc/core, @swc/cli и @swc/helpers.
Экосистема разделена на три основных уровня:
Такое разделение позволяет:
@swc/core представляет собой
низкоуровневый API, который предоставляет доступ к функциям
трансформации, парсинга и минификации. Это основной слой, через который
проходят все операции компиляции.
Он используется:
Наиболее часто используемая функция — transform:
import { transform } from "@swc/core";
const result = await transform("const x = (a) => a + 1;", {
jsc: {
parser: {
syntax: "ecmascript"
},
transform: {
arrowFunctions: true
}
}
});
console.log(result.code);
SWC выполняет преобразование AST, используя Rust-реализацию, что обеспечивает высокую скорость обработки даже больших файлов.
@swc/core предоставляет возможность
получить AST:
import { parse } from "@swc/core";
const ast = await parse("let a = 10;", {
syntax: "ecmascript"
});
AST используется для:
SWC включает встроенный минификатор:
import { minify } from "@swc/core";
const result = await minify("function test() { return 1 + 2; }", {
compress: true,
mangle: true
});
Минификация включает:
Основная конфигурация лежит в объекте jsc:
{
jsc: {
parser: {
syntax: "typescript",
tsx: true
},
target: "es2020",
transform: {},
minify: {}
}
}
Ключевые параметры:
syntax — выбор JavaScript/TypeScript/JSX
target — версия ECMAScript
transform — включение трансформаций
minify — настройки минификации
Ключевое отличие от Babel заключается в архитектуре:
Это приводит к:
@swc/cli
— это оболочка над @swc/core, предоставляющая доступ к
его возможностям через терминал. Он не реализует компиляцию
самостоятельно, а делегирует её ядру.
Основные сценарии:
npx swc src -d dist
Команда:
src,
dist.
CLI автоматически читает .swcrc:
{
"jsc": {
"parser": {
"syntax": "typescript"
},
"target": "es2019"
},
"module": {
"type": "commonjs"
}
}
Это позволяет отделить конфигурацию от кода.
npx swc src -d dist -w
CLI отслеживает изменения файлов и пересобирает их.
Поддерживается .swcignore, аналог .gitignore:
node_modules
dist
CLI автоматически распараллеливает обработку файлов, используя многопоточность через ядро SWC.
CLI часто применяется:
@swc/helpers содержит набор
функций, которые вставляются в итоговый код при трансформации. Они
необходимы для поддержки современных синтаксических конструкций в старых
окружениях.
Основная задача — избежать дублирования вспомогательного кода в каждом файле.
При трансформации class или async/await SWC
может генерировать вспомогательные функции:
class A {
method() {}
}
После трансформации может появиться использование helper-функций вместо инлайновой логики.
Пакет включает:
Вариант 1: автоматическая вставка
{
"jsc": {
"transform": {
"legacyDecorator": true
}
}
}
SWC автоматически добавляет импорты helpers.
Вариант 2: ручное использование
import { _async_to_generator } from "@swc/helpers";
function fn() {
return _async_to_generator(function* () {
yield 1;
});
}
Одно из преимуществ — возможность импортировать только используемые функции:
Без оптимизации helpers могут увеличивать размер output, однако:
Эти пакеты образуют единую цепочку:
npx swc src -d dist
Процесс:
CLI не содержит собственной логики трансформации. Любая конфигурация
.swcrc напрямую передаётся в core.
Helpers подключаются только если:
CLI:
SWC используется через loader:
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: {
loader: "swc-loader"
}
}
]
}
};
Использует SWC через плагины:
SWC интегрирован как основной транспилятор:
Экосистема формируется вокруг принципа разделения ответственности:
Такое разделение делает систему гибкой: core можно использовать как библиотеку, CLI как инструмент, а helpers как минимальный runtime-слой для совместимости JavaScript-версий.