SWC представляет собой высокопроизводительный компилятор и набор
инструментов для трансформации JavaScript и TypeScript, реализованный на
Rust и предоставляющий API для Node.js через пакет @swc/core. В
экосистеме Node.js ключевыми функциями для работы с файлами выступают
transformFile и transformFileSync,
обеспечивающие преобразование исходного кода с поддержкой конфигураций
компиляции, плагинов, генерации sourcemap и интеграции с современными
сборочными пайплайнами.
Функция transformFile предназначена для асинхронного чтения
и трансформации исходного файла. Внутри SWC происходит несколько этапов:
Асинхронная природа функции позволяет не блокировать event loop, что критично при обработке большого количества файлов в сборочных системах.
Функция доступна в пакете @swc/core:
import { transformFile } from "@swc/core";
Базовая сигнатура:
transformFile(
path: string,
options?: TransformOptions
): Promise<TransformOutput>
path — путь к входному файлу
options — конфигурация трансформации
Promise, который резолвится в объект с
результатом компиляции
Конфигурация трансформации определяет поведение компилятора:
jsc — настройки JavaScript/TypeScript компиляции
module — стратегия модульной системы (CommonJS, ES Modules)
sourceMaps — генерация sourcemaps
minify — минификация кода
isModule — принудительное определение модуля
Пример:
{
jsc: {
parser: {
syntax: "typescript",
tsx: true
},
target: "es2020",
transform: {
react: {
runtime: "automatic"
}
}
},
module: {
type: "es6"
},
sourceMaps: true
}
При вызове transformFile SWC выполняет следующие шаги:
Асинхронное чтение файла
fs.readFile
Парсинг исходного кода
Применение трансформаций
Генерация кода
Source map (опционально)
import { transformFile } from "@swc/core";
async function compile() {
const result = await transformFile("./src/index.ts", {
jsc: {
parser: {
syntax: "typescript"
},
target: "es2019"
},
module: {
type: "commonjs"
},
sourceMaps: true
});
console.log(result.code);
console.log(result.map);
}
compile();
Асинхронная версия возвращает Promise, который может быть отклонён в следующих случаях:
TransformOptions
Типичный обработчик:
try {
const result = await transformFile("./input.ts", options);
} catch (err) {
console.error("SWC transform error:", err);
}
Асинхронная модель обеспечивает высокую пропускную способность при работе с множеством файлов:
Promise.all
Пример параллельной трансформации:
await Promise.all(
files.map(file =>
transformFile(file, options)
)
);
transformFileSync реализует ту же функциональность, но с
синхронным API. Она блокирует event loop до завершения трансформации,
что делает её пригодной только для ограниченных сценариев:
transformFileSync(
path: string,
options?: TransformOptions
): TransformOutput
Отличие от асинхронной версии — отсутствие Promise.
import { transformFileSync } from "@swc/core";
const result = transformFileSync("./src/index.ts", {
jsc: {
parser: {
syntax: "typescript"
},
target: "es2020"
},
module: {
type: "es6"
}
});
console.log(result.code);
Синхронная версия выполняет те же этапы, что и асинхронная, но с блокирующими вызовами:
fs.readFileSync
Отсутствие асинхронности упрощает контроль потока выполнения, но увеличивает риск деградации производительности при обработке множества файлов.
transformFile — неблокирующая, Promise-based
transformFileSync — блокирующая, прямой возврат результата
transformFile используется в build tools, watch mode,
bundlers
transformFileSync используется в CLI-скриптах и простых
трансформациях
Обе функции поддерживают генерацию source maps при включённой опции:
sourceMaps: true
Результат содержит:
code — итоговый JavaScript
map — JSON-строка source map
Source map связывает:
Обе функции поддерживают трансформацию модульных систем:
import/export)
require/module.exports)
Пример конфигурации:
module: {
type: "commonjs"
}
или
module: {
type: "es6"
}
transformFileSync не рекомендуется для:
Причина — блокировка event loop, приводящая к деградации отклика системы при увеличении времени трансформации.