Поле jsc.parser

## Поле `jsc.parser` в конфигурации SWC ### Назначение и место в архитектуре компиляции В конфигурации SWC раздел `jsc` отвечает за поведение JavaScript/TypeScript-компилятора, а вложенное поле `parser` определяет, каким образом исходный код разбирается в абстрактное синтаксическое дерево (AST). Именно на этом этапе текст программы превращается в структурированное представление, пригодное для трансформаций, оптимизаций и генерации выходного кода. Парсер является первой значимой стадией пайплайна SWC после чтения исходного файла. Любые ошибки или неточности в его настройке приводят к невозможности корректного построения AST, а значит — блокируют весь последующий процесс трансформации. --- ### Общая структура `jsc.parser` Типичная конфигурация поля имеет вид: ```json { "jsc": { "parser": { "syntax": "ecmascript", "jsx": false, "dynamicImport": false, "privateMethod": false, "functionBind": false, "exportDefaultFrom": false, "exportNamespaceFrom": false, "decorators": false, "decoratorsBeforeExport": false, "topLevelAwait": false, "importAssertions": false } } } ``` Каждое поле управляет поддержкой конкретного синтаксического расширения языка. --- ### `syntax`: выбор языка разбора #### Возможные значения * `"ecmascript"` * `"typescript"` * `"typescript"` с JSX (через отдельный флаг `tsx`) #### Поведение Поле `syntax` определяет базовый грамматический профиль: * `ecmascript` — стандартный JavaScript без TypeScript-аннотаций * `typescript` — расширенный парсер с поддержкой типов, интерфейсов и деклараций * JSX поддерживается дополнительно через `jsx: true` #### Влияние на AST Выбор синтаксиса напрямую влияет на структуру дерева: * В режиме `ecmascript` типы игнорируются (если они присутствуют — ошибка) * В режиме `typescript` типовые узлы включаются в AST и далее могут быть удалены трансформером --- ### `jsx`: обработка JSX-выражений #### Назначение Флаг `jsx` включает поддержку JSX-синтаксиса: ```jsx const element =
Hello
; ``` #### Поведение * При `jsx: false` символ `<` интерпретируется как оператор сравнения * При `jsx: true` активируется JSX-грамматика #### Важные особенности JSX в SWC не зависит от React напрямую. Это лишь синтаксический уровень. Трансформация JSX в вызовы функций происходит позже через плагины или пресеты. --- ### `tsx`: комбинация TypeScript + JSX Хотя в некоторых конфигурациях используется `jsx`, в TypeScript-проектах часто активируется режим TSX. #### Особенности: * Разрешает одновременное использование типов и JSX * Изменяет правила разбора угловых скобок * Требует строгого разрешения неоднозначностей между generic и JSX-элементами --- ### `dynamicImport`: поддержка динамических импортов ```js import("./module.js").then(m => m.run()); ``` #### При `true`: Парсер распознаёт `import()` как выражение. #### При `false`: `import` трактуется как синтаксическая ошибка вне статического контекста. --- ### `privateMethod`: приватные методы классов ```js class A { #secret() {} } ``` #### Значение флага: * `true` — разрешает парсинг приватных полей и методов * `false` — синтаксическая ошибка при `#` #### Влияние на AST: Приватные методы формируют отдельные узлы класса, которые позже могут быть трансформированы в WeakMap или другие структуры (в зависимости от target). --- ### `functionBind`: оператор привязки функции Поддержка устаревшего proposal: ```js obj::method(); ``` #### При включении: Парсер принимает `::` как bind-оператор. #### При выключении: Синтаксическая ошибка. --- ### `exportDefaultFrom` и `exportNamespaceFrom` Эти флаги управляют поддержкой нестандартных экспортных конструкций: ```js export v from "module"; export * as ns from "module"; ``` #### `exportDefaultFrom` Позволяет синтаксис: ```js export v from "mod"; ``` #### `exportNamespaceFrom` Поддерживает: ```js export * as ns from "mod"; ``` --- ### `decorators` и `decoratorsBeforeExport` Декораторы — один из наиболее сложных элементов синтаксиса, особенно в TypeScript и Stage-3 proposal. #### `decorators` Включает базовую поддержку: ```js @readonly class A {} ``` #### `decoratorsBeforeExport` Указывает позицию декораторов: * `true` — декоратор применяется до `export` * `false` — после `export` Различие критично, так как меняет порядок применения AST-трансформаций. --- ### `topLevelAwait` Разрешает использование `await` вне async-функций: ```js const data = await fetch(url); ``` #### При включении: * Модуль интерпретируется как ES Module с поддержкой top-level await * Влияет на кодогенерацию (часто требует async-обёрток в некоторых бандлерах) --- ### `importAssertions` Поддержка импорт-assertions: ```js import data from "./file.json" assert { type: "json" }; ``` #### Поведение: * Парсер распознаёт блок `assert { ... }` * Формирует отдельный узел AST для assertions --- ### Взаимодействие параметров между собой Поле `jsc.parser` не является набором независимых флагов. Многие комбинации влияют друг на друга: #### JSX + TypeScript * `syntax: "typescript"` + `jsx: true` → TSX режим * Требует аккуратного разрешения грамматики generic/JSX #### Decorators + Class Fields * Часто используются вместе * Порядок обработки влияет на итоговую структуру класса #### Dynamic Import + Top-level Await * Влияют на модульную систему * Могут менять интерпретацию файла как ESM --- ### Ошибки конфигурации парсера #### Конфликт JSX и syntax При `syntax: "ecmascript"` и `jsx: false`: ```jsx const x =
; ``` будет интерпретирован как ошибка или битовый сдвиг в зависимости от контекста. --- #### Неподдерживаемые конструкции Если флаг отключён, SWC выдаёт синтаксическую ошибку на этапе парсинга, не доходя до трансформации. --- ### Внутренняя роль `parser` в SWC pipeline Этапы обработки: 1. Чтение исходного кода 2. Лексический анализ (tokenization) 3. Синтаксический анализ (`jsc.parser`) 4. Построение AST 5. Трансформации (`jsc.transform`) 6. Генерация кода Парсер является критическим узлом, где определяется корректность дальнейшего компиляционного пути. --- ### AST-структуры, формируемые парсером В зависимости от включённых флагов формируются дополнительные узлы: * JSXElement * TSInterfaceDeclaration * TSTypeAnnotation * Decorator * ImportAssertion * PrivateName * DynamicImportExpression Каждый тип узла влияет на нагрузку последующих трансформеров. --- ### Производительность парсинга SWC использует Rust-реализацию парсера, что даёт: * минимальные накладные расходы * потоковую обработку токенов * отсутствие необходимости в промежуточных строковых структурах Конфигурация `jsc.parser` влияет не только на синтаксис, но и на количество активных ветвей грамматики, что отражается на скорости разбора. --- ### Практическое значение конфигурации Правильная настройка `jsc.parser` обеспечивает: * корректную интерпретацию современного JavaScript * совместимость с TypeScript-проектами * поддержку экспериментальных возможностей языка * предсказуемость AST для трансформаций и плагинов Неправильная настройка приводит к: * ошибкам компиляции * частичной потере синтаксических конструкций * некорректной трансформации кода