SWC в экосистеме JavaScript используется как высокопроизводительная
альтернатива Babel, обеспечивающая трансформацию и сборку кода на уровне
компилятора, написанного на Rust. В связке с webpack он чаще всего
применяется через swc-loader, который заменяет традиционный
babel-loader и существенно ускоряет процесс сборки за счёт
многопоточности и низкоуровневой оптимизации.
Babel работает как JavaScript-трансформер, написанный на JavaScript. Он парсит исходный код в AST, применяет плагины и генераторы, затем снова возвращает JavaScript. Такой подход гибкий, но относительно медленный при больших проектах.
SWC (Speedy Web Compiler) реализован на Rust, что даёт следующие преимущества:
В контексте webpack это приводит к тому, что swc-loader
выполняет те же задачи, что и babel-loader, но значительно
быстрее при больших кодовых базах.
Перед заменой важно определить, какие задачи выполняет Babel:
SWC покрывает большинство этих задач, но имеет отличия в экосистеме плагинов.
Установка необходимых пакетов:
npm install -D @swc/core @swc/helpers swc-loader
или
yarn add -D @swc/core @swc/helpers swc-loader
Минимальная замена babel-loader выглядит следующим образом:
module.exports = {
module: {
rules: [
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
use: {
loader: "swc-loader",
options: {
jsc: {
parser: {
syntax: "typescript",
tsx: true,
jsx: true
},
transform: {
react: {
runtime: "automatic"
}
},
target: "es2020"
}
}
}
}
]
}
};
Ключевая особенность конфигурации — секция jsc, в которой
задаются правила парсинга и трансформации.
Типичная Babel-конфигурация:
{
presets: [
"@babel/preset-env",
"@babel/preset-react",
"@babel/preset-typescript"
]
}
Аналог в SWC:
{
jsc: {
parser: {
syntax: "typescript",
jsx: true
},
transform: {
react: {
runtime: "automatic"
}
},
target: "es2020"
}
}
SWC не использует пресеты в привычном виде. Вместо этого применяется декларативная конфигурация, которая ближе к компиляторной модели.
SWC поддерживает TypeScript без type-checking. Это критически важное отличие:
tsc –noEmit
Конфигурация TypeScript в SWC:
parser: {
syntax: "typescript",
tsx: true
}
При миграции важно не потерять этап проверки типов, иначе сборка будет успешной даже при наличии ошибок TypeScript.
SWC поддерживает современный JSX runtime:
transform: {
react: {
runtime: "automatic",
importSource: "react"
}
}
Разница с Babel заключается в отсутствии необходимости явно подключать
React в каждом файле при использовании нового JSX
трансформера.
Поле target определяет уровень генерации Jav * aScript:
es5 — максимальная совместимость;
es2015 — современный baseline;
es2020, es2022 — для современных браузеров и
сборок.
Пример:
target: "es2020"
SWC не добавляет полифиллы автоматически. Если проект использует старые
браузеры, необходимо отдельно подключать core-js или
аналогичные решения.
Процесс миграции сводится к последовательной замене loader-а в webpack-конфигурации:
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: ["@babel/preset-env", "@babel/preset-react"]
}
}
}
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
use: {
loader: "swc-loader",
options: {
jsc: {
parser: {
syntax: "typescript",
jsx: true
},
transform: {
react: {
runtime: "automatic"
}
},
target: "es2020"
}
}
}
}
После замены pipeline компиляции становится легче и быстрее, особенно при больших объемах файлов.
SWC не поддерживает экосистему Babel-плагинов напрямую. Логика трансформации должна быть реализована через:
Некоторые edge-case трансформации могут отличаться:
Это требует тестирования после миграции.
SWC автоматически использует многопоточность. Это влияет на:
SWC может использовать встроенное кеширование в связке с webpack cache:
cache: {
type: "filesystem"
}
В сочетании с swc-loader это даёт значительное ускорение
повторных сборок.
Основные факторы ускорения:
Поскольку SWC не проверяет типы, стандартная схема выглядит так:
{
"scripts": {
"build": "webpack",
"typecheck": "tsc --noEmit"
}
}
В CI пайплайне оба процесса выполняются отдельно:
SWC поддерживает декораторы в новом формате:
jsc: {
transform: {
legacyDecorator: false,
decoratorVersion: "2022-03"
}
}
При миграции важно учитывать различия между legacy decorators и современным стандартом TC39.
SWC поддерживает генерацию source maps:
sourceMaps: true
В webpack это часто комбинируется с:
devtool: "source-map"
Корректная настройка source maps критична для отладки после замены Babel.
SWC особенно эффективен в:
Ускорение достигается за счёт:
Сборка проходит, но TypeScript ошибки не обнаруживаются.
Решение: подключение tsc –noEmit.
Код зависел от специфических Babel-плагинов.
Решение: переписывание логики или отказ от трансформации.
React-компоненты ломаются при неправильной настройке runtime.
Решение: явно задать:
react: {
runtime: "automatic"
}
Старые браузеры получают современный JS без транспиляции.
Решение: корректный выбор target и полифиллов вне SWC.