Первый запуск: компиляция одного файла

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, сохраняя имя файла и применяя трансформации.

Обработка TypeScript-файлов

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 оптимизирован под минимальное время преобразования. При компиляции одного файла:

  • отсутствует накладная стоимость анализа всего проекта
  • используется параллельная обработка на уровне Rust-ядра
  • минимизируются операции с файловой системой

Это делает его особенно эффективным для сценариев pre-commit хуков, CI и быстрых проверок синтаксиса.

Интеграция с npm-скриптами

Часто одиночная компиляция оформляется через package.json:

{
  "scripts": {
    "build:single": "swc src/input.js -o dist/output.js"
  }
}

Такой подход фиксирует команду сборки и исключает необходимость ручного вызова CLI.

Компиляция с source maps

Для отладки исходного кода подключаются карты исходников:

npx swc input.js -o output.js --source-maps

В результате создаётся файл .map, связывающий исходный и скомпилированный код построчно. Это критично при отладке в браузере или Node.js.

Управление оптимизациями

SWC может выполнять упрощённые оптимизации при трансформации:

  • удаление недостижимого кода
  • инлайн простых выражений
  • упрощение конструкции классов

Однако в режиме одиночного файла большинство оптимизаций контролируется через .swcrc, чтобы избежать непредсказуемых изменений поведения кода.

Поведение при отсутствии конфигурации

Если .swcrc отсутствует, SWC использует стандартные значения:

  • ESNext на входе
  • ES5 на выходе (в некоторых CLI конфигурациях)
  • CommonJS как модульная система

Это обеспечивает предсказуемый результат даже без явной настройки.

Особенности обработки современных конструкций

SWC поддерживает широкий спектр синтаксиса:

  • optional chaining (?.)
  • nullish coalescing (??)
  • dynamic import
  • async/await

При компиляции одного файла все конструкции приводятся к выбранной целевой среде с минимальным количеством вспомогательного кода.

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 включает последовательные этапы:

  • чтение входного файла
  • парсинг в AST
  • применение трансформаций согласно конфигурации
  • генерация выходного JavaScript
  • запись результата в файл
  • опциональная генерация source map