В экосистеме SWC разбор исходного кода реализован как этап трансформации
текста программы в структурированное представление — AST (Abstract
Syntax Tree). Именно через AST функции parse и
parseSync предоставляют доступ к синтаксическому дереву,
которое затем используется для анализа, трансформации и генерации кода.
AST в SWC представляет собой строго типизированную и иерархическую модель программы, где каждый узел соответствует синтаксической конструкции языка: модулям, объявлениям, выражениям, операторам, литералам и прочим элементам. В отличие от текстового представления, AST устраняет неоднозначность и делает возможной детальную работу с кодом на уровне структуры.
Основные компоненты AST включают:
Функция parse в SWC выполняет разбор исходного кода и
возвращает AST в виде Promise. Она используется в сценариях, где парсинг
является частью асинхронного пайплайна обработки — например, при
интеграции с серверными обработчиками, сборщиками или инструментами
анализа кода.
Сигнатура функции обычно выглядит следующим образом:
import { parse } from "@swc/core";
const ast = await parse(code, {
syntax: "ecmascript",
target: "es2022",
jsx: true,
decorators: false,
dynamicImport: true
});
Первый аргумент — исходный код в виде строки. Второй — объект конфигурации парсера.
Ключевые параметры конфигурации:
syntax — определяет диалект языка:
jsx — включает поддержку JSX-синтаксиса
decorators — включает поддержку декораторов
dynamicImport — разрешает динамический import()
target — уровень трансляции ECMAScript
Асинхронная природа parse связана с тем, что SWC может быть
встроен в окружения, где обработка выполняется в параллельных потоках
или через нативные биндинги Rust, что позволяет не блокировать event
loop при обработке больших файлов.
Результатом выполнения parse является AST-объект,
соответствующий структуре ECMAScript модуля. Этот объект может быть
передан в трансформеры SWC или использован для анализа кода.
Функция parseSync выполняет ту же задачу, но в синхронном
режиме. Она возвращает AST напрямую, без использования Promise. Это
делает её предпочтительной в контекстах, где требуется предсказуемое
выполнение без асинхронных переходов.
Пример использования:
import { parseSync } from "@swc/core";
const ast = parseSync(code, {
syntax: "typescript",
tsx: true,
decorators: true
});
Синхронный парсер особенно полезен в следующих сценариях:
Несмотря на синхронный интерфейс, внутренняя реализация SWC остаётся высокопроизводительной благодаря Rust-ядру, что делает разбор даже больших файлов значительно быстрее традиционных JavaScript-парсеров.
AST, возвращаемый parse и parseSync, строго
структурирован и соответствует спецификации SWC AST.
Пример упрощённой структуры:
{
"type": "Module",
"body": [
{
"type": "FunctionDeclaration",
"identifier": {
"value": "sum"
},
"params": [
{
"pat": {
"type": "Identifier",
"value": "a"
}
}
]
}
]
}
Каждый узел содержит:
Поле span играет ключевую роль при трансформации кода,
позволяя точно сопоставлять AST-узлы с исходными фрагментами текста.
Разделение на асинхронный и синхронный API отражает архитектурную гибкость SWC:
parse интегрируется в асинхронные пайплайны и позволяет
масштабировать обработку
parseSync минимизирует накладные расходы на управление
асинхронностью
При этом оба метода используют общий парсерный движок, поэтому различие заключается только в способе вызова и возврата результата, а не в логике анализа.
SWC поддерживает расширенный синтаксис, включая TypeScript и JSX, без необходимости подключения дополнительных плагинов.
При разборе TypeScript-кода AST включает дополнительные узлы:
JSX-деревья включают:
Пример парсинга TypeScript:
import { parseSync } from "@swc/core";
const ast = parseSync(`
interface User {
id: number;
name: string;
}
`, {
syntax: "typescript"
});
После получения AST становится возможным:
AST SWC часто используется как промежуточное представление в инструментах, заменяющих Babel-парсеры, благодаря высокой скорости и низкому потреблению памяти.
Каждый узел AST содержит span, описывающий границы
исходного фрагмента:
Эта информация позволяет:
При некорректном синтаксисе SWC генерирует структурированную ошибку, содержащую:
Пример:
try {
parseSync("const a = ", { syntax: "ecmascript" });
} catch (e) {
console.log(e.message);
}
Ошибки парсинга встроены в систему диагностики SWC и могут использоваться для построения подсветки в редакторах или линтинговых инструментов.
Ключевым преимуществом SWC является реализация парсера на Rust. Это обеспечивает:
При больших кодовых базах разница с JavaScript-парсерами становится особенно заметной, что делает SWC предпочтительным выбором в современных сборочных системах.