Соответствие babel-плагинов возможностям SWC
## Общая модель соответствия Babel-плагинов и SWC
SWC и Babel решают задачу трансформации JavaScript/TypeScript кода, но фундаментально различаются по архитектуре. Babel строится вокруг плагинной системы, где каждое преобразование — это JavaScript-функция, работающая с AST. SWC реализован на Rust и использует иной подход: вместо гибкой, но относительно медленной плагинной системы, он предоставляет набор встроенных трансформаций и ограниченный механизм расширения.
Соответствие между Babel-плагинами и SWC не является прямым 1:1. В большинстве случаев речь идёт о сопоставлении *функциональных эффектов*, а не конкретных API.
---
## Архитектурные различия, влияющие на совместимость
### Babel
* Полностью модульная система трансформаций
* Каждый плагин имеет доступ к AST через @babel/traverse
* Возможность тонкой модификации узлов дерева
* Высокая гибкость, но более низкая производительность
### SWC
* Ядро написано на Rust
* Трансформации реализованы как высокопроизводительные проходы
* Ограниченная или отсутствующая пользовательская плагинность (в классическом смысле Babel)
* Фокус на скорости компиляции
Ключевая проблема соответствия: **Babel позволяет произвольные трансформации AST, SWC — только заранее реализованные стратегии**.
---
## Категории Babel-плагинов и их эквиваленты в SWC
### 1. Синтаксические преобразования (Syntax transforms)
Это наиболее полная зона совместимости.
#### Babel:
* `@babel/plugin-transform-arrow-functions`
* `@babel/plugin-transform-block-scoping`
* `@babel/plugin-transform-classes`
* `@babel/plugin-transform-template-literals`
#### SWC:
Все перечисленные трансформации встроены в пресеты:
* `env` / `es2015` / `es2020`
* `jsc.transform` в конфигурации SWC
Пример SWC-конфигурации:
```json
{
"jsc": {
"parser": {
"syntax": "ecmascript"
},
"transform": {
"legacyDecorator": false,
"arrow": true,
"letConsts": true,
"class": true
}
}
}
```
Вывод: синтаксические плагины Babel почти полностью покрываются SWC.
---
### 2. Polyfill-инъекции и runtime transforms
#### Babel:
* `@babel/plugin-transform-runtime`
* `@babel/preset-env` с core-js
* автоматическая вставка helpers
#### SWC:
* `@swc/helpers` вместо babel helpers
* интеграция через bundler (Webpack, Vite, Next.js)
* ограниченная автоматизация polyfill
SWC не занимается полноценной инъекцией polyfill-ов. Это перекладывается на:
* `core-js` (вручную или через bundler)
* `@swc/helpers`
Ключевое отличие:
> Babel управляет runtime трансформациями, SWC — только синтаксисом и минимальными helper-ами.
---
### 3. TypeScript и Flow
#### Babel:
* `@babel/preset-typescript`
* `@babel/preset-flow`
#### SWC:
* нативный парсинг TypeScript
* `jsc.parser.syntax = "typescript"`
SWC:
* удаляет типы без type-checking
* не выполняет полноценную проверку типов
Соответствие:
* Babel TypeScript preset → SWC TypeScript parser
Важно:
> SWC не является TypeScript compiler (tsc), а только stripper типов.
---
### 4. JSX трансформации
#### Babel:
* `@babel/preset-react`
* `@babel/plugin-transform-react-jsx`
#### SWC:
* встроенная JSX трансформация
* `jsc.transform.react`
Пример:
```json
{
"jsc": {
"transform": {
"react": {
"runtime": "automatic",
"pragma": "React.createElement"
}
}
}
}
```
Соответствие:
* React JSX Babel preset → SWC React transform
SWC часто используется в React-фреймворках (например, Next.js) именно из-за скорости JSX-компиляции.
---
### 5. Мутации AST (кодовые модификации)
#### Babel:
Примеры:
* `babel-plugin-transform-remove-console`
* `babel-plugin-transform-rename-import`
* кастомные плагины
#### SWC:
* ограниченные встроенные transforms:
* minify options
* import stripping (частично)
* dead code elimination (в minifier)
SWC не поддерживает произвольные AST-плагины.
Соответствие:
| Babel плагин | SWC эквивалент |
| ---------------------------- | ---------------------- |
| remove-console | minify.console = true |
| remove-debugger | minify.compress |
| inline-environment-variables | частично через bundler |
---
### 6. Оптимизационные плагины
#### Babel:
* `babel-plugin-lodash`
* `babel-plugin-import`
* `babel-plugin-transform-react-remove-prop-types`
#### SWC:
* часть логики перенесена в bundler (Turbopack, Webpack loaders)
* minify stage SWC
SWC не реализует granular tree-shaking на уровне Babel-плагинов.
---
## SWC Minifier и соответствие Babel-плагинам
SWC имеет встроенный minifier, который покрывает часть Babel-экосистемы:
### Babel-эквиваленты:
* `babel-plugin-minify-dead-code-elimination`
* `babel-plugin-minify-constant-folding`
* `babel-plugin-transform-inline-consecutive-adds`
### SWC:
```json
{
"minify": true,
"jsc": {
"minify": {
"compress": true,
"mangle": true
}
}
}
```
SWC minifier:
* быстрее Terser
* менее гибкий
* не поддерживает кастомные плагины
---
## Ограничения соответствия Babel → SWC
### 1. Отсутствие произвольных плагинов
Babel:
* можно написать любой AST transform
SWC:
* только встроенные трансформации
Следствие:
> многие Babel-плагины не имеют аналога в SWC.
---
### 2. Различия в AST модели
Babel AST:
* ESTree + Babel extensions
SWC AST:
* swc_ecma_ast (Rust структура)
Это делает невозможным прямую миграцию плагинов.
---
### 3. Ограниченность runtime-логики
Babel:
* может анализировать контекст
* может модифицировать код на основе внешних данных
SWC:
* статические трансформации без динамической логики
---
## Практическая таблица соответствий
### Core трансформации
| Babel | SWC |
| ------------------------- | ---------------------- |
| preset-env | jsc.target + transform |
| preset-react | jsc.transform.react |
| preset-typescript | jsc.parser.typescript |
| transform-classes | jsc.transform.class |
| transform-arrow-functions | jsc.transform.arrow |
---
### Helper/runtime
| Babel | SWC |
| ------------------- | ------------------- |
| transform-runtime | @swc/helpers |
| regenerator-runtime | внешняя зависимость |
| core-js injection | внешняя сборка |
---
### Оптимизация
| Babel | SWC |
| ---------------------------- | --------------- |
| babel-minify | swc minify |
| remove-console plugin | minify.console |
| dead-code elimination plugin | minify.compress |
---
## Где SWC не заменяет Babel
SWC не покрывает:
* сложные кастомные AST трансформации
* экспериментальные плагины экосистемы Babel
* Babel macros (`babel-plugin-macros`)
* условную трансформацию на основе анализа зависимостей
* глубокую модификацию импортов по правилам пользователя
---
## Практическая стратегия миграции Babel → SWC
### Шаг 1: классификация плагинов
Разделение на:
* синтаксические
* runtime
* кастомные
* оптимизационные
### Шаг 2: замена синтаксических
Переносится почти полностью в SWC config
### Шаг 3: замена runtime
* переход на `@swc/helpers`
* внешние polyfills
### Шаг 4: удаление кастомных AST плагинов
* поиск альтернатив в bundler (Vite/Webpack/Next.js)
* перенос логики в build pipeline
---
## Типичные сценарии несовместимости
### Babel-плагин для lodash
SWC не поддерживает tree-shaking lodash imports автоматически → требуется bundler-level решение.
### Babel macros
SWC не интерпретирует compile-time macros → требуется замена на отдельный препроцессор.
### Import rewrite plugins
Частично решается через bundler aliasing, но не SWC.
---
## Роль SWC в современной сборке
SWC чаще используется не как полный аналог Babel, а как:
* fast transpiler (TypeScript + JSX)
* minifier
* интегрированный компилятор в Next.js / Turbopack
Babel остаётся инструментом для:
* кастомных трансформаций
* сложных плагинных систем
* экспериментальных синтаксических расширений
---
## Итоговая модель соответствия
Соответствие Babel-плагинов SWC можно описать так:
* **100% совместимость**: базовый ECMAScript + JSX + TypeScript stripping
* **частичная совместимость**: runtime helpers, оптимизация, minification
* **нет прямого соответствия**: AST-плагины и macros
SWC выступает не заменой Babel-плагинной экосистемы, а высокопроизводительным ядром трансформации кода с ограниченным, но строго контролируемым набором возможностей.