В конфигурации SWC поле plugin используется для подключения
пользовательских трансформаций, расширяющих стандартный набор
преобразований компилятора. Оно позволяет внедрять дополнительную логику
обработки AST, реализованную как плагин, который выполняется в процессе
трансформации исходного кода.
SWC рассматривает плагины как отдельные модули, подключаемые на этапе компиляции, которые могут изменять синтаксическое дерево до генерации конечного JavaScript-кода. Такая архитектура делает систему расширяемой без необходимости модифицировать ядро трансформера.
Поле plugin может встречаться в зависимости от версии
конфигурации SWC и используемой схемы:
jsc;
experimental.
Наиболее распространённая форма:
{
"jsc": {
"experimental": {
"plugins": []
}
}
}
Однако концептуально поле plugin часто рассматривается как
обобщённое обозначение механизма подключения расширений, тогда как
фактическая реализация в SWC чаще использует массив
plugins.
Каждый подключаемый плагин задаётся как элемент массива, содержащий:
Общий формат:
{
"jsc": {
"experimental": {
"plugins": [
["plugin-name", { "optionA": true, "optionB": "value" }]
]
}
}
}
Первый элемент массива — это точка подключения плагина, второй — объект настроек, передаваемый в его инициализацию.
SWC поддерживает несколько категорий плагинов, которые могут быть использованы через конфигурационное поле:
Наиболее распространённый формат. Плагин компилируется в WebAssembly и загружается во время выполнения трансформации.
Особенности:
Пример подключения:
{
"jsc": {
"experimental": {
"plugins": [
["@swc/plugin-console", {}]
]
}
}
}
Используются внутри экосистемы SWC и могут быть встроены в бинарную сборку трансформера.
Особенности:
В некоторых сценариях используются JS-модули, которые лишь делегируют работу WASM-части.
Если в конфигурации указано несколько плагинов, они выполняются последовательно в порядке объявления:
{
"jsc": {
"experimental": {
"plugins": [
["plugin-a", {}],
["plugin-b", {}],
["plugin-c", {}]
]
}
}
}
Последовательность важна, поскольку каждый следующий плагин получает AST, уже модифицированное предыдущими.
Плагины выполняются на стадии, когда исходный код уже:
После выполнения плагинов AST проходит стандартные стадии:
Таким образом, plugin влияет именно на промежуточное
представление программы.
Конфигурационный объект второго аргумента позволяет параметризовать поведение плагина.
Пример:
{
"jsc": {
"experimental": {
"plugins": [
[
"remove-debug-plugin",
{
"removeConsole": true,
"removeDebugger": true
}
]
]
}
}
}
Внутри плагина эти параметры интерпретируются как конфигурация поведения трансформации AST.
Предположим, используется плагин, удаляющий все вызовы
console.log.
Конфигурация:
{
"jsc": {
"experimental": {
"plugins": [
[
"strip-console",
{
"methods": ["log", "info"]
}
]
]
}
}
}
Исходный код:
console.log("debug");
console.info("info");
console.error("error");
Результат трансформации:
console.error("error");
Плагин воздействует только на указанные методы, оставляя остальные без изменений.
Поле plugin может ссылаться как на:
{
"jsc": {
"experimental": {
"plugins": [
["@company/swc-plugin-optimize", {}]
]
}
}
}
{
"jsc": {
"experimental": {
"plugins": [
["./plugins/custom-plugin.wasm", {}]
]
}
}
}
Модель плагинов SWC накладывает ряд ограничений:
Плагины не имеют прямого доступа к файловой системе или сетевым ресурсам. Это повышает безопасность, но ограничивает функциональность.
В отличие от Node.js трансформеров, плагины работают в изолированной среде выполнения.
Доступ предоставляется через строго типизированные структуры, отражающие синтаксис JavaScript.
Использование plugin влияет на скорость компиляции:
Рекомендуется:
Поле plugin работает совместно с другими конфигурационными
блоками:
jsc.parser — определяет синтаксис входного кода;
jsc.transform — базовые трансформации;
minify — минификация;
env — полифиллы и таргетинг.
Плагины выполняются до финальной генерации кода, но после парсинга и базовой нормализации AST.
Порядок обработки можно представить как цепочку:
parser)
plugin-слой
transform)
minify)
Любое изменение AST на уровне plugin влияет на все
последующие стадии.
Типичные ошибки при использовании:
"plugins": [
"plugin-name"
]
Плагин должен быть массивом из двух элементов, даже если нет опций.
Некоторые плагины требуют обязательный конфигурационный объект:
["plugin-name"] // некорректно
Плагин может требовать определённую версию SWC, иначе трансформация завершается ошибкой загрузки.
Поле plugin часто применяется не только для синтаксических
трансформаций, но и для архитектурных задач:
Пример инъекции логирования:
{
"jsc": {
"experimental": {
"plugins": [
[
"function-wrapper",
{
"wrapWith": "logger"
}
]
]
}
}
}
Если плагин вызывает ошибку:
Некоторые сборочные системы позволяют игнорировать ошибки плагинов, но это зависит от интеграции, а не от SWC.
SWC может кешировать результаты трансформации при неизменных условиях:
plugin;
Изменение хотя бы одного параметра конфигурации приводит к инвалидированию кеша.
Поле plugin является ключевым механизмом расширения SWC без
изменения ядра трансформатора. Оно формирует промежуточный уровень
абстракции между:
За счёт этого SWC может использоваться как универсальный компиляторный слой в различных экосистемах — от веб-приложений до серверных сборок и монорепозиториев.