Интеграция SWC в Rspack основана на идее вынесения трансформации исходного кода в высокопроизводительный компилятор, написанный на Rust, при сохранении совместимости с экосистемой JavaScript-инструментов. Rspack выступает как бандлер, а SWC — как слой трансформации модулей до этапа их упаковки.
Ключевая особенность архитектуры заключается в том, что Rspack изначально проектируется с возможностью замены классического Babel-транспайлера на SWC без изменения логики сборки. Это позволяет минимизировать накладные расходы на преобразование TypeScript, JSX и современных ECMAScript-синтаксисов.
В процессе сборки Rspack выполняет несколько стадий обработки:
SWC включается во вторую стадию и отвечает за:
SWC не выполняет статическую проверку типов, что сохраняет высокую скорость обработки и переносит ответственность за типизацию на отдельные инструменты.
В Rspack трансформация через SWC может активироваться встроенными лоадерами или через явную настройку правил обработки модулей.
// rspack.config.js
module.exports = {
module: {
rules: [
{
test: /\.(ts|tsx|js|jsx)$/,
use: {
loader: &
options: {
jsc: {
parser: {
syntax: 'typescript',
tsx: true
},
transform: {
react: {
runtime: 'automatic'
}
}
},
env: {
targets: 'defaults'
}
}
}
}
]
}
};
Использование builtin:swc-loader позволяет Rspack применять
встроенную реализацию SWC без необходимости отдельной установки внешнего
пакета.
SWC выполняет удаление типов на этапе трансформации без проверки корректности типов. Это влияет на архитектуру проекта:
Конфигурация TypeScript-парсера:
parser: {
syntax: 'typescript',
tsx: true,
decorators: true,
dynamicImport: true
}
Поддерживаются следующие возможности:
enum трансформации;
namespace (ограниченно);
decorators (в зависимости от версии);
Rspack через SWC обрабатывает JSX значительно быстрее классических Babel-конфигураций.
transform: {
react: {
runtime: 'automatic',
importSource: 'react'
}
}
Особенности:
import
React;
Пример обработки:
const Component = () => {
return <div className="box">Text</div>;
};
После трансформации SWC:
import { jsx as _jsx } from "react/jsx-runtime";
const Component = () => {
return _jsx("div", { className: "box", children: "Text" });
};
SWC реализует поддержку legacy и standard decorators через конфигурацию:
jsc: {
transform: {
legacyDecorator: true,
decoratorMetadata: true
}
}
Пример использования:
function log(target: any) {}
@log
class Service {}
Важно учитывать, что семантика декораторов зависит от выбранного режима трансформации и может отличаться от Babel-реализации.
Помимо inline-конфигурации, SWC может использовать внешний файл
.swcrc, что упрощает переносимость между инструментами.
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true
},
"target": "es2020",
"transform": {
"react": {
"runtime": "automatic"
}
}
},
"sourceMaps": true
}
Rspack автоматически подхватывает этот файл при использовании SWC-loader, если не переопределена конфигурация.
Основное преимущество интеграции SWC в Rspack заключается в снижении времени трансформации модулей.
Характерные оптимизации:
В сравнении с Babel:
Rspack использует граф модулей, в котором SWC участвует только при изменении исходного файла.
Сценарий:
.ts файла;
Это особенно эффективно в монорепозиториях с большим количеством пакетов.
SWC позволяет задавать уровень трансформации через
env.targets:
env: {
targets: '> 0.25%, not dead'
}
Поведение:
Rspack не добавляет полифилы автоматически, что требует отдельной конфигурации при поддержке старых браузеров.
Миграция обычно включает следующие изменения:
babel-loader;
builtin:swc-loader;
.babelrc логики в .swcrc;
Типичная замена:
До:
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react']
}
}
После:
use: {
loader: 'builtin:swc-loader',
options: {
jsc: {
parser: {
syntax: 'ecmascript',
jsx: true
},
transform: {
react: {
runtime: 'automatic'
}
}
}
}
}
Несмотря на высокую производительность, интеграция имеет ограничения:
В монорепозиториях SWC в связке с Rspack показывает линейную масштабируемость благодаря:
Структура типичного монорепо:
packages/
ui/
core/
app/
Каждый пакет компилируется независимо, но использует общий cache layer Rspack.
SWC поддерживает широкий спектр современных фич:
Пример:
class A {
#value = 1;
getValue() {
return this.#value ?? 0;
}
}
После трансформации SWC:
class A {
constructor() {
this.#value = 1;
}
getValue() {
return this.#value ?? 0;
}
}
Rspack хранит результаты SWC-трансформации на уровне:
Изменение .swcrc или loader options инвалидирует
соответствующий кеш, что предотвращает устаревшие сборки.
Rspack стремится сохранять совместимость с конфигурациями Webpack, однако SWC-интеграция вводит различия:
Это требует пересмотра архитектуры сборки при миграции крупных проектов.