Библиотека @swc/core представляет собой высокопроизводительный компилятор JavaScript и TypeScript, написанный на Rust и предоставляющий Node.js-интерфейс для трансформации кода. Основное назначение — замена Babel и частично TypeScript Compiler (tsc) в задачах транспиляции.
Перед подключением требуется наличие Node.js актуальной LTS-ветки, поскольку бинарные зависимости SWC распространяются под конкретные платформы и архитектуры.
Установка выполняется через npm:
npm install @swc/core
При использовании Yarn:
yarn add @swc/core
При установке автоматически подбираются нативные бинарные файлы под текущую платформу. В случае нестандартных окружений (Alpine Linux, ARM-сборки, CI-системы) может потребоваться дополнительная настройка зависимостей libc или установка соответствующего platform-specific пакета.
Пакет @swc/core предоставляет низкоуровневое API для трансформации кода. Основные возможности:
В Node.js библиотека используется как модуль, вызывающий нативный Rust-бэкенд через биндинги.
Ключевые функции:
transformSync
transform
parseSync
parse
bundle (в некоторых конфигурациях)
const swc = require("@swc/core");
import * as swc from "@swc/core";
В обоих случаях доступен полный API трансформации.
const swc = require("@swc/core");
const inputCode = `
const sum = (a, b) => a + b;
console.log(sum(2, 3));
`;
const output = swc.transformSync(inputCode, {
jsc: {
parser: {
syntax: "ecmascript"
},
target: "es5"
}
});
console.log(output.code);
Синхронный режим выполняется блокирующе и подходит для скриптов сборки, CLI-инструментов и одноразовой компиляции.
const swc = require("@swc/core");
(async () => {
const result = await swc.transform(`
const multiply = (a, b) => a * b;
`, {
jsc: {
parser: {
syntax: "ecmascript"
},
target: "es2020"
}
});
console.log(result.code);
})();
Асинхронная версия предпочтительна в серверных сценариях, где важна неблокирующая обработка.
Основная настройка осуществляется через объект конфигурации, где
ключевым разделом является jsc.
{
jsc: {
parser: {
syntax: "typescript" | "ecmascript" | "jsx",
tsx: boolean,
jsx: boolean
},
target: "es3" | "es5" | "es2015" | "es2020" | "es2022",
transform: {
react: {
runtime: "automatic" | "classic"
}
}
},
module: {
type: "commonjs" | "es6" | "esnext"
}
}
SWC обрабатывает TypeScript без выполнения type-checking. Это ключевое
отличие от tsc.
const swc = require("@swc/core");
const tsCode = `
function add(a: number, b: number): number {
return a + b;
}
`;
const result = swc.transformSync(tsCode, {
jsc: {
parser: {
syntax: "typescript",
tsx: false
},
target: "es2020"
}
});
console.log(result.code);
Особенности:
SWC имеет встроенную поддержку JSX без дополнительных плагинов.
const input = `
const App = () => <div>Hello</div>;
`;
const output = swc.transformSync(input, {
jsc: {
parser: {
syntax: "jsx"
},
transform: {
react: {
runtime: "automatic",
importSource: "react"
}
}
}
});
Режим automatic позволяет исключить необходимость ручного
импорта React в каждом файле.
swc.transformSync(code, {
module: {
type: "commonjs"
}
});
swc.transformSync(code, {
module: {
type: "es6"
}
});
SWC поддерживает преобразование импортов, включая:
Одним из распространённых сценариев является подключение SWC для выполнения TypeScript/modern JS без предварительной сборки.
require("@swc/core/register");
После подключения файлы .ts и .tsx могут
выполняться напрямую через Node.js.
SWC предоставляет возможность работы с AST:
const swc = require("@swc/core");
const ast = swc.parseSync("const x = 1;", {
syntax: "ecmascript"
});
console.log(ast);
AST можно использовать для:
SWC проектировался как высокопроизводительная замена Babel, поэтому ключевые особенности:
Практические моменты:
transformSync в build-скриптах
transform в серверных приложениях
Ошибки SWC возвращаются в виде исключений:
try {
swc.transformSync("const x: = 1", {
jsc: {
parser: {
syntax: "typescript"
}
}
});
} catch (err) {
console.error(err);
}
Типичные категории ошибок:
SWC часто выступает ядром:
Типовой pipeline:
const fs = require("fs");
const swc = require("@swc/core");
const input = fs.readFileSync("./input.ts", "utf-8");
const output = swc.transformSync(input, {
jsc: {
parser: {
syntax: "typescript"
},
target: "es2020"
},
module: {
type: "commonjs"
}
});
fs.writeFileSync("./output.js", output.code);
При использовании SWC в Node.js учитываются следующие факторы:
type: module в package.json
В контейнерных средах (Docker) важно соответствие libc (glibc vs musl), иначе возможны ошибки загрузки бинарных модулей.
SWC поддерживает дополнительные трансформации:
?.)
??)
Пример:
swc.transformSync(code, {
jsc: {
transform: {
legacyDecorator: true,
decoratorMetadata: true
}
}
});
SWC в Node.js обычно используется в трёх режимах:
Каждый режим предъявляет разные требования к производительности, кешированию и конфигурации модулей.