Структура пакетов: @swc/core, @swc/cli, @swc/helpers

Экосистема SWC построена как модульный набор пакетов, разделяющих компиляцию, интерфейсы взаимодействия и вспомогательные runtime-компоненты. Такая архитектура позволяет использовать SWC как внутри сборщиков (Next.js, Vite-плагины, Webpack-лоадеры), так и напрямую в CLI или серверных инструментах.

SWC реализует компиляцию JavaScript и TypeScript на языке Rust, что обеспечивает значительный прирост скорости по сравнению с традиционными JS-трансформерами. Однако ключевое значение в реальной разработке имеет не только ядро, но и взаимодействие между пакетами @swc/core, @swc/cli и @swc/helpers.


Экосистема разделена на три основных уровня:

  • @swc/core — ядро компилятора и программный API
  • @swc/cli — командная строка для работы с компилятором
  • @swc/helpers — набор runtime-хелперов для транспилированного кода

Такое разделение позволяет:

  • использовать SWC без CLI (например, в Node.js сервисах),
  • подключать только CLI без прямого API,
  • минимизировать runtime-зависимости через отдельные helpers,
  • масштабировать использование в разных окружениях.

@swc/core: ядро компиляции

Назначение пакета

@swc/core представляет собой низкоуровневый API, который предоставляет доступ к функциям трансформации, парсинга и минификации. Это основной слой, через который проходят все операции компиляции.

Он используется:

  • сборщиками (bundlers),
  • плагинами трансформации,
  • серверными инструментами,
  • кастомными пайплайнами сборки.

Основные возможности

Трансформация кода

Наиболее часто используемая функция — transform:

import { transform } from "@swc/core";

const result = await transform("const x = (a) => a + 1;", {
  jsc: {
    parser: {
      syntax: "ecmascript"
    },
    transform: {
      arrowFunctions: true
    }
  }
});

console.log(result.code);

SWC выполняет преобразование AST, используя Rust-реализацию, что обеспечивает высокую скорость обработки даже больших файлов.


Парсинг AST

@swc/core предоставляет возможность получить AST:

import { parse } from "@swc/core";

const ast = await parse("let a = 10;", {
  syntax: "ecmascript"
});

AST используется для:

  • статического анализа,
  • написания кастомных трансформаций,
  • интеграции с линтерами и анализаторами.

Минификация

SWC включает встроенный минификатор:

import { minify } from "@swc/core";

const result = await minify("function test() { return 1 + 2; }", {
  compress: true,
  mangle: true
});

Минификация включает:

  • удаление мёртвого кода,
  • переименование идентификаторов,
  • упрощение выражений,
  • оптимизацию структуры AST.

Конфигурация JSC

Основная конфигурация лежит в объекте jsc:

{
  jsc: {
    parser: {
      syntax: "typescript",
      tsx: true
    },
    target: "es2020",
    transform: {},
    minify: {}
  }
}

Ключевые параметры:

  • syntax — выбор JavaScript/TypeScript/JSX
  • target — версия ECMAScript
  • transform — включение трансформаций
  • minify — настройки минификации

Производительность @swc/core

Ключевое отличие от Babel заключается в архитектуре:

  • Rust-ядро вместо интерпретируемого JS,
  • отсутствие промежуточных JS-обходов AST,
  • оптимизированные структуры данных.

Это приводит к:

  • снижению времени трансформации в несколько раз,
  • меньшему потреблению памяти,
  • стабильной работе на больших проектах.

@swc/cli: командная строка

Роль CLI в экосистеме

@swc/cli — это оболочка над @swc/core, предоставляющая доступ к его возможностям через терминал. Он не реализует компиляцию самостоятельно, а делегирует её ядру.

Основные сценарии:

  • сборка проектов,
  • трансформация файлов,
  • интеграция в CI/CD,
  • замена Babel CLI.

Базовое использование

npx swc src -d dist

Команда:

  • берёт исходники из src,
  • компилирует их,
  • сохраняет результат в dist.

Использование конфигурации

CLI автоматически читает .swcrc:

{
  "jsc": {
    "parser": {
      "syntax": "typescript"
    },
    "target": "es2019"
  },
  "module": {
    "type": "commonjs"
  }
}

Это позволяет отделить конфигурацию от кода.


Режимы работы CLI

Watch mode

npx swc src -d dist -w

CLI отслеживает изменения файлов и пересобирает их.


Игнорирование файлов

Поддерживается .swcignore, аналог .gitignore:

node_modules
dist

Параллельная обработка

CLI автоматически распараллеливает обработку файлов, используя многопоточность через ядро SWC.


Использование в проектах

CLI часто применяется:

  • как альтернатива Babel CLI,
  • в простых сборках без Webpack,
  • в микросервисах для трансформации кода на лету.

@swc/helpers: runtime-слой

Назначение

@swc/helpers содержит набор функций, которые вставляются в итоговый код при трансформации. Они необходимы для поддержки современных синтаксических конструкций в старых окружениях.

Основная задача — избежать дублирования вспомогательного кода в каждом файле.


Пример необходимости helpers

При трансформации class или async/await SWC может генерировать вспомогательные функции:

class A {
  method() {}
}

После трансформации может появиться использование helper-функций вместо инлайновой логики.


Структура helpers

Пакет включает:

  • функции для работы с классами,
  • реализации наследования,
  • обработку async/await,
  • генераторы,
  • spread/rest операции.

Подключение helpers

Вариант 1: автоматическая вставка

{
  "jsc": {
    "transform": {
      "legacyDecorator": true
    }
  }
}

SWC автоматически добавляет импорты helpers.


Вариант 2: ручное использование

import { _async_to_generator } from "@swc/helpers";

function fn() {
  return _async_to_generator(function* () {
    yield 1;
  });
}

Tree-shaking helpers

Одно из преимуществ — возможность импортировать только используемые функции:

  • уменьшение размера бандла,
  • отсутствие избыточного runtime-кода,
  • совместимость с ESM.

Влияние на размер сборки

Без оптимизации helpers могут увеличивать размер output, однако:

  • современные сборщики удаляют неиспользуемые функции,
  • SWC поддерживает точечный импорт,
  • можно контролировать стратегию генерации helpers.

Взаимодействие @swc/core, @swc/cli и @swc/helpers

Эти пакеты образуют единую цепочку:

  1. @swc/cli получает входные файлы
  2. Передаёт их в @swc/core
  3. Core выполняет трансформацию AST
  4. При необходимости вставляются функции из @swc/helpers
  5. CLI записывает результат в файловую систему

Пример полного пайплайна

npx swc src -d dist

Процесс:

  • чтение файлов
  • парсинг AST в core
  • трансформация (ESNext → target)
  • вставка helpers
  • генерация output
  • запись в dist

Конфигурационные зависимости между пакетами

@swc/core как источник истины

CLI не содержит собственной логики трансформации. Любая конфигурация .swcrc напрямую передаётся в core.

@swc/helpers как опциональный слой

Helpers подключаются только если:

  • используются классы,
  • async/await транспилируется в ES5,
  • активированы определённые transform-флаги.

CLI как orchestration слой

CLI:

  • не анализирует AST,
  • не трансформирует код,
  • управляет потоками выполнения core.

Особенности интеграции в сборщики

Webpack

SWC используется через loader:

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: "swc-loader"
        }
      }
    ]
  }
};

Vite

Использует SWC через плагины:

  • ускоряет dev-server,
  • заменяет esbuild/Babel в отдельных сценариях.

Next.js

SWC интегрирован как основной транспилятор:

  • заменяет Babel,
  • ускоряет build-time,
  • уменьшает конфигурационную сложность.

Итоговая модель пакетов SWC

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

  • core отвечает за вычисления и трансформацию AST,
  • cli отвечает за пользовательский интерфейс и файловую обработку,
  • helpers закрывают runtime-зависимости результирующего кода.

Такое разделение делает систему гибкой: core можно использовать как библиотеку, CLI как инструмент, а helpers как минимальный runtime-слой для совместимости JavaScript-версий.