Функция transform в SWC является центральной точкой
компиляции и преобразования JavaScript/TypeScript кода. Она выполняет
синтаксический разбор исходного текста, построение AST, применение
трансформаций (TypeScript, JSX, современные ECMAScript-фичи), генерацию
итогового кода и, при необходимости, source map. Асинхронная версия API
используется для неблокирующего выполнения трансформации, особенно в
серверных средах и сборочных пайплайнах.
Асинхронная форма доступна в пакете @swc/core:
import { transform } from "@swc/core";
Сигнатура:
transform(code: string, options: TransformOptions): Promise<TransformOutput>
Возвращаемое значение представляет собой Promise, который резолвится в объект:
{
code: string,
map?: string
}
Процесс внутри SWC можно разложить на несколько этапов:
Исходный код разбивается на токены:
Этот этап формирует поток токенов для парсера.
Токены преобразуются в AST (Abstract Syntax Tree):
Program
├── FunctionDeclaration
├── VariableDeclaration
└── ExpressionStatement
AST в SWC строго типизирован и соответствует ECMAScript спецификации.
Применяются плагины и встроенные преобразования:
AST преобразуется обратно в строку кода с учетом:
Генерируется mapping между исходным и результирующим кодом:
original.ts → transformed.js
options
Объект options управляет поведением трансформации.
interface TransformOptions {
filename?: string;
sourceMaps?: boolean | "inline";
minify?: boolean;
jsc?: JscConfig;
module?: ModuleConfig;
isModule?: boolean;
}
jsc — основная зона управления поведением JavaScript
трансформации.
jsc: {
parser: {
syntax: "typescript" | "ecmascript" | "jsx",
tsx?: boolean,
decorators?: boolean
},
target: "es5" | "es2015" | "es2020" | "es2022",
transform?: {
react?: {
runtime: "automatic" | "classic",
importSource?: string
}
}
}
SWC поддерживает три основных режима:
parser: {
syntax: "ecmascript"
}
Используется для обычного JS без расширений.
parser: {
syntax: "typescript",
tsx: true
}
Поддерживает:
parser: {
syntax: "jsx"
}
Используется в React-проектах без TypeScript.
transform
Асинхронность реализована через внутренний thread pool Rust-библиотеки SWC. JavaScript-обертка лишь возвращает Promise.
Пример выполнения:
const result = await transform(code, {
filename: "example.ts",
jsc: {
parser: {
syntax: "typescript"
},
target: "es2020"
}
});
При включенном TypeScript-парсере SWC:
Пример:
const add = (a: number, b: number): number => {
return a + b;
};
Результат:
const add = (a, b) => {
return a + b;
};
SWC поддерживает два режима React runtime:
jsc: {
transform: {
react: {
runtime: "classic"
}
}
}
Результат:
React.createElement("div", null, "text");
jsc: {
transform: {
react: {
runtime: "automatic"
}
}
}
Результат:
import { jsx as _jsx } from "react/jsx-runtime";
_jsx("div", { children: "text" });
Source map включается через:
sourceMaps: true
или inline:
sourceMaps: "inline"
{
code: "...compiled code...",
map: "{\"version\":3,...}"
}
Source maps используются:
transform
Хотя SWC имеет отдельный minify, базовый
transform может включать упрощенные оптимизации:
minify: true
Поддерживаемые операции:
module: {
type: "es6" | "commonjs" | "amd" | "umd"
}
module: {
type: "es6"
}
Оставляет import/export без изменений.
module: {
type: "commonjs"
}
Преобразует:
import x from "y";
в:
const x = require("y");
Асинхронная обработка позволяет запускать несколько трансформаций параллельно:
const tasks = files.map(file =>
transform(file.code, {
filename: file.name,
jsc: {
parser: { syntax: "typescript" },
target: "es2020"
}
})
);
const results = await Promise.all(tasks);
Ошибки возвращаются через rejected Promise:
try {
await transform("const a =", {
jsc: { parser: { syntax: "ecmascript" } }
});
} catch (e) {
console.log(e.message);
}
Типичные причины:
Асинхронная трансформация выигрывает за счет:
filename: "input.tsx"
Используется для:
Функция transform часто используется как низкоуровневый
API:
Асинхронная версия предпочтительна, поскольку не блокирует обработку очереди сборки и позволяет параллелизацию файловых операций и трансформаций AST.