Большинство API SWC в JavaScript, включая @swc/core, возвращают результат
трансформации в виде объекта с фиксированной структурой. Основные поля:
Дополнительно в некоторых режимах могут присутствовать вспомогательные
поля (например, warnings), но базовая и наиболее используемая форма
результата ограничивается именно парой code и
map.
code
Поле code содержит строку с результатом компиляции или
трансформации исходного кода.
code
Всегда возвращается как string
Представляет собой:
Полностью готов к выполнению в JavaScript-движке
{
code: "const add = (a, b) => a + b;",
map: null
}
В зависимости от конфигурации SWC:
jsc.target влияет на уровень трансформации синтаксиса
minify изменяет структуру и длину кода
sourceMaps определяет наличие и формат map
При включённой минификации code может содержать:
map
Поле map содержит информацию для сопоставления
результирующего кода с исходным. Это реализация Source Map
Specification, используемая всеми современными инструментами
сборки.
map
Source map позволяет:
map
SWC может возвращать map в двух основных формах:
Наиболее распространённый вариант:
{
code: "const x = 1;",
map: "{\"version\":3,\"sources\":[\"input.js\"],\"names\":[],\"mappings\":\"AAAA\"}"
}
При некоторых конфигурациях или внутренней обработке:
{
code: "const x = 1;",
map: {
version: 3,
sources: ["input.js"],
names: [],
mappings: "AAAA",
file: "output.js",
sourcesContent: ["const x = 1;"]
}
}
Типичный объект map включает следующие поля:
Версия спецификации source map. Почти всегда:
3
Массив исходных файлов:
sources: ["input.ts"]
Список идентификаторов, участвующих в маппинге:
names: ["add", "result"]
Основная часть source map — закодированная строка соответствий:
"AAAA,SAASA,GAAG,CAACC,CAAD,EAAGC,CAAH"
Это VLQ-кодированная структура, описывающая:
Опциональное поле, содержащее исходный код:
sourcesContent: [
"export const add = (a, b) => a + b;"
]
Имя результирующего файла:
file: "output.js"
code и map
Оба поля формируют единый механизм отладки:
code — исполняемый результат
map — обратная проекция к исходнику
Связь между ними строится построчно и посимвольно. Каждый сегмент
mappings указывает:
code
sources
transform и transformSync
Синхронный API:
import { transformSync } from "@swc/core";
const result = transformSync("const x = 1;", { jsc: { target: "es2020"
}, sourceMaps: true });
Возвращает:
{
code: "...",
map: "..."
}
import { transform } from "@swc/core";
const result = await transform("const x = 1;", {
jsc: {
target: "es2020"
},
sourceMaps: true
});
Формат результата аналогичен, но обёрнут в Promise.
map
Генерирует внешний source map.
Встраивает map внутрь code:
code: "const x = 1;//
map: null
Полностью отключает генерацию:
{
code: "...",
map: null
}
map
При передаче через API или сохранении в файл возникают важные нюансы:
Требует парсинга:
JSON.parse(result.map)
Удобен для дальнейшей модификации:
sourcesContent
file
code /
map
Vite / Webpack / esbuild-пайплайны используют map для
цепочки трансформаций.
Каждый этап:
map предыдущего шага
DevTools используют map для отображения оригинального
TypeScript/JSX кода вместо сгенерированного JavaScript.
При анализе AST-пайплайнов:
code используется как конечный артефакт
map сохраняется для диагностики ошибок
При ручной модификации code без обновления
map:
При сборке монорепозиториев:
sourcesContent может значительно увеличивать размер
map
Генерация map увеличивает:
Особенно заметно при:
SWC map совместим с:
При включённой минификации структура сохраняется:
{
code: "const a=1,b=2;console.log(a+b);",
map: "{...}"
}
Особенности:
names
mappings
Концептуально результат можно представить как:
TransformationResult
├── code: string
└── map: string | object | null
где map является необязательной, но критически важной
частью при разработке и отладке сложных JavaScript-приложений.