Процесс инициализации анимации в Lottie Web проходит несколько стадий: получение JSON-данных, их разбор, построение внутреннего дерева анимации и запуск рендеринга. Ошибка может возникнуть на любом из этих этапов, и корректная обработка требует разделения проблем по источнику.
Ключевые этапы:
Каждый этап генерирует собственный класс ошибок, которые не всегда выражаются через исключения JavaScript.
Наиболее частая проблема — неверный путь к JSON-файлу анимации. В этом случае запрос завершается неуспешным HTTP-статусом, а библиотека не получает валидные данные.
Типичные причины:
Lottie Web не всегда бросает исключение в момент запроса. Вместо этого происходит переход в состояние неуспешной загрузки, фиксируемое через события.
При загрузке JSON с другого домена возникает блокировка браузера:
Access-Control-Allow-OriginСимптоматика:
При медленном соединении возможны:
Lottie Web не управляет тайм-аутами напрямую, поэтому контроль
выполняется на уровне fetch или
XMLHttpRequest.
После получения данных выполняется JSON.parse. На этом
этапе возникают критические сбои:
Такие ошибки приводят к невозможности построения внутренней модели анимации.
Характерные проявления:
data_readydata_failedДаже корректный JSON может не соответствовать спецификации Bodymovin.
Типичные проблемы:
layersassetsТакие ошибки не всегда детектируются как исключения, но приводят к частичной или полной неработоспособности анимации.
При использовании SVG возможны сбои:
clipPath и maskCanvas-режим чувствителен к:
Редкий режим, но возможны:
Lottie Web использует событийную систему, которая позволяет отслеживать состояние загрузки.
data_ready — данные успешно загружены и распарсеныdata_failed — ошибка получения или обработки
данныхDOMLoaded — завершено построение DOM/структурыcomplete — завершение анимацииКлючевым для диагностики является событие:
data_failed — основной индикатор проблем загрузкиconst animation = lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: true,
path: '/animations/example.json'
});
animation.addEventListener('data_failed', () => {
console.error('Ошибка загрузки Lottie-анимации');
});
animation.addEventListener('DOMLoaded', () => {
console.log('Анимация успешно инициализирована');
});
Для промышленных сценариев используется слой абстракции поверх Lottie Web, который добавляет:
function loadLottieWithFallback(options, fallbackPath, retries = 2) {
let attempt = 0;
function init(path) {
const anim = lottie.loadAnimation({
...options,
path
});
anim.addEventListener('data_failed', () => {
if (attempt < retries) {
attempt++;
init(path);
} else if (path !== fallbackPath) {
init(fallbackPath);
}
});
return anim;
}
return init(options.path);
}
Сетевые сбои часто носят временный характер. Для уменьшения вероятности отказа применяются стратегии:
Пример экспоненциальной задержки:
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function fetchWithRetry(url, retries = 3) {
let lastError;
for (let i = 0; i < retries; i++) {
try {
const res = await fetch(url);
if (!res.ok) throw new Error(res.status);
return await res.json();
} catch (e) {
lastError = e;
await delay(2 ** i * 300);
}
}
throw lastError;
}
Одним из устойчивых решений является отказ от сетевой загрузки в критических интерфейсах:
import animationData from './animation.json';
lottie.loadAnimation({
container: document.getElementById('anim'),
renderer: 'svg',
loop: true,
autoplay: true,
animationData
});
Для анализа ошибок используются следующие параметры:
Рекомендуется централизованная отправка ошибок:
function logLottieError(context) {
fetch('/log', {
method: 'POST',
body: JSON.stringify(context),
headers: { 'Content-Type': 'application/json' }
});
}
Анимация инициализируется без DOM-элемента:
Результат — невозможность построения рендера без явного исключения.
При повторном вызове loadAnimation без уничтожения
предыдущего экземпляра:
JSON может быть экспортирован из версии After Effects плагина, несовместимой с текущим Lottie Web:
При наличии не критичных ошибок Lottie Web:
Это приводит к визуально «обрезанным» анимациям без явных ошибок в консоли.
Используются следующие подходы:
data_failed → DOMLoadedОсобое внимание уделяется моменту перехода между состояниями загрузки, так как именно там чаще всего фиксируются скрытые сбои.