Инлайнинг переменных в SWC относится к классу оптимизаций, при которых идентификаторы заменяются их фактическими значениями или выражениями на этапе компиляции. Основная цель — уменьшение количества обращений к памяти, устранение промежуточных переменных и повышение эффективности последующего минифицирования кода.
В рамках пайплайна SWC этот процесс выполняется до этапа маппинга идентификаторов и часто сопровождается частичным вычислением выражений. Оптимизация тесно связана с анализом области видимости, определением неизменяемости значений и проверкой наличия побочных эффектов.
SWC применяет инлайнинг только в случаях, когда значение переменной можно гарантированно определить на этапе компиляции без изменения семантики программы.
Ключевые условия:
const
Пример безопасного инлайнинга:
const a = 10;
const b = a + 5;
console.log(b);
После трансформации:
const b = 10 + 5;
console.log(b);
Дальнейшее упрощение (folding):
const b = 15;
console.log(b);
SWC активно разворачивает примитивные значения: числа, строки, boolean и
null. Дополнительно применяются правила частичного
вычисления выражений.
const x = 2 * 4;
const y = x + 3;
Результат:
const y = 11;
При этом промежуточная переменная полностью удаляется, если она не используется в других местах.
Особое внимание уделяется цепочкам зависимостей. SWC строит граф использования переменных, после чего выполняет рекурсивное раскрытие значений.
const a = 5;
const b = a;
const c = b;
console.log(c);
После оптимизации:
console.log(5);
Такой процесс требует анализа ссылочной замкнутости и отслеживания алиасов.
Инлайнинг блокируется, если переменная может быть изменена после объявления.
let a = 1;
a = 2;
console.log(a);
Подстановка невозможна, так как значение изменяется в рантайме:
let a = 1;
a = 2;
console.log(a);
SWC сохраняет исходную структуру, поскольку любая попытка инлайнинга нарушила бы семантику исполнения.
Если значение переменной связано с вызовом функции, инлайнинг выполняется только при доказуемой чистоте выражения. В противном случае подстановка запрещается.
const a = Math.random();
const b = a + 1;
Подстановка Math.random() невозможна из-за
недетерминированности:
const b = Math.random() + 1;
При этом сама переменная a удаляется как промежуточная,
если не используется отдельно.
SWC может подставлять значения параметров функций, если вызов локализован и отсутствуют переопределения.
function sum(x) {
return x + 10;
}
console.log(sum(5));
После анализа:
console.log(5 + 10);
И последующего упрощения:
console.log(15);
Однако при наличии сложной логики внутри функции инлайнинг отключается:
function sum(x) {
const y = x + Date.now();
return y;
}
Инлайнинг переменных в SWC строго ограничен границами lexical scope. Переменные, участвующие в замыканиях, редко подлежат раскрытию.
function outer() {
const value = 42;
return function inner() {
return value;
};
}
Здесь инлайнинг невозможен, так как value захватывается
замыканием и может использоваться позже.
В контексте ES-модулей SWC учитывает экспортируемые сущности. Экспортируемые переменные не всегда могут быть инлайнированы, даже если они константны.
export const version = "1.0.0";
console.log(version);
Внутри модуля:
console.log("1.0.0");
Однако при наличии внешнего импорта поведение меняется:
export const version = getVersion();
Инлайнинг запрещён, так как значение может зависеть от внешней логики.
Инлайнинг часто является триггером для последующего удаления промежуточных переменных. После подстановки SWC выполняет анализ достижимости.
const a = 10;
const b = a;
const c = b;
Если c не используется:
Все переменные удаляются как недостижимые.
Инлайнинг переменных уменьшает количество символов, которые необходимо переименовывать на этапе mangling. Это снижает плотность символов в таблице идентификаторов и ускоряет дальнейшую оптимизацию.
const threshold = 100;
if (threshold > 50) {
console.log("ok");
}
После инлайнинга:
if (100 > 50) {
console.log("ok");
}
После вычисления выражения:
console.log("ok");
SWC активно комбинирует инлайнинг с логическим упрощением:
const flag = true;
if (flag) {
doSomething();
}
Результат:
doSomething();
При этом сохраняется корректность короткого замыкания в сложных выражениях:
const flag = condition && getValue();
Инлайнинг выполняется только при гарантированной безопасности вычисления.
Объектные литералы инлайнятся только частично. Простые статические поля могут быть раскрыты, но динамические свойства сохраняются.
const config = { port: 3000 };
console.log(config.port);
После трансформации:
console.log(3000);
Если объект содержит динамику:
const config = { port: getPort() };
console.log(config.port);
Инлайнинг значения невозможен.
Если переменная перекрывается в пределах scope, SWC отключает инлайнинг для предотвращения конфликтов идентификаторов.
const x = 1;
function test() {
const x = 2;
return x;
}
Каждая область сохраняет собственное значение без глобальной подстановки.
В сложных выражениях SWC может выполнять частичную подстановку, сохраняя структуру дерева операций.
const a = 2;
const b = 3;
const result = a * b + 10;
Результат:
const result = 2 * 3 + 10;
При дальнейшем упрощении:
const result = 16;
Инлайнинг переменных отключается или ограничивается при: