Опция ignoreAnnotations управляет тем, как инструмент
обработки кода учитывает специальные аннотации в комментариях и
синтаксические маркеры, используемые для оптимизаций. Речь идёт о
механизмах, которые позволяют компиляторам и минификаторам делать выводы
о побочных эффектах функций, выражений и модулей.
В JavaScript-коде часто применяются аннотации вида
/* @__PURE__ */, /*#__PURE__*/, а также
различные пользовательские маркеры, которые помогают системе сборки
выполнять удаление мёртвого кода (tree-shaking) и безопасное упрощение
выражений. Поведение ignoreAnnotations определяет, будут ли
эти подсказки учитываться при оптимизации.
При включённом или изменённом режиме игнорирования аннотаций инструмент перестаёт доверять подобным комментариям и рассматривает код более консервативно.
Аннотации в JavaScript-сборке выполняют роль метаданных для статического анализа. Наиболее распространённые сценарии:
Пример:
const value = /*#__PURE__*/ createExpensiveObject();
В нормальных условиях минификатор может считать, что вызов
createExpensiveObject() можно удалить, если результат не
используется. Аннотация усиливает уверенность в том, что побочных
эффектов нет.
При изменении поведения через ignoreAnnotations такие
сигналы могут игнорироваться, и анализ становится более осторожным.
Опция тесно связана с этапами минификации и tree-shaking.
При включении поведения игнорирования:
PURE перестают влиять на удаление
вызововЭто особенно важно для кодовых баз, где аннотации могут быть добавлены автоматически или некорректно.
Без игнорирования аннотаций:
PURE и аналогичным маркерамTree-shaking опирается на анализ побочных эффектов. Аннотации служат дополнительным источником информации, который может радикально менять результат оптимизации.
При активном учёте аннотаций:
import { helper } from "lib";
helper(); // может быть удалено
Если анализ считает helper чистым и результат не
используется, вызов может исчезнуть.
При игнорировании аннотаций:
helper(); // сохраняется
Вызов остаётся, так как система не полагается на внешние подсказки и предпочитает безопасную стратегию.
В API сборщика опция задаётся на уровне minify или
tree-shaking конфигурации в зависимости от используемого
режима.
Пример базовой конфигурации:
import { build } from "esbuild";
build({
entryPoints: ["src/index.js"],
bundle: true,
minify: true,
ignoreAnnotations: true,
outfile: "dist/app.js"
});
В данном случае анализ кода не будет учитывать
PURE-комментарии при принятии решений об удалении
выражений.
Опция не работает изолированно, а влияет на цепочку оптимизаций:
ignoreAnnotations вмешивается на этапе анализа побочных
эффектов, изменяя исходные предположения о чистоте выражений.
Это приводит к каскадному эффекту:
Наиболее значимые маркеры:
/* @__PURE__ *//*#__PURE__*/Пример использования:
const result = /*#__PURE__*/ compute();
При доверии аннотациям:
compute() может быть удалён при отсутствии
использования результатаПри игнорировании:
В крупных проектах с множеством разработчиков аннотации могут добавляться автоматически Babel-плагинами или сторонними инструментами. В таких случаях возможны ошибки в разметке чистоты функций.
Игнорирование аннотаций предотвращает:
Библиотеки могут содержать аннотации, рассчитанные на другие сборщики (например, Terser или Webpack). Поведение может отличаться.
Игнорирование аннотаций делает поведение более универсальным:
При диагностике некорректного tree-shaking отключение влияния аннотаций позволяет:
Аннотации по сути являются эвристиками. Любая эвристика может быть неверной. Поэтому режим игнорирования выступает как механизм повышения предсказуемости.
Основной компромисс:
ignoreAnnotations часто рассматривается вместе с:
minifytreeShakingdropLabelskeepNamesКомбинации влияют на итоговый результат следующим образом:
keepNames) анализ побочных
эффектов остаётся ключевым фактором оптимизацииИгнорирование аннотаций немного упрощает анализ:
Разница особенно заметна в больших проектах с множеством модулей и сложной графовой структурой зависимостей.
const fn = getFn();
fn();
Аннотации не играют роли, так как анализ становится динамически неопределённым. Однако при игнорировании аннотаций система ещё менее склонна к удалению таких вызовов.
const obj = /*#__PURE__*/ create();
При учёте аннотаций возможна оптимизация. При игнорировании — сохранение вызова гарантировано.
import "./polyfill.js";
Аннотации не влияют напрямую, но общий режим анализа побочных эффектов может косвенно изменить стратегию обработки импортов.
ignoreAnnotations формирует стратегию доверия к
метаданным: