Настройка SWC для транспиляции JavaScript/TypeScript

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

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка SWC для транспиляции JavaScript/TypeScript
Средняя
от 4 часов до 2 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Настройка SWC для транспиляции JavaScript/TypeScript

SWC (Speedy Web Compiler) — транспилятор написанный на Rust, совместимый с Babel по набору трансформаций. Он в 20–70 раз быстрее Babel на холодной сборке. Next.js использует SWC по умолчанию с версии 12. Vite применяет его для TypeScript через esbuild, а для JSX-трансформаций — через плагин. Jest с @swc/jest запускает тесты заметно быстрее чем с babel-jest.

Установка standalone

npm install --save-dev @swc/core @swc/cli

.swcrc — основной конфиг:

{
  "$schema": "https://swc.rs/schema.json",
  "jsc": {
    "parser": {
      "syntax": "typescript",
      "tsx": true,
      "decorators": true,
      "dynamicImport": true
    },
    "transform": {
      "react": {
        "runtime": "automatic",
        "development": false,
        "refresh": false
      },
      "legacyDecorator": false,
      "decoratorMetadata": false
    },
    "target": "es2020",
    "loose": false,
    "externalHelpers": true,
    "keepClassNames": true
  },
  "env": {
    "targets": "> 0.5%, last 2 versions, not dead",
    "mode": "usage",
    "coreJs": "3"
  },
  "minify": false
}
npm install @swc/helpers  # externalHelpers: true — общие хелперы вместо инлайн
npm install core-js@3     # для полифилов через env.mode: "usage"

Интеграция с webpack через swc-loader

npm install --save-dev swc-loader
// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.(ts|tsx|js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: 'swc-loader',
          // опции можно задать инлайн или оставить пустым — читает .swcrc
        },
      },
    ],
  },
};

Замена babel-loader на swc-loader в реальных проектах даёт ускорение сборки в 3–5 раз.

Jest с @swc/jest

npm install --save-dev @swc/jest
// jest.config.mjs
export default {
  transform: {
    '^.+\\.(ts|tsx|js|jsx)$': [
      '@swc/jest',
      {
        jsc: {
          parser: {
            syntax: 'typescript',
            tsx: true,
            decorators: true,
          },
          transform: {
            react: { runtime: 'automatic' },
          },
        },
        env: {
          targets: { node: 18 },
        },
      },
    ],
  },
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },
};

Декораторы

SWC поддерживает два варианта:

Legacy TypeScript декораторы (для MobX, TypeORM, NestJS со старым синтаксисом):

{
  "jsc": {
    "parser": { "decorators": true },
    "transform": {
      "legacyDecorator": true,
      "decoratorMetadata": true
    }
  }
}

Новые TC39 декораторы (2023-11, финализированный стандарт):

{
  "jsc": {
    "parser": { "decorators": true },
    "transform": {
      "legacyDecorator": false,
      "useDefineForClassFields": false
    },
    "experimental": {
      "decorators": true
    }
  }
}

Кастомные плагины через Wasm

В отличие от Babel (где плагины пишутся на JS), SWC-плагины компилируются в WebAssembly. Это усложняет написание собственных плагинов, но существующие работают быстро:

npm install --save-dev @swc-contrib/plugin-styled-components
{
  "jsc": {
    "experimental": {
      "plugins": [
        ["@swc-contrib/plugin-styled-components", {
          "displayName": true,
          "ssr": true
        }]
      ]
    }
  }
}

Каталог плагинов: swc.rs/docs/plugin/ecmascript/plugin-usage

SWC в Rollup через @rollup/plugin-swc

npm install --save-dev @rollup/plugin-swc
import swc from '@rollup/plugin-swc';

export default {
  input: 'src/index.ts',
  plugins: [
    swc({
      swc: {
        jsc: {
          parser: { syntax: 'typescript' },
          target: 'es2020',
        },
      },
    }),
  ],
};

Различия с Babel

Аспект Babel SWC
Скорость baseline 20–70x быстрее
Type checking нет нет
Кастомные плагины JS, легко писать Rust/Wasm, сложнее
Ecosystem plugins огромная растущая
decoratorMetadata через плагин встроенно
Source maps стабильные иногда есть расхождения

Что SWC не делает

Как и Babel, SWC только транспилирует — не проверяет типы. tsc --noEmit остаётся обязательным шагом в CI:

{
  "scripts": {
    "typecheck": "tsc --noEmit",
    "build": "swc src -d dist && npm run typecheck"
  }
}

Сроки

Замена Babel на SWC в webpack-проекте: 2–4 часа (замена loader, перенос конфига, тестирование). Настройка SWC для Jest вместо babel-jest: 1–2 часа. Настройка с декораторами и кастомными wasm-плагинами: 4–8 часов.