AMD (Asynchronous Module Definition) представляет собой формат модульной системы, ориентированный на асинхронную загрузку зависимостей в браузерной среде. Его ключевая особенность заключается в том, что модули определяются и подгружаются динамически, без необходимости блокирующей компиляции всего графа зависимостей заранее.
В экосистеме современных инструментов сборки AMD рассматривается как один из исторических форматов модульности наряду с CommonJS и UMD. Несмотря на доминирование ESM, AMD сохраняет актуальность в системах, где требуется:
SWC, как высокопроизводительный компилятор, обеспечивает трансформацию современных JavaScript/TypeScript модулей в AMD-совместимый формат, выступая заменой Babel в задачах транспиляции.
AMD строится вокруг функции define, которая описывает
модуль:
define([&
return {
value: dep1 + dep2
};
});
Ключевые характеристики:
В отличие от CommonJS:
const dep = require('dep');
AMD требует декларативного описания зависимостей до выполнения модуля.
SWC выполняет трансформацию исходного кода через AST-проходы (Abstract
Syntax Tree). При работе с AMD ключевая задача компилятора —
преобразовать ESM или CommonJS модули в форму define.
import a from './a.js';
import { b } from './b.js';
export const result = a + b;
define(['./a.js', './b.js'], function (a, b) {
return {
result: a + b
};
});
SWC анализирует:
и строит эквивалентную AMD-обёртку.
Основная настройка выполняется через .swcrc.
{
"module": {
"type": "amd"
}
}
Минимальная конфигурация включает только указание типа модулей, однако в реальных сборках добавляются дополнительные параметры:
{
"jsc": {
"parser": {
"syntax": "typescript"
},
"target": "es5"
},
"module": {
"type": "amd"
}
}
Ключевые элементы:
syntax: поддержка TS/JSX
target: уровень генерации кода
module.type: стратегия модульного вывода
SWC строит граф зависимостей на основе статического анализа импортов.
Статические import
Динамические import()
require-подобные вызовы или отдельные чанки
(в зависимости от пайплайна)
Side-effect импорты
import './polyfill.js';
превращаются в зависимость без аргумента в фабрике:
define(['./polyfill.js'], function () {});
SWC создаёт обёртку define с фабричной функцией:
define(['dep'], function (dep) {
// тело модуля
});
Если присутствует export default, он транслируется как
return:
export default function () {}
превращается в:
define([], function () {
return function () {};
});
Named exports агрегируются в объект возврата:
export const a = 1;
export const b = 2;
Результат:
define([], function () {
return {
a: 1,
b: 2
};
});
При этом SWC сохраняет семантику ленивых вычислений только частично, так как AMD требует немедленного построения объекта экспорта.
AMD не гарантирует синхронный порядок загрузки зависимостей. SWC компенсирует это через явное перечисление массива зависимостей.
Проблемные случаи:
SWC не выполняет runtime-резолвинг, а лишь подготавливает структуру, поэтому поведение зависит от loader-а (например RequireJS).
AMD исторически связан с RequireJS, который интерпретирует
define.
SWC-вывод совместим с:
Пример загрузки:
require(['moduleA'], function (moduleA) {
console.log(moduleA);
});
Основные различия:
SWC:
Babel:
SWC:
Babel:
Несмотря на высокую скорость и корректность, существуют ограничения:
TypeScript-код обрабатывается SWC через предварительный парсинг:
export interface User {
id: number;
name: string;
}
Интерфейсы удаляются, а экспортируемые значения транслируются в AMD-структуру без изменений типов.
При target: es5 SWC дополнительно:
let/const на var
Пример:
class A {
method() {}
}
превращается в ES5-совместимую форму внутри AMD:
define([], function () {
function A() {}
A.prototype.method = function () {};
return A;
});
SWC применяет ряд оптимизаций:
Однако полноценный bundling не выполняется — SWC остаётся транспилятором, а не сборщиком.
Несмотря на устаревание формата, AMD сохраняет техническую значимость в следующих сценариях:
SWC обеспечивает быстрый и стабильный слой трансформации, позволяющий включать AMD в современные пайплайны без существенных затрат на производительность.