Внутренняя модель программы в SWC строится вокруг представления
исходного кода как либо модуля ECMAScript, либо обычного скрипта. Это
различие фиксируется флагом isModule, который входит в
структуру программы (Program) и влияет на весь последующий пайплайн
обработки: парсинг, трансформации, генерацию кода и поведение некоторых
оптимизаций.
Ключевая идея заключается в том, что одинаковый синтаксис JavaScript может интерпретироваться по-разному в зависимости от контекста выполнения. SWC, как компилятор и трансформер, обязан строго учитывать этот контекст, поскольку он меняет семантику почти всех верхнеуровневых конструкций.
isModule
Флаг isModule определяет режим интерпретации исходного
файла:
true — файл рассматривается как ECMAScript Module (ESM)
false — файл рассматривается как Script (обычный скрипт)
Это бинарное различие влияет на:
import / export;
this на верхнем уровне;
SWC использует этот флаг на этапе AST-построения и далее распространяет его через все стадии трансформации.
На этапе парсинга isModule определяет допустимый набор
синтаксических конструкций.
При включённом режиме модуля:
import и export;
strict mode);
top-level await (в современных конфигурациях
SWC);
Пример:
import { readFile } from "fs";
export const value = await readFile("data.txt", "utf-8");
В режиме скрипта:
import и export синтаксически недопустимы;
this на верхнем уровне указывает на глобальный объект;
Пример:
var a = 1;
function test() {
return this;
}
Одним из наиболее критичных эффектов isModule является
изменение модели scope.
В режиме isModule = true:
const secret = 42;
export const api = {
getSecret() {
return secret;
}
};
Переменная secret недоступна извне, несмотря на то что она
находится на верхнем уровне.
При isModule = false:
var могут попадать в global scope;
var shared = 10;
В браузерной среде это может стать window.shared.
SWC использует isModule как триггер автоматического
включения строгого режима.
При isModule = true код неявно интерпретируется как:
"use strict";
Это приводит к:
this (undefined в функциях);
При isModule = false строгий режим зависит от:
“use strict”;
Одно из ключевых влияний isModule связано с поддержкой
ESM-синтаксиса.
SWC:
import и export;
import { a } from "./mod";
export const b = a + 1;
На этапе трансформации может стать:
const mod_1 = require("./mod");
exports.b = mod_1.a + 1;
import/export запрещены;
Флаг isModule критически важен для поддержки top-level
await.
При isModule = true SWC допускает:
const data = await fetch("/api");
Это требует:
При isModule = false:
this на верхнем уровне
Различие между модулем и скриптом особенно заметно в значении
this.
console.log(this);
Результат: undefined
SWC сохраняет это поведение при генерации кода, не добавляя глобальных привязок.
console.log(this);
Результат зависит от среды:
window;
global (или module wrapper).
SWC при транспиляции скриптов учитывает возможную обёртку CommonJS.
Хотя hoisting присутствует в обоих режимах, isModule меняет
контекст его интерпретации.
var не выходит за пределы модуля;
function declarations остаются локальными.
isModule используется как условие для активации ряда
трансформаций.
Если цель сборки — CommonJS:
isModule = true → активируется модульный трансформер;
SWC может выполнять частичное удаление кода:
Для скриптов SWC может добавлять обёртки:
(function () {
var a = 1;
})();
Для модулей обёртка строится иначе:
(function (exports, require, module, __filename, __dirname) {
// module body
});
При транспиляции ESM → CJS значение isModule определяет
стратегию интеропа:
__esModule флага;
default export;
Пример результата:
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = main;
SWC использует isModule для выбора набора синтаксических
ошибок.
with;
В реальных пайплайнах значение isModule редко определяется
вручную. Оно зависит от:
.mjs, .cjs,
.js);
package.json (type: module);
Неправильная установка isModule приводит к:
Флаг isModule в SWC не является вспомогательной
метаинформацией. Он задаёт фундаментальный контекст интерпретации кода,
от которого зависит:
Любая стадия компиляции SWC опирается на это значение как на первичный источник семантического режима файла.