SWC (Speedy Web Compiler) применяется как высокопроизводительный транспайлер и минификатор, который может выступать заменой Babel и части инструментов сборки. В экосистеме фронтенда его ключевая роль раскрывается не только в React-проектах, но и в связке с альтернативными фреймворками, такими как Preact, Solid, а также в универсальных сборках через Vite, Webpack и Rollup.
Архитектурно SWC работает как компилятор на базе Rust, что обеспечивает высокую скорость обработки AST и минимальные задержки при трансформации большого объёма модулей. В контексте фреймворков это позволяет существенно ускорить dev-серверы и production-сборки без потери функциональности трансформаций JSX и TypeScript.
SWC не является фреймворк-специфичным инструментом. Он работает на уровне синтаксического преобразования:
Фреймворки используют SWC через плагины бандлеров или через собственные инструменты:
@vitejs/plugin-react-swc
swc-loader
В каждом случае SWC выступает как слой, заменяющий Babel + Terser.
Preact использует JSX, почти идентичный React, но с другим runtime. Это создаёт удобную точку интеграции SWC: трансформация JSX остаётся стандартной, но требуется корректная настройка pragma.
В Vite Preact обычно подключается через @preact/preset-vite,
который может работать поверх SWC:
npm install preact
npm install -D @vitejs/plugin-react-swc @preact/preset-vite
Конфигурация:
import { defineConfig } from &
import preact from '@preact/preset-vite'
export default defineConfig({
plugins: [preact()]
})
В этом режиме SWC используется для JSX-трансформации, а Preact заменяет React runtime.
SWC поддерживает настройку JSX через .swcrc:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic",
"importSource": "preact"
}
}
}
}
Ключевой момент — importSource: “preact”. Это переключает
генерацию JSX функций с react/jsx-runtime на
preact/jsx-runtime.
Пример трансформации:
Исходный код:
const App = () => <div>Hello</div>
После SWC:
import { jsx as _jsx } from "preact/jsx-runtime";
const App = () => _jsx("div", { children: "Hello" });
Preact отличается более компактным runtime и иной моделью reconciler. SWC не знает о runtime-специфике, но обеспечивает корректную генерацию JSX.
Ключевые моменты:
React.createElement)
Solid принципиально отличается от React и Preact. Он не использует virtual DOM в классическом смысле, а применяет fine-grained reactivity. Это влияет на стратегию JSX-трансформации.
SWC в Solid используется исключительно как JSX-компилятор, но semantic
transformation обычно выполняется отдельно через
babel-preset-solid или solid-plugin.
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"solid": {
"generate": "dom",
"hydratable": true
}
}
}
}
Однако на практике SWC сам по себе не реализует полноценную семантическую трансформацию Solid JSX. Поэтому используется гибридный подход:
Vite-конфигурация:
npm install solid-js
npm install -D vite-plugin-solid @swc/core @swc/helpers
import { defineConfig } from 'vite'
import solid from 'vite-plugin-solid'
export default defineConfig({
plugins: [solid()]
})
Здесь SWC может использоваться внутри плагина для ускорения обработки TypeScript, но JSX преобразование делегируется Solid-компилятору.
В Solid экосистеме важно различать уровни:
| Этап | Инструмент | Роль |
|---|---|---|
| Парсинг TS/JSX | SWC | Быстрое построение AST |
| JSX transform | Solid compiler | Реактивная модель |
| Минификация | SWC | Оптимизация кода |
| Bundling | Vite/Rollup | Сборка модулей |
SWC в этом контексте не заменяет Solid compiler, а ускоряет инфраструктурные этапы.
Помимо Preact и Solid, SWC активно используется с другими JSX-фреймворками:
{
"jsc": {
"transform": {
"react": {
"runtime": "automatic",
"importSource": "inferno"
}
}
}
}
Inferno использует React-подобный API, поэтому SWC интегрируется напрямую через JSX runtime override.
Lit не использует JSX как основной подход, но в гибридных проектах SWC применяется для TypeScript:
{
"jsc": {
"parser": {
"syntax": "typescript"
}
}
}
В таких конфигурациях SWC выполняет исключительно transpilation слоя языка.
Vite является одной из ключевых точек распространения SWC в современных фронтенд-стэках.
npm install -D @vitejs/plugin-react-swc
import react from '@vitejs/plugin-react-swc'
export default {
plugins: [react()]
}
Хотя это React-ориентированный плагин, архитектура аналогична Preact и Solid: SWC заменяет Babel в трансформационном слое.
В крупных монорепозиториях SWC конфигурация часто унифицируется:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"target": "es2020"
},
"minify": true
}
Фреймворк-специфичные настройки выносятся отдельно:
importSource: “preact”
react
importSource: “inferno”
Основные оптимизационные эффекты:
SWC компилирует модули значительно быстрее Babel за счёт Rust-реализации и потоковой обработки AST.
При использовании Vite или аналогичных инструментов SWC уменьшает latency между изменением файла и обновлением UI.
Вместо цепочки Babel + Terser + TypeScript используется единый инструмент.
Несмотря на высокую производительность, SWC имеет ограничения:
В результате SWC чаще используется как инфраструктурный слой, а не как полноценный семантический трансформер для всех UI-фреймворков.
В проектах, где одновременно используются Preact и Solid (например, микрофронтенды), SWC конфигурация разделяется:
{
"env": {
"targets": "es2020"
},
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"transform": {
"react": {
"runtime": "automatic"
}
}
}
}
При этом Solid-компоненты обрабатываются отдельным плагином сборщика.
SWC становится стандартным низкоуровневым компилятором, который:
Его основная ценность проявляется в том, что он не диктует архитектуру приложения, а ускоряет существующие трансформационные цепочки, сохраняя совместимость с Preact, Solid и другими JSX-ориентированными системами.