Соответствие 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-плагинной экосистемы, а высокопроизводительным ядром трансформации кода с ограниченным, но строго контролируемым набором возможностей.