Интеграция SWC с Vite строится вокруг замены стандартных механизмов трансформации JavaScript и TypeScript на высокопроизводительный компилятор, реализованный на Rust, что позволяет существенно ускорить холодный старт dev-сервера, обновление модулей и финальную сборку. В экосистеме Vite SWC используется либо через специализированные плагины, либо через интеграцию с React/TypeScript пайплайном, где основная цель — минимизировать время преобразования кода при сохранении совместимости с современным стандартом ECMAScript.
Vite по умолчанию использует ESBuild для предварительных трансформаций и Rollup для production-сборки. SWC может встроиться в этот процесс как замена или дополнение трансформирующего слоя.
Ключевые точки интеграции:
SWC работает на уровне AST, но выполняет преобразования значительно быстрее благодаря нативной реализации парсера и генератора кода.
В Vite-проектах SWC чаще всего подключается через специализированные плагины:
@vitejs/plugin-react-swc
— стандартный путь для React;
@swc/core;
Установка React-интеграции:
npm install -D @vitejs/plugin-react-swc
Конфигурация Vite:
import { defineConfig } from &
import react from '@vitejs/plugin-react-swc'
export default defineConfig({
plugins: [react()]
})
В этом сценарии SWC полностью заменяет Babel-трансформации React-кода, включая JSX runtime и Fast Refresh.
SWC управляется через файл конфигурации .swcrc, который
определяет правила трансформации.
Пример базовой конфигурации:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": false
},
"transform": {
"react": {
"runtime": "automatic",
"refresh": true
}
},
"target": "es2020"
},
"module": {
"type": "es6"
}
}
Основные параметры:
jsc.parser.syntax — определяет язык (typescript,
ecmascript);
tsx — поддержка JSX/TSX;
transform.react.runtime — automatic runtime для React 17+;
refresh — включение Fast Refresh;
target — целевая версия ECMAScript.
При использовании @vitejs/plugin-react-swc
происходит замена цепочки Babel на SWC:
Разница особенно заметна в больших кодовых базах, где Babel-пайплайн становится узким местом.
SWC снижает время обработки модулей за счёт:
В проектах среднего и крупного размера наблюдаются следующие эффекты:
Для нестандартных сценариев SWC подключается напрямую:
npm install -D @swc/core
Далее можно использовать программный API:
import { transform } from '@swc/core'
const result = await transform(code, {
filename: "input.tsx",
jsc: {
parser: {
syntax: "typescript",
tsx: true
},
target: "es2020",
transform: {
react: {
runtime: "automatic"
}
}
},
module: {
type: "es6"
}
})
Такой подход используется при создании кастомных Vite-плагинов, где требуется контроль над трансформацией кода.
Vite-плагин на SWC обычно реализует hook transform:
import { transform } from '@swc/core'
export default function swcPlugin() {
return {
name: 'swc-transform',
async transform(code, id) {
if (id.endsWith('.ts') || id.endsWith('.tsx')) {
const result = await transform(code, {
filename: id,
jsc: {
parser: {
syntax: "typescript",
tsx: id.endsWith('.tsx')
},
target: "es2020"
},
module: {
type: "es6"
}
})
return {
code: result.code,
map: result.map
}
}
}
}
}
Такой плагин заменяет стандартную трансформацию TypeScript внутри Vite.
SWC генерирует source maps, совместимые с Vite pipeline:
{
"sourceMaps": true,
"inlineSourcesContent": true
}
Корректная настройка source maps критична для:
При server-side rendering SWC может использоваться для унификации трансформации:
Однако важно учитывать:
.swcrc;
SWC не выполняет type-checking, он только удаляет типы. В Vite это означает разделение ответственности:
Типичный workflow:
tsc --noEmit
vite dev
Такое разделение повышает скорость dev-сервера, сохраняя строгую типизацию.
В production режиме SWC может участвовать в:
Однако Vite чаще полагается на ESBuild для minification, поэтому SWC в production чаще играет вспомогательную роль.
1. Конфликт конфигураций Babel и SWC
При одновременном использовании Babel-плагинов и SWC возможны дублирующиеся трансформации JSX.
Решение — отключение Babel-слоя:
react({
babel: false
})
2. Несовместимость декораторов
SWC требует явной настройки:
{
"jsc": {
"parser": {
"decorators": true
}
}
}
3. Расхождения target ES версии
Неправильный target может приводить к:
В монорепозиториях SWC часто используется для:
Рекомендуется централизовать .swcrc на уровне root и
наследовать его в пакетах.
SWC занимает промежуточную позицию, позволяя реализовывать сложные трансформации без существенной потери производительности.
SWC напрямую влияет на скорость Hot Module Replacement за счёт:
В крупных SPA это особенно заметно при частых изменениях компонентов и стилей логики отображения.