Утечки памяти возникают, когда объекты, больше не используемые приложением, остаются в памяти из-за удержания ссылок на них. В контексте GSAP это чаще всего связано с анимациями, таймлайнами и callback-функциями, которые продолжают удерживать DOM-элементы в памяти. Даже если элемент удалён из DOM, GSAP может продолжать хранить ссылки на него через активные анимации или зарегистрированные события.
Типичные источники утечек в GSAP:
TimelineLite или TimelineMax, продолжают
существовать после удаления элементов.onComplete, onUpdate,
onStart) с замыканиями, удерживающими ссылки на
DOM-элементы.1. Очистка анимаций после завершения GSAP
предоставляет метод kill() для остановки анимаций и
удаления всех ссылок на объект:
let tween = gsap.to(".box", { x: 300, duration: 2 });
// После завершения анимации
tween.kill();
Для таймлайнов применяется аналогичный подход:
let tl = gsap.timeline();
tl.to(".box", { x: 100, duration: 1 })
.to(".box", { y: 50, duration: 1 });
// Уничтожение таймлайна и всех связанных анимаций
tl.kill();
Метод kill() не только останавливает анимацию, но и
освобождает память, удаляя внутренние ссылки GSAP на элементы.
2. Использование clearProps для удаления
стилей Если элементы удаляются из DOM, остаточные inline-стили,
установленные GSAP, могут препятствовать сборке мусора.
clearProps позволяет очистить все свойства:
gsap.to(".box", { x: 100, clearProps: "all", duration: 1 });
3. Избегание глобальных селекторов и замыканий Ссылки на элементы лучше хранить локально, чтобы после завершения работы функции сборщик мусора мог их удалять. Например:
function animateBox() {
const box = document.querySelector(".box");
gsap.to(box, { x: 200, duration: 2 });
}
// После выхода из функции box становится доступен для сборки мусора
4. Отмена анимаций при удалении элементов из DOM Если DOM-элемент динамически удаляется, все анимации и таймлайны, связанные с ним, необходимо завершать:
function removeBox() {
const box = document.querySelector(".box");
gsap.killTweensOf(box); // убивает все анимации для конкретного элемента
box.remove(); // удаляет элемент из DOM
}
Метод killTweensOf особенно полезен для массовых
анимаций на одинаковых классах.
5. Использование invalidate() для повторного
использования таймлайнов Если требуется многократная анимация
одного таймлайна с разными элементами, лучше использовать
invalidate() вместо создания нового таймлайна:
const tl = gsap.timeline({ paused: true });
tl.to(".box", { x: 100, duration: 1 });
// Перед повторным использованием
tl.invalidate();
tl.play();
invalidate() сбрасывает все внутренние данные, избегая
накопления ссылок на старые элементы.
6. Контроль событий и слушателей GSAP позволяет
добавлять события onComplete, onUpdate,
onStart. Все функции, содержащие замыкания на DOM, должны
быть удалены при завершении анимации:
const tween = gsap.to(".box", {
x: 300,
duration: 2,
onComplete: () => {
console.log("Анимация завершена");
}
});
// Остановка и очистка
tween.kill();
Для сложных таймлайнов с множеством колбэков рекомендуется группировать их в одну функцию или использовать отдельные обработчики, чтобы легче было очищать ссылки.
7. Мониторинг памяти и отладка В современных браузерах есть инструменты для анализа памяти (Chrome DevTools → Memory). Основные методы:
При обнаружении объектов, которые не удаляются после завершения анимации, необходимо убедиться, что все таймлайны и колбэки были очищены.
8. Использование GSAP глобальных методов GSAP предоставляет несколько полезных методов для работы с памятью:
gsap.killTweensOf(target) — убивает все анимации
целевого элемента.gsap.globalTimeline.clear() — очищает глобальный
таймлайн, если он используется для управления всеми анимациями.tween.kill() — завершает конкретную анимацию и
освобождает её ресурсы.Эффективное управление памятью в GSAP критично для масштабных
веб-приложений с большим количеством анимаций и динамически создаваемых
элементов. Правильное применение kill(),
invalidate(), clearProps и контроль замыканий
позволяет предотвращать утечки памяти и поддерживать стабильную
производительность.