В процессе tree-shaking Rollup анализирует код на уровне модулей и
выражений, чтобы удалить неиспользуемые части. Однако значительная часть
JavaScript-кода взаимодействует с глобальной средой: обращается к
window, document, globalThis,
вызывает функции с побочными эффектами, модифицирует прототипы и
глобальные переменные. Такие операции сложно статически доказать как
безопасные для удаления.
Параметр
treeshake.unknownGlobalSideEffects
управляет поведением Rollup в ситуациях, когда побочные эффекты
глобального уровня не могут быть однозначно определены.
При анализе кода Rollup различает несколько типов выражений:
Если выражение затрагивает глобальную область видимости и не удаётся точно определить его побочные эффекты, оно классифицируется как unknown global side effect.
treeshake.unknownGlobalSideEffects: true
treeshake.unknownGlobalSideEffects: false
Неопределённость возникает в следующих случаях:
window[someKey]();someGlobalFunction();
Если someGlobalFunction не импортирована и не определена
в модуле, Rollup не может гарантировать её чистоту. Такое выражение
попадает в категорию неизвестных глобальных побочных эффектов.
При включённом значении true оно сохраняется:
// остаётся в бандле
someGlobalFunction();
При значении false Rollup может удалить его, если анализ
покажет отсутствие влияния на экспортируемое поведение.
Tree-shaking в Rollup работает как граф зависимостей:
Глобальные побочные эффекты усложняют граф, так как добавляют «непрозрачные» узлы.
При true:
При false:
treeshake.moduleSideEffects определяет, имеет ли модуль
побочные эффекты в целом.
unknownGlobalSideEffects работает на более низком уровне
— на уровне выражений внутри модулей.
treeshake.propertyReadSideEffects влияет на чтение
свойств объектов.
В комбинации:
propertyReadSideEffects регулирует поведение доступа к
свойствам;unknownGlobalSideEffects регулирует поведение
глобальных вызовов и выражений.Совместно они определяют степень «консервативности» анализа.
В этих случаях глобальные эффекты могут быть неявными, и сохранение всех сомнительных выражений предотвращает ошибки выполнения.
В таких условиях Rollup способен агрессивнее удалять неиспользуемые части без риска.
В реальных приложениях часто встречается комбинация:
В такой среде unknownGlobalSideEffects становится
фактором стабилизации, поскольку компенсирует недостаток информации о
внешнем коде.
Даже при агрессивных настройках Rollup не может гарантировать удаление кода, если существует шанс влияния на глобальное состояние.
window.config = {};
Такое выражение всегда имеет эффект, но анализ может быть неполным,
если доступ к window происходит динамически.
Библиотека без декларации sideEffects может считаться
«безопасной», хотя фактически изменяет глобальную среду.
При обработке выражения алгоритм упрощённо действует так:
unknownGlobalSideEffects.Параметр формирует баланс между:
В сложных приложениях этот параметр становится страховочным механизмом, ограничивающим риск некорректного tree-shaking на уровне глобального контекста исполнения.