SWC представляет собой высокопроизводительный компилятор JavaScript и TypeScript, написанный на Rust и ориентированный на замену Babel и части инструментов сборки в современных проектах. В сценарии одиночной компиляции файла основная задача сводится к преобразованию исходного кода в совместимый JavaScript для выбранной целевой среды.
Для работы через CLI используется пакет @swc/cli и ядро компилятора
@swc/core.
Установка в проект:
npm install -D @swc/cli @swc/core
После установки становится доступна команда swc,
позволяющая компилировать файлы и директории без дополнительной
настройки сборщика.
Рассмотрим простой пример входного файла input.js:
const sum = (a, b) => {
return a + b;
};
class MathUtil {
static multiply(a, b) {
return a * b;
}
}
export default sum;
Этот код использует современный синтаксис ES6+: стрелочные функции, классы и экспорт модуля. Задача SWC — преобразовать его в более совместимую версию JavaScript в зависимости от заданной целевой платформы.
Компиляция выполняется командой:
npx swc input.js -o output.js
В результате создаётся файл output.js, содержащий
преобразованный код.
Если необходимо явно указать целевую версию ECMAScript, используется
параметр –env:
npx swc input.js -o output.js --env.target es5
При таком режиме SWC преобразует стрелочные функции в обычные функции, классы — в функции-конструкторы, а модульные конструкции адаптирует под выбранную систему сборки.
Исходный код:
const sum = (a, b) => a + b;
class MathUtil {
static multiply(a, b) {
return a * b;
}
}
export default sum;
После компиляции в ES5-совместимый формат:
"use strict";
function sum(a, b) {
return a + b;
}
var MathUtil = /*
function MathUtil() {}
MathUtil.multiply = function multiply(a, b) {
return a * b;
};
return MathUtil;
}();
module.exports = sum;
Конкретный результат зависит от конфигурации модулей и выбранного пресета.
Для управления поведением компилятора применяется файл
.swcrc. Он позволяет задать целевую среду, тип модулей и
набор трансформаций.
Пример минимальной конфигурации:
{
"jsc": {
"target": "es5"
},
"module": {
"type": "commonjs"
}
}
После создания конфигурации команда компиляции упрощается:
npx swc input.js -o output.js
SWC автоматически применяет параметры из .swcrc.
При одиночной компиляции важно различать режим обработки одного файла и директории. Даже при работе с одним файлом CLI поддерживает вывод в каталог:
npx swc src/input.js -d dist
В этом случае результат сохраняется как dist/input.js,
сохраняя имя файла и применяя трансформации.
SWC поддерживает TypeScript без необходимости предварительной типизации
через tsc. Рассмотрим файл:
type User = {
id: number;
name: string;
};
const getUser = (id: number): User => {
return {
id,
name: "User"
};
};
Компиляция выполняется тем же способом:
npx swc input.ts -o output.js
Типы удаляются, а код приводится к JavaScript.
SWC позволяет управлять тем, какие языковые возможности допускаются на входе:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": false,
"decorators": false
},
"target": "es2017"
}
}
Такой подход фиксирует поведение компилятора и исключает неоднозначность при обработке кода.
При компиляции одного файла часто важно определить формат модулей на выходе:
commonjs — для Node.js
es6 — для современных сборщиков
umd — для универсального использования
Пример настройки:
{
"module": {
"type": "es6"
}
}
При этом export и import сохраняются без
преобразования.
SWC может использоваться как мгновенный транспайлер без сборочной системы. В таком режиме компиляция одного файла выполняется напрямую:
npx swc input.js -o output.js --watch
Флаг –watch активирует отслеживание изменений и
автоматическую перекомпиляцию, что полезно при разработке небольших
модулей.
При одиночной компиляции SWC останавливает процесс при обнаружении ошибки синтаксиса и выводит позицию:
const a = ;
Вывод будет содержать строку, столбец и описание ошибки. Это позволяет быстро локализовать проблему без дополнительной настройки линтера.
SWC оптимизирован под минимальное время преобразования. При компиляции одного файла:
Это делает его особенно эффективным для сценариев pre-commit хуков, CI и быстрых проверок синтаксиса.
Часто одиночная компиляция оформляется через package.json:
{
"scripts": {
"build:single": "swc src/input.js -o dist/output.js"
}
}
Такой подход фиксирует команду сборки и исключает необходимость ручного вызова CLI.
Для отладки исходного кода подключаются карты исходников:
npx swc input.js -o output.js --source-maps
В результате создаётся файл .map, связывающий исходный и
скомпилированный код построчно. Это критично при отладке в браузере или
Node.js.
SWC может выполнять упрощённые оптимизации при трансформации:
Однако в режиме одиночного файла большинство оптимизаций контролируется
через .swcrc, чтобы избежать непредсказуемых изменений
поведения кода.
Если .swcrc отсутствует, SWC использует стандартные
значения:
Это обеспечивает предсказуемый результат даже без явной настройки.
SWC поддерживает широкий спектр синтаксиса:
?.)
??)
При компиляции одного файла все конструкции приводятся к выбранной целевой среде с минимальным количеством вспомогательного кода.
const value = obj?.data ?? "default";
После трансформации в старые среды:
var _obj_data;
var value = (_obj_data = obj === null || obj === void 0 ? void 0 : obj.data) !== null && _obj_data !== void 0 ? _obj_data : "default";
Такой результат демонстрирует характер транспиляции, ориентированной на совместимость.
Процесс преобразования одного файла через SWC включает последовательные этапы: