javascript42
Главная
Все учебники
Блог
Учебник SWC
Введение в SWC
Что такое SWC и зачем он нужен
Сравнение с Babel: скорость, архитектура, ограничения
Сравнение с esbuild и другими компиляторами
Когда стоит выбирать SWC
Архитектура SWC: Rust под капотом
Экосистема вокруг SWC: плагины, интеграции, инструменты
Установка и базовая настройка
Установка через npm, yarn, pnpm
Структура пакетов: @swc/core, @swc/cli, @swc/helpers
Первый запуск: компиляция одного файла
Конфигурационный файл .swcrc: формат и расположение
Конфигурация через package.json
Переменные окружения и их влияние на поведение компилятора
Поддерживаемые платформы и ограничения
Конфигурация компилятора
Структура объекта конфигурации
Поле jsc: настройка компилятора JavaScript
Указание целевой среды: targets и env
Настройка синтаксического парсера: parser
Настройка трансформаций: transform
Поле module: системы модулей и их параметры
Поле sourceMaps: генерация карт источников
Поле minify: подключение минификации
Поле env: интеграция с browserslist
Поле test, exclude, include: фильтрация файлов
Поле isModule и его влияние на обработку
Расширенные параметры: assumptions
Трансформация JavaScript
Поддерживаемые версии ECMAScript
Трансформация стрелочных функций
Трансформация классов и наследования
Трансформация шаблонных литералов
Деструктуризация и параметры по умолчанию
Оператор spread и rest-параметры
Трансформация генераторов и итераторов
async/await и трансформация в промисы
Optional chaining и nullish coalescing
Логические операторы присваивания
Трансформация приватных полей классов
Статические поля и методы классов
Декораторы: поддержка и версии спецификации
Трансформация динамического import()
BigInt: ограничения и поведение
Глобальные объекты и полифилы
TypeScript
Поддержка TypeScript в SWC
Отличие от tsc: только трансформация, не проверка типов
Настройка парсера для TypeScript
Поддерживаемые конструкции TypeScript
Декораторы TypeScript и параметр emitDecoratorMetadata
Обработка namespace и enum
Трансформация const enum
Поведение при ошибках типов
Совместное использование SWC и tsc
tsconfig.json и его взаимодействие с .swcrc
JSX и TSX
Поддержка JSX
Классический и автоматический runtime
Настройка pragmas: jsxFactory, jsxFragmentFactory
Импорт React при автоматическом runtime
TSX: совместная обработка TypeScript и JSX
Использование с Preact, Solid и другими фреймворками
Настройка importSource
Трансформация JSX в production и development
Системы модулей
CommonJS: трансформация и особенности
ES Modules: сохранение и трансформация
AMD
UMD: универсальный формат
SystemJS
Настройка interopRequireDefault и interopRequireWildcard
lazy-опция для отложенного импорта
Поведение с dynamic import при разных форматах
noInterop и его последствия
strict и strictMode
Минификация
Включение минификации в конфигурации
Минификация идентификаторов
Сжатие кода: compress
Настройки сжатия: passes, drop_console, drop_debugger
Удаление мёртвого кода
Инлайнинг переменных
Минификация строк и литералов
Особенности минификации в сравнении с terser
Ограничения текущей реализации минификатора
Source Maps
Типы source maps: inline, external, both
Поле sourceFileName и sourceRoot
Совместимость с браузерными DevTools
Работа source maps при минификации
Отладка трансформированного кода
SWC CLI
Установка и использование @swc/cli
Компиляция одного файла
Компиляция директории
Флаги командной строки
Опция --watch: отслеживание изменений
Передача конфигурации через флаги
Вывод результата в stdout
Интеграция в npm-скрипты
Программный API
Подключение @swc/core в Node.js
transform(code, options): асинхронная трансформация
transformSync(code, options): синхронная трансформация
transformFile и transformFileSync
Структура возвращаемого объекта: code, map
parse и parseSync: получение AST
print: генерация кода из AST
Обработка ошибок компиляции
Типизация API при использовании TypeScript
Работа с AST
Структура AST в SWC
Узлы AST: типы и поля
Обход дерева вручную
Паттерн visitor
Изменение узлов
Создание новых узлов
Сериализация и десериализация AST
Ограничения работы с AST через JS API
Плагины
Архитектура плагинов SWC
Плагины на Rust vs плагины на Wasm
Установка и подключение плагина
Поле plugin в конфигурации
Передача опций в плагин
Написание плагина на Rust: базовая структура
Трейт Fold и трейт Visit
Работа с типами AST в Rust
Сборка плагина в Wasm
Публикация плагина в npm
Отладка плагинов
Совместимость версий плагинов и ядра
Интеграция с инструментами сборки
Интеграция с webpack: swc-loader
Настройка swc-loader: опции и производительность
Замена babel-loader на swc-loader
Интеграция с Vite
Интеграция с Rollup: @rollup/plugin-swc
Интеграция с Parcel
Интеграция с esbuild через плагин
Интеграция с Rspack
Интеграция с тестовыми фреймворками
Jest и @swc/jest
Vitest и встроенная поддержка SWC
Сравнение производительности с babel-jest
Интеграция с Next.js
SWC как компилятор по умолчанию в Next.js
Конфигурация через next.config.js
Поддерживаемые трансформации Next.js
styled-components через SWC
Emotion через SWC
Relay через SWC
Remove Console трансформация
React Remove Properties
Отладка компиляции в Next.js
Ограничения и несовместимости
Поддержка предложений TC39
Stage 3 и stage 4: поддержка в SWC
Декораторы: версия 2022-03 и legacy
Using declarations
Import attributes
Явное управление поддерживаемыми предложениями
Производительность
Параллельная обработка файлов
Кэширование в SWC
Профилирование компиляции
Оптимизация конфигурации для скорости
Влияние плагинов на производительность
Бенчмарки и методология измерений
Миграция с Babel
Анализ существующей Babel-конфигурации
Соответствие babel-пресетов настройкам SWC
Соответствие babel-плагинов возможностям SWC
Трансформации, которых нет в SWC
Стратегия частичной миграции
Типичные проблемы при миграции
Совместное использование Babel и SWC в переходный период
Отладка и диагностика
Режим verbose
Чтение сообщений об ошибках SWC
Диагностика некорректной трансформации
Проверка выходного кода вручную
Инструменты для сравнения входного и выходного AST
Версионирование и changelog
Работа в монорепозитории
Общая конфигурация SWC для нескольких пакетов
Переопределение конфигурации на уровне пакета
Интеграция с Turborepo и Nx
Совместное использование @swc/helpers
Справочник конфигурации
Полная схема .swcrc
Поле jsc.parser
Поле jsc.transform
Поле jsc.target
Поле jsc.loose
Поле jsc.externalHelpers
Поле jsc.keepClassNames
Поле jsc.paths и baseUrl
Поле jsc.experimental
Поле env.targets
Поле env.mode и corejs
Поле env.shippedProposals
Поле module.type и его параметры
Поле minify и вложенные поля
Поле sourceMaps
Поле inlineSourcesContent