Поле module в конфигурации SWC определяет, в какой
модульный формат будут транслироваться исходные JavaScript/TypeScript
файлы. Это один из ключевых механизмов трансформации кода, поскольку
именно он управляет тем, как import и export
будут преобразованы для конкретной среды выполнения или сборщика.
На этапе компиляции SWC анализирует исходный модульный синтаксис ECMAScript и преобразует его в целевой формат. Поведение трансформации напрямую зависит от выбранного значения:
Каждый модульный формат имеет собственные правила связывания зависимостей, области видимости и стратегию загрузки.
{
"module": {
"type": "es6"
}
}
Значение es6 (или esnext в некоторых
конфигурациях) сохраняет нативную ESM-модель без преобразования
import/export в другие системы.
Ключевые особенности:
import и export остаются нетронутыми;
Используется, когда целевая среда поддерживает ES Modules напрямую.
{
"module": {
"type": "commonjs"
}
}
При выборе commonjs SWC преобразует ESM-синтаксис в вызовы
require и module.exports.
Пример трансформации:
import fs from "fs";
export const read = () => fs.readFileSync("file.txt");
После компиляции:
const fs = require("fs");
exports.read = () => fs.readFileSync("file.txt");
Особенности:
require;
{
"module": {
"type": "amd"
}
}
AMD ориентирован на браузерную асинхронную загрузку модулей через
define.
Пример результата:
define(["require", "exports"], function (require, exports) {
"use strict";
});
Характерные черты:
{
"module": {
"type": "umd"
}
}
UMD представляет собой универсальный формат, поддерживающий разные окружения: AMD, CommonJS и глобальные переменные браузера.
Типичная структура результата:
(function (global, factory) {
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = factory();
} else if (typeof define === "function" && define.amd) {
define([], factory);
} else {
global.myLibrary = factory();
}
})(this, function () {
return {};
});
Особенности:
{
"module": {
"type": "systemjs"
}
}
SystemJS применяется для динамической загрузки модулей через системный загрузчик.
Характеристики:
SWC предоставляет дополнительные параметры, влияющие на взаимодействие между системами модулей.
{
"module": {
"type": "commonjs",
"noInterop": true
}
}
При включении noInterop отключается автоматическая
генерация обёрток для default import из CommonJS-модулей.
Поведение:
{
"module": {
"type": "commonjs",
"lazy": true
}
}
Параметр lazy влияет на стратегию загрузки экспортов.
Особенности:
{
"module": {
"type": "commonjs",
"strict": true
}
}
strict усиливает соответствие строгим правилам
преобразования CommonJS:
ESM:
CommonJS:
ESM обеспечивает более эффективную работу сборщиков благодаря статическому анализу. CommonJS требует дополнительных обёрток и runtime-обработки, что снижает эффективность оптимизаций.
“type”:
“module” в package.json);
{
"module": {
"type": "es6"
}
}
Цель — сохранить нативные импорты для последующей обработки bundler’ом.
{
"module": {
"type": "commonjs"
}
}
Подходит для проектов без ESM-миграции.
{
"module": {
"type": "umd"
}
}
Используется при необходимости максимальной совместимости.
{
"module": {
"type": "commonjs",
"lazy": true,
"noInterop": true
}
}
Такой набор снижает накладные расходы runtime-обёрток и оптимизирует загрузку.
SWC анализирует каждый модуль и применяет трансформации:
import → require (для CommonJS);
export default → module.exports;
Стратегия трансформации определяется исключительно значением
module.type, что делает его центральным параметром всей
системы сборки.
При использовании SWC вместо tsc:
esModuleInterop частично эмулируется через SWC
interop-логику.
Это приводит к тому, что финальная модульная система определяется не TypeScript, а именно SWC-конфигурацией.
Поле module фактически задаёт стратегию связывания
зависимостей:
Через него SWC перестаёт быть просто транспилятором синтаксиса и становится инструментом управления модульной архитектурой приложения.