Совместимость ядра SWC и плагинов определяется сочетанием семантического версионирования, стабильности публичных API трансформеров и строгой привязки к внутренним структурам AST, которые могут меняться между релизами.
SWC разделяет систему на несколько слоёв:
Ключевая особенность: плагины в SWC часто зависят не от абстрактного интерфейса, а от конкретных версий структур AST и внутренних типов, что делает совместимость более чувствительной, чем в классических JS-инструментах.
Ядро SWC использует семантическое версионирование:
На практике даже MINOR-обновления могут влиять на плагины, если они используют внутренние API вместо публичных контрактов.
Плагины SWC делятся на несколько типов:
Это наиболее тесно интегрированный вариант. Они:
swc_ecma_ast
Такая модель даёт максимальную производительность, но минимальную переносимость.
Ключевая проблема совместимости: любое изменение AST (например, добавление нового поля в выражения или изменение enum-ветки) может потребовать пересборки всех плагинов.
Более изолированная модель:
Однако здесь возникает другая проблема: стабильность формата AST между версиями SWC.
Иногда SWC используется как раннер для JS-логики трансформаций:
@swc/core
Главный источник несовместимости — несоответствие версий между:
@swc/core
@swc/helpers
@swc/plugin-*
swc-loader)
Если плагин собран против одной версии AST, а runtime использует другую, возникают ошибки:
unknown variant
mismatched types
Многие SWC-плагины используют peerDependencies для фиксации
совместимости:
{
"peerDependencies": {
"@swc/core": "^1.3.0"
}
}
Это означает, что плагин не гарантирует работу с другими major-версиями.
В сложных монорепозиториях это приводит к необходимости:
SWC — это Rust-компилятор, и его плагины могут зависеть не только от API, но и от ABI-структур.
Типичный сценарий несовместимости:
swc_ecma_ast v0.120
CallExpression изменяется (добавляется поле или
меняется enum)
Это делает SWC более чувствительным к версиям, чем Babel, где AST более стабилен между мажорными релизами.
В связке с Next.js проблема совместимости усиливается:
В результате возникает жёсткая матрица совместимости:
Любое расхождение может привести к тому, что кастомные трансформации перестают применяться.
При переходе между версиями SWC необходимо учитывать:
В реальных проектах применяются следующие подходы:
{
"dependencies": {
"@swc/core": "1.3.96",
"@swc/plugin-transform-imports": "1.3.96"
}
}
Главная цель — исключить автоматическое обновление minor/patch версий, которые могут затронуть AST.
Используется hoisting и централизованный resolution:
Любое обновление SWC требует:
Плагин выполняется, но AST не изменяется из-за несовпадения типов узлов.
Нарушение ожиданий структуры AST.
Неверный формат промежуточного AST между версиями.
@swc/helpers генерирует код,
несовместимый с версией runtime.
SWC развивается быстрее, чем большинство JS-инструментов, что приводит к следующей динамике:
Это означает, что плагины, рассчитанные на долгий срок, должны быть: