Библиотека iziToast создаёт DOM-элементы для каждого уведомления, добавляя их в контейнер на странице. При интенсивном использовании (частые уведомления, длительное время жизни страницы) важно контролировать жизненный цикл этих элементов, чтобы избежать утечек памяти и деградации производительности.
Каждое уведомление представляет собой объект с привязанными обработчиками событий, таймерами и ссылками на DOM. Если уведомление не удаляется корректно, связанные ресурсы остаются в памяти.
Основные этапы:
Ключевой момент управления памятью — корректное завершение последнего этапа.
По умолчанию используется параметр timeout, который
определяет время жизни уведомления:
iziToast.show({
title: 'Уведомление',
message: 'Автоматическое закрытие',
timeout: 3000
});
После истечения времени:
Рекомендация: избегать бесконечных уведомлений
(timeout: false) без явного механизма удаления.
Для контроля памяти при длительных сессиях необходимо явно удалять уведомления:
iziToast.hide({}, document.querySelector('.iziToast'));
Или закрывать все:
iziToast.destroy();
Особенности:
hide() удаляет конкретный элементdestroy() очищает контейнер и все связанные
объектыИспользование destroy() особенно важно при:
Каждое уведомление может содержать события:
iziToast.show({
title: 'Событие',
message: 'Клик',
onClosing: function(instance, toast, closedBy){
console.log('Закрывается');
}
});
При неправильном использовании:
Практика:
iziToast использует setTimeout для автозакрытия. При
ручном удалении важно учитывать:
iziToast.hide({
transitionOut: 'fadeOut'
}, toastElement);
Библиотека автоматически очищает таймеры, однако:
необходимо убедиться, что таймеры не остаются активными.
Контейнер уведомлений создаётся один раз и переиспользуется. Однако:
возможно дублирование контейнеров.
Контроль:
if (document.querySelector('.iziToast-wrapper')) {
iziToast.destroy();
}
Это предотвращает накопление неиспользуемых DOM-узлов.
Большое количество одновременно активных уведомлений увеличивает нагрузку:
iziToast.settings({
maxWidth: 350,
timeout: 2000
});
Для контроля можно реализовать собственный лимит:
const MAX_TOASTS = 5;
if (document.querySelectorAll('.iziToast').length >= MAX_TOASTS) {
iziToast.hide({}, document.querySelector('.iziToast'));
}
Преимущества:
При большом количестве уведомлений предпочтительно:
Однако iziToast по умолчанию создаёт обработчики на уровне каждого уведомления, поэтому:
Наиболее распространённые причины:
Подход:
window.addEventListener('beforeunload', () => {
iziToast.destroy();
});
В SPA аналогично:
router.beforeEach((to, from, next) => {
iziToast.destroy();
next();
});
Пример потенциальной утечки:
let largeData = new Array(1000000);
iziToast.show({
message: 'Данные',
onClosing: function() {
console.log(largeData);
}
});
Проблема:
largeData остаётся в памяти до удаления
уведомленияРешение:
Если уведомление удаляется не через API:
toastElement.remove();
возникают проблемы:
Правильный способ:
Инструменты браузера:
Признаки проблем:
.iziToastПри частом создании уведомлений:
timeoutiziToast.show({
animateInside: false,
transitionIn: 'fadeIn',
transitionOut: 'fadeOut'
});
Вместо передачи больших объектов:
iziToast.show({
message: JSON.stringify(largeObject)
});
предпочтительно:
При генерации уведомлений из событий (например, WebSocket):
let lastToastTime = 0;
function safeToast() {
const now = Date.now();
if (now - lastToastTime > 1000) {
iziToast.show({ message: 'Событие' });
lastToastTime = now;
}
}
iziToast хранит внутреннее состояние (экземпляры, контейнеры). При неправильной работе:
Регулярная очистка:
iziToast.destroy();
и повторная инициализация помогают избежать накопления ошибок.
Основные принципы:
Это особенно важно в интерфейсах с:
timeoutdestroy() при смене контекстаСистематическое соблюдение этих правил обеспечивает стабильную работу интерфейса без накопления памяти и деградации производительности.