lottie-react представляет собой React-обёртку над
движком Lottie Web, предназначенную для воспроизведения
анимаций формата Lottie внутри React-приложений. Архитектура библиотеки
построена вокруг декларативного управления анимацией через props и
интеграции с жизненным циклом React-компонентов, что позволяет
отказаться от прямого взаимодействия с imperative API
lottie-web.
Lottie-экосистема базируется на формате JSON-анимаций, экспортируемых из After Effects через плагин Bodymovin, который поддерживается платформой LottieFiles. Этот JSON описывает ключевые кадры, слои, маски и эффекты в виде структурированных данных, которые затем интерпретируются рантаймом.
В классическом сценарии lottie-web требует ручного
создания контейнера, вызова loadAnimation, управления
экземпляром и очистки ресурсов. В React-экосистеме это приводит к
проблемам синхронизации с виртуальным DOM. lottie-react
решает эту задачу через компонентную абстракцию.
Ключевые принципы:
Библиотека устанавливается стандартным способом через npm или yarn:
npm install lottie-react
или
yarn add lottie-react
Внутри проекта требуется наличие JSON-анимации, например:
import animationData from "./animation.json";
Основная точка входа — компонент Lottie.
import Lottie from "lottie-react";
import animationData from "./animation.json";
export default function Example() {
return (
<Lottie animationData={animationData} />
);
}
В этом режиме библиотека:
lottie-webКомпонент поддерживает набор параметров, определяющих поведение анимации.
<Lottie
animationData={animationData}
loop={true}
autoplay={true}
/>
autoplay — автоматический запуск при монтированииloop — зацикливание анимацииВнутри lottie-web это соответствует управлению
play() и loop флагом инстанса анимации.
<Lottie
animationData={animationData}
style={{ width: 300, height: 300 }}
/>
Рендеринг Lottie зависит от размеров контейнера, так как масштабирование происходит относительно bounding box.
Для более точного контроля используется useRef,
позволяющий получить доступ к экземпляру анимации.
import { useRef } from "react";
import Lottie from "lottie-react";
export default function Controller() {
const lottieRef = useRef();
return (
<>
<Lottie
lottieRef={lottieRef}
animationData={animationData}
/>
<button onCl ick={() => lottieRef.current.play()}>
Play
</button>
<button onCl ick={() => lottieRef.current.pause()}>
Pause
</button>
</>
);
}
Экземпляр предоставляет методы:
play()pause()stop()setSpeed(value)goToAndPlay(frame)goToAndStop(frame)lottieRef.current.setSpeed(2);
Изменение скорости влияет на интерполяцию временной шкалы без изменения ключевых кадров.
Хотя lottie-react абстрагирует события, они доступны
через инстанс lottie-web.
Основные события:
complete — завершение циклаloopComplete — завершение одного цикла при loopenterFrame — изменение текущего кадраDOMLoaded — загрузка DOM структуры анимацииПри работе с большим количеством Lottie-анимаций ключевым становится контроль ресурсов.
Анимации не должны инициализироваться до появления в viewport:
{isVisible && (
<Lottie animationData={animationData} />
)}
<Lottie
animationData={animationData}
autoplay={false}
/>
Инициализация без запуска снижает нагрузку при массовом рендеринге.
Типизация в lottie-react позволяет безопасно работать с
ref и props.
import Lottie from "lottie-react";
import type { LottieRefCurrentProps } from "lottie-react";
const lottieRef = useRef<LottieRefCurrentProps>(null);
Это обеспечивает контроль над методами инстанса и предотвращает вызовы undefined при SSR или раннем доступе.
При использовании SSR важно учитывать отсутствие DOM на этапе серверного рендеринга.
Рекомендуемая стратегия:
import dynamic from "next/dynamic";
const Lottie = dynamic(() => import("lottie-react"), {
ssr: false,
});
Причина:
lottie-web требует windowLottie JSON содержит:
Структура напрямую влияет на производительность. Особенно критичны:
Компонент поддерживает смену JSON без полного размонтирования:
<Lottie animationData={currentAnimation} />
При изменении animationData происходит пересоздание
инстанса, что важно учитывать при частых переключениях.
При удалении компонента автоматически вызывается
destroy() внутри lottie-web, освобождая:
Это предотвращает утечки памяти при SPA-навигации.
При одновременном рендеринге нескольких Lottie-компонентов важно учитывать:
Практика оптимизации:
setSpeedlottie-web поддерживает разные стратегии рендеринга:
lottie-react позволяет передавать renderer через props,
проксируя конфигурацию в движок.
Несмотря на удобство интеграции, существуют ограничения:
Lottie-инстанс не является реактивным объектом. Изменение props приводит к пересозданию или обновлению, но не к частичной мутации сцены.
Это накладывает архитектурные ограничения:
Ключевой механизм — контроль timeline:
lottieRef.current.goToAndStop(120, true);
Это позволяет:
Lottie часто используется для scroll-driven анимаций:
const frame = progress * totalFrames;
lottieRef.current.goToAndStop(frame, true);
Анимации адаптируются к изменению контейнера через пересчёт масштабирования. Однако сложные сцены могут требовать принудительного обновления через пересоздание инстанса.
JSON-анимации можно кэшировать:
Это снижает время загрузки и уменьшает парсинг JSON при повторных рендерах.