SWC использует модульный синтаксический парсер, реализованный на Rust,
который отвечает за преобразование исходного кода JavaScript и
TypeScript в абстрактное синтаксическое дерево (AST). Конфигурация
парсера задаётся через поле jsc.parser в
.swcrc и определяет, какие языковые расширения включаются
при разборе исходного кода.
Парсер SWC строго разделяет базовый синтаксис ECMAScript и дополнительные расширения: JSX, TypeScript, декораторы и экспериментальные возможности. Это позволяет управлять точностью разбора и производительностью компиляции.
Основная структура конфигурации выглядит следующим образом:
{
"jsc": {
"parser": {
"syntax": "ecmascript"
}
}
}
Параметр syntax определяет основной режим разбора:
ecmascript — стандартный JavaScript
typescript — TypeScript
jsx — JavaScript с JSX
Выбор режима влияет на доступные опции внутри парсера.
При выборе syntax: “ecmascript” активируется классический
JavaScript-парсер с расширениями через дополнительные флаги.
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": true,
"dynamicImport": true,
"privateMethod": true,
"functionBind": true
}
}
}
Опция jsx включает поддержку JSX-выражений без переключения
на TypeScript:
"jsx": true
Поддерживаются конструкции:
const element = <div className="root">Text</div>;
Флаг dynamicImport активирует поддержку динамического
импорта:
"dynamicImport": true
Разбор конструкции:
import("./module").then(m => m.run());
Без включения этой опции подобный синтаксис считается ошибкой.
SWC поддерживает приватные элементы классов:
"privateMethod": true
Пример синтаксиса:
class A {
return 42;
}
}
Также часто используется вместе с:
"privateProperty": true
для полей:
class A {
#value = 10;
}
Поддержка оператора привязки:
"functionBind": true
Синтаксис:
const bound = obj::obj.method;
При выборе syntax: “typescript” активируется полноценный
TypeScript-парсер:
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true,
"dynamicImport": true
}
}
}
"tsx": true
Поддержка TSX позволяет использовать JSX внутри TypeScript-файлов:
const App = () => <div>Hello</div>;
TSX требует включённого JSX-парсинга и корректной обработки типов.
"decorators": true
Декораторы используются для метапрограммирования:
@sealed
class Service {
execute() {}
}
SWC поддерживает современную спецификацию decorators (stage 3/ECMAScript proposal), включая декораторы классов и членов класса.
При включении typescript автоматически поддерживаются:
Пример:
function identity<T>(value: T): T {
return value;
}
При использовании syntax: “jsx” парсер ориентирован на
JavaScript с JSX без TypeScript:
{
"jsc": {
"parser": {
"syntax": "jsx",
"dynamicImport": true
}
}
}
Этот режим часто используется в React-проектах без TypeScript.
Пример AST-совместимого кода:
const Page = () => (
<section>
<h1>Title</h1>
</section>
);
Некоторые параметры являются кросс-синтаксическими и работают в разных режимах:
| Опция | ECMAScript | JSX | TypeScript |
|---|---|---|---|
| dynamicImport | да | да | да |
| decorators | нет | нет | да |
| privateMethod | да | да | да |
| functionBind | да | да | частично |
| tsx | нет | нет | да |
SWC использует строгую модель синтаксического анализа:
Ошибки парсинга часто возникают из-за несоответствия syntax
и дополнительных флагов.
.swcrc для реальных сценариев
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"jsx": true,
"dynamicImport": true
}
}
}
{
"jsc": {
"parser": {
"syntax": "typescript",
"tsx": true,
"decorators": true,
"dynamicImport": true
}
}
}
{
"jsc": {
"parser": {
"syntax": "ecmascript",
"dynamicImport": true
}
}
}
AST, построенный парсером SWC, напрямую влияет на последующие стадии компиляции:
React.createElement или автоматические
runtime-функции
Корректная настройка парсера определяет, какие узлы AST будут доступны для трансформеров.
Типичные проблемы:
"syntax": "ecmascript"
при наличии TypeScript приводит к ошибкам разбора типов.
const x = <div />;
без “jsx”: true интерпретируется как оператор сравнения.
@log
class A {}
без “decorators”: true вызывает синтаксическую ошибку.
Парсер SWC оптимизирован для высокой скорости:
Конфигурация парсера влияет на производительность: чем больше включённых фич, тем выше сложность грамматики, но влияние остаётся минимальным по сравнению с трансформациями.
Парсер SWC не является полностью динамическим, но поддерживает расширения через флаги:
Каждая комбинация строго проверяется на грамматическую совместимость до запуска трансформаций.