transformSync представляет собой синхронный API для
преобразования JavaScript и TypeScript кода на уровне AST с
использованием компилятора SWC. Функция выполняет полный цикл
трансформации: парсинг исходного кода, применение преобразований
(transforms), генерацию результирующего кода и, при необходимости,
sourcemap — в одном последовательном вызове без асинхронных операций.
Синхронная природа делает transformSync частью
низкоуровневого API, ориентированного на сценарии, где критична
предсказуемость выполнения и отсутствие промисов: CLI-инструменты,
build-скрипты, небольшие сервисы трансформации, интеграции в синхронные
пайплайны.
transformSync(code: string, options: TransformOptions): TransformOutput
code — исходный текст программы на JavaScript или
TypeScript
options — конфигурация трансформации
возвращаемое значение — объект с полями:
code — преобразованный код
map — sourcemap (если включён)
Внутренне transformSync проходит несколько этапов:
Лексический и синтаксический анализ
Применение трансформаций
Генерация кода
Sourcemap (опционально)
Объект options управляет всем поведением трансформации и
делится на несколько крупных подсистем.
Определяет, как исходный код интерпретируется.
parser: {
syntax: "ecmascript" | "typescript" | "jsx",
jsx: boolean,
dynamicImport: boolean,
decorators: boolean,
tsx: boolean
}
Ключевые режимы:
Ядро конфигурации трансформации.
jsc: {
target: "es5" | "es2015" | "es2020" | "es2022" | "esnext",
parser: {...},
transform: {...},
keepClassNames: boolean,
externalHelpers: boolean,
loose: boolean
}
Определяет уровень транспиляции:
es5 — максимальная совместимость
es2015+ — современные среды
esnext — минимальная трансформация
loose: true активирует упрощённые преобразования,
ориентированные на производительность, но с отклонением от спецификации
ECMAScript в некоторых краевых случаях.
Секция, отвечающая за включение конкретных трансформаций.
transform: {
react: {
runtime: "automatic" | "classic",
development: boolean,
refresh: boolean
},
optimizer: {
globals: {
vars: Record<string, string>
}
},
legacyDecorator: boolean
}
runtime: automatic — JSX без явного import
React
runtime: classic — старый режим с React.createElement
development — добавление dev-метаданных
refresh — поддержка fast refresh
Хотя transformSync чаще используется без минификации,
некоторые конфигурации допускают базовую оптимизацию:
sourceMaps: boolean | "inline" | "both"
true — отдельный sourcemap
“inline” — встроенный map
“both” — комбинированный режим
import { transformSync } from "@swc/core";
const result = transformSync(
`const sum = (a, b) => a + b;`,
{
jsc: {
parser: {
syntax: "ecmascript"
},
target: "es5"
}
}
);
console.log(result.code);
Результат:
var sum = function(a, b) {
return a + b;
};
const input = `
type User = { name: string };
const user: User = { name: "Alex" };
`;
transformSync(input, {
jsc: {
parser: {
syntax: "typescript"
},
target: "es2020"
}
});
Особенности:
const input = `<div>Hello</div>`;
transformSync(input, {
jsc: {
parser: {
syntax: "jsx"
},
transform: {
react: {
runtime: "automatic"
}
}
}
});
Результат в automatic runtime:
import { jsx as _jsx } from "react/jsx-runtime";
_jsx("div", {
children: "Hello"
});
transformSync блокирует поток выполнения до завершения всех
этапов трансформации. Это создаёт следующие характеристики:
В высоконагруженных сервисах синхронный вызов может стать узким местом из-за блокировки event loop, особенно при обработке больших файлов или массовой компиляции.
Ошибки возникают на этапе парсинга или трансформации AST.
Типичные классы ошибок:
Пример обработки:
try {
transformSync("const a = ;", {
jsc: {
parser: { syntax: "ecmascript" }
}
});
} catch (e) {
console.error(e.message);
}
При включении sourcemap SWC строит карту соответствий между:
Это особенно важно при:
Синхронный режим SWC демонстрирует высокую скорость благодаря Rust-реализации компилятора и минимальным накладным расходам JavaScript-обёртки.
Факторы, влияющие на производительность:
Оптимизация достигается через:
es2020+ targets
externalHelpers: true
При включении вспомогательные функции (helpers) выносятся во внешние импорты, что снижает дублирование кода между модулями.
Пример:
import { _extends } from "@swc/helpers";
Это особенно актуально для:
loose: true изменяет стратегию трансформации:
for-of
Пример различий:
Строгий режим:
class A {
constructor() {
this.x = 1;
}
}
Loose режим может генерировать более прямые присваивания без дополнительных проверок прототипа.
При включении:
refresh: true
development: true
добавляются:
Это используется в dev-средах bundler-ов и dev-server-ов.
transformSync часто используется как:
В современных сборках он нередко заменяется transform
(async) или интеграцией через плагины, однако синхронная версия остаётся
полезной в простых пайплайнах и тестовых окружениях.