Ленивая загрузка (lazy loading) — это подход к подключению и инициализации ресурсов только в тот момент, когда они действительно необходимы. В случае с библиотекой iziToast это означает, что её JavaScript и CSS не загружаются при первоначальной загрузке страницы, а подгружаются динамически при первом вызове уведомления.
Такой подход особенно важен для оптимизации производительности:
Ленивая загрузка включает три этапа:
Простейшая реализация:
function loadIziToast() {
return new Promise((resolve, reject) => {
if (window.iziToast) {
resolve();
return;
}
// Подключение CSS
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://cdn.jsdelivr.net/npm/izitoast/dist/css/iziToast.min.css';
document.head.appendChild(link);
// Подключение JS
const script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/npm/izitoast/dist/js/iziToast.min.js';
script.onl oad = () => resolve();
script.oner ror = () => reject(new Error('Ошибка загрузки iziToast'));
document.body.appendChild(script);
});
}
Чтобы скрыть логику загрузки и упростить использование, создаётся универсальная функция:
async function showToast(options) {
await loadIziToast();
iziToast.show(options);
}
Пример использования:
showToast({
title: 'Готово',
message: 'Данные успешно сохранены',
color: 'green'
});
Без дополнительной оптимизации при каждом вызове будет происходить проверка и возможная повторная инициализация. Для предотвращения этого используется кэширование состояния загрузки:
let iziToastPromise = null;
function loadIziToast() {
if (window.iziToast) {
return Promise.resolve();
}
if (iziToastPromise) {
return iziToastPromise;
}
iziToastPromise = new Promise((resolve, reject) => {
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://cdn.jsdelivr.net/npm/izitoast/dist/css/iziToast.min.css';
document.head.appendChild(link);
const script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/npm/izitoast/dist/js/iziToast.min.js';
script.onl oad = () => resolve();
script.oner ror = reject;
document.body.appendChild(script);
});
return iziToastPromise;
}
Это гарантирует:
Для удобства и читаемости кода создаются специализированные функции:
async function toastSuccess(message) {
await loadIziToast();
iziToast.success({
title: 'OK',
message
});
}
async function toastError(message) {
await loadIziToast();
iziToast.error({
title: 'Ошибка',
message
});
}
При использовании сборщиков (Webpack, Vite) предпочтительно использовать динамический import:
async function loadIziToast() {
if (window.iziToast) return;
const iziToast = await import('izitoast');
await import('izitoast/dist/css/iziToast.min.css');
window.iziToast = iziToast.default;
}
Преимущества:
Часто уведомления используются только после взаимодействия пользователя. В этом случае загрузка может быть инициирована заранее:
document.addEventListener('click', () => {
loadIziToast();
}, { once: true });
Это позволяет:
Важно учитывать возможные сбои:
async function safeToast(options) {
try {
await loadIziToast();
iziToast.show(options);
} catch (e) {
console.error('Не удалось загрузить iziToast', e);
}
}
Иногда используется компромисс между полной ленивой загрузкой и мгновенным показом:
<link rel="preload" href="https://cdn.jsdelivr.net/npm/izitoast/dist/js/iziToast.min.js" as="script">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/izitoast/dist/css/iziToast.min.css" as="style">
Это ускоряет последующую загрузку без немедленного выполнения.
CSS можно подключать отдельно и заранее:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/izitoast/dist/css/iziToast.min.css">
А JavaScript загружать лениво. Это устраняет “мигание” стилей при первом показе уведомления.
В SPA ленивую загрузку удобно реализовать через сервис уведомлений:
class ToastService {
static async init() {
if (!this.ready) {
await loadIziToast();
this.ready = true;
}
}
static async show(options) {
await this.init();
iziToast.show(options);
}
}
Использование:
ToastService.show({
message: 'Маршрут изменён'
});
При ленивой загрузке важно учитывать:
Подход оправдан в случаях:
Менее эффективен:
Оптимальная структура:
loader.js — отвечает за загрузку iziToasttoastService.js — API для показа уведомленийТакой подход обеспечивает: