Probabilmente ti trovi in una di queste due situazioni. O hai un designer che ti passa un JSON Lottie e ti chiede: “Riesci a integrarlo nell’app oggi?”, o l’hai già configurato e hai notato che l’animazione funziona in sviluppo, ma diventa pesante una volta che entrano in gioco dispositivi reali, tempi di avvio e build di release.
È qui che Lottie React Native diventa interessante. La demo base è facile. Un’implementazione pronta per la produzione no. La differenza dipende solitamente da come lo installi, come controlli il playback e se consideri i file di animazione come asset innocui o come parte del tuo budget di performance.
Indice dei contenuti
- Perché Lottie è essenziale per le app React Native
- Configurare l'ambiente di sviluppo Lottie
- Visualizza la tua prima animazione Lottie
- Padroneggiare i controlli delle animazioni Lottie
- Ottimizzazione delle performance per app in produzione
- Risoluzione dei problemi comuni di Lottie
Perché Lottie è essenziale per le app React Native
Se hai mai provato a ricreare a mano un'animazione rifinita in React Native, conosci già il dolore. Piccoli dettagli di movimento si trasformano in un mucchio di logica di timing, interpolazioni e stranezze delle piattaforme. L'animazione può sembrare simile, ma «simile» di solito non è quello che il designer ha consegnato.
Lottie ha cambiato questo workflow. Airbnb ha rilasciato Lottie come open source nel 2016, e quel rilascio ha rivoluzionato le animazioni mobile permettendo ai designer di distribuire le animazioni direttamente, invece di costringere gli ingegneri a ricostruirle frame dopo frame. In alcuni contesti enterprise, questo cambiamento ha ridotto i costi di sviluppo delle app mobile del 40%, secondo i dati di Panoramica di Lottie di Airbnb.
Design e ingegneria smettono di combattere la stessa battaglia
Un vantaggio chiave di Lottie React Native non è solo “animazioni belle in JSON”. È la separazione delle responsabilità. I designer lavorano in After Effects ed esportano con Bodymovin. Gli sviluppatori renderizzano l'output con riproduzione supportata da nativo, invece di tradurre il movimento in code personalizzati.
Questo conta perché il lavoro sulle animazioni tende a diffondersi. Una singola animazione di stato celebrativo può coinvolgere la revisione del design, la revisione del prodotto, il comportamento su Android, il comportamento su iOS, l'accessibilità e le prestazioni di avvio. Lottie riduce quella superficie.
Regola pratica: Usa Lottie quando l'animazione fa parte dell'esperienza del prodotto, non quando ti serve solo una semplice transizione di opacità o translate.
C'è anche un aspetto di user experience. Il movimento dà feedback, conferma le azioni e rende gli stati di caricamento meno statici. Se il tuo team sta pensando seriamente a polish, retention o fiducia nell'interfaccia, l'animazione fa parte di quel discorso. Il dibattito più ampio sulla user experience delle app porta di solito alla stessa conclusione: il feedback rapido batte gli schermi statici.
Dove Lottie dà il meglio
Lottie React Native è ideale per:
- Micro-interazioni di brand come like, salvataggi, checkmark e stati di successo dell'acquisto
- Illustrazioni di onboarding che devono sembrare custom senza includere video
- Stati di caricamento ed empty state dove una UI statica sembra incompleta
- Spiegazione delle feature quando il prodotto vuole motion senza incorporare GIF o MP4
Non risolve ogni problema di animazione. Per le transizioni di schermata semplici, gli strumenti di animazione di React Native sono spesso più semplici. Per sistemi di motion molto grandi o altamente interattivi, il formato JSON può diventare un trade-off invece di un vantaggio. Questo trade-off diventa più importante in produzione, dove la maggior parte dei tutorial si ferma troppo presto.
Configurare l'ambiente di sviluppo Lottie
Il percorso di installazione dipende prima di tutto da una scelta: Workflow gestito Expo o React Native bare. Non mescolare i modelli mentali. La maggior parte dei problemi di configurazione nasce quando gli sviluppatori seguono una guida per workflow bare all'interno di Expo, o assumono che Expo astragga ogni dettaglio nativo.

Scegli il workflow prima di installare
Se la tua app è su Expo e vuoi la configurazione più rapida, resta sul percorso Expo a meno che tu non sappia di aver bisogno di lavoro nativo personalizzato. Se sei in un'app bare, o già dipendi da moduli nativi che richiedono controllo diretto, installala come dipendenza nativa normale e valida immediatamente le build per iOS e Android.
Molti team sottovalutano quanto il debugging diventi più semplice quando mantieni la configurazione allineata al tipo di progetto. È anche per questo che molti team che costruiscono integrazioni native personalizzate confrontano Capgo come alternativa a Expo EAS in anticipo, invece di aspettare che l'app diventi più difficile da modificare.
Setup gestito con Expo
Per le app gestite da Expo, mantienilo al minimo.
-
Installa il pacchetto
npx expo install lottie-react-native -
Riavvia Metro
npx expo start -c -
Verifica su dispositivo o simulatore Inizia con un file JSON locale e renderizza prima un'animazione molto piccola. Non debuggare un asset pesante e una nuova installazione contemporaneamente.
Alcune note pratiche su Expo:
- Preferisci prima i file locali: Il debug di animazioni remote aggiunge rumore di rete quando devi solo verificare che la libreria funzioni.
- Testa subito il comportamento in release: La modalità development può nascondere problemi di timing e performance.
- Controlla i percorsi degli asset: I file JSON posizionati male sono una delle cause più comuni del “non renderizza nulla”.
Expo è la via più rapida per “funziona”. Non significa che sia la via più rapida per “scalare”.
Configurazione Bare React Native
In un bare project, installa e valida subito le dipendenze native.
-
Installa il pacchetto
npm install lottie-react-native -
Installa i pod di iOS
cd ios && pod install && cd .. -
Ricompila l'app
npx react-native run-iosoppure
npx react-native run-android
Ecco la parte che molte guide quick-start saltano: dopo l'installazione, fai un rebuild nativo completo prima di concludere che qualcosa è rotto. L'hot reload non salva una dipendenza nativa che non è stata compilata correttamente nell'app.
Workflow bare che fanno risparmiare tempo
Usa questa breve checklist prima di procedere:
| Verifica | Perché è importante |
|---|---|
| Rebuild dopo l'installazione | I moduli nativi richiedono una nuova compilazione |
Esegui pod install |
Senza di questo, iOS non sarà affidabile |
| Inizia con un semplice JSON locale | Isola i problemi di installazione da quelli degli asset |
| Testa entrambe le piattaforme fin da subito | Android e iOS possono fallire per motivi diversi |
Se il pacchetto si installa correttamente ma la prima animazione non appare, di solito non è un problema di installazione. Spesso si tratta del percorso dell'asset, delle dimensioni del componente o della configurazione del playback.
Visualizza la tua prima animazione Lottie
La prima animazione funzionante deve essere noiosa. File locale. Dimensione fissa. Autoplay attivo. Loop opzionale. Non partire con playback condizionale, JSON remoti o export di animazioni con troppi layer.

Aggiungi un file di animazione locale
Crea una cartella per gli asset se non ne hai già una:
assets/
animations/
success.json
Usa nomi semplici. Evita spazi, punteggiatura strana e cartelle con troppi livelli di annidamento. Vuoi require() percorsi che restano chiari.
Se usi Lottie per una schermata di caricamento iniziale brandizzata o per un handoff dopo il lancio, pensaci bene prima di inserire un'animazione pesante nel percorso di startup. Vale soprattutto se stai anche ottimizzando il tuo Comportamento della splash screen in React Native.
Renderizzala con LottieView
Crea un componente dedicato invece di inserirlo direttamente in un file di una schermata grande:
import React from 'react';
import { View, StyleSheet } from 'react-native';
import LottieView from 'lottie-react-native';
export function SuccessAnimation() {
return (
<View style={styles.container}>
<LottieView
source={require('../assets/animations/success.json')}
autoPlay
loop={false}
style={styles.animation}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
alignItems: 'center',
justifyContent: 'center',
},
animation: {
width: 220,
height: 220,
},
});
Questo fa tre cose utili:
- dimostra che la libreria renderizza correttamente
- dimostra che il percorso dell'asset si risolve correttamente
- ti dà un unico punto isolato per regolare playback e dimensioni in seguito
Alcune insidie emergono subito se trascuri le basi:
- Nessuna width o height: L'animazione può esistere ma risultare invisibile.
- Non valido
require()path: Metro non troverà il file. - Export non valido: Alcuni file JSON sono tecnicamente validi, ma contengono funzionalità che non si comportano come previsto su mobile.
Mantieni il primo render locale e deterministico. Stai testando l'integrazione, non l'architettura.
Un test migliore per la prima schermata
Inserisci il componente in una schermata semplice con uno sfondo neutro:
import React from 'react';
import { SafeAreaView, StyleSheet } from 'react-native';
import { SuccessAnimation } from './src/SuccessAnimation';
export default function App() {
return (
<SafeAreaView style={styles.screen}>
<SuccessAnimation />
</SafeAreaView>
);
}
const styles = StyleSheet.create({
screen: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#fff',
},
});
Se funziona sia sui simulatori iOS che Android, hai superato il primo vero ostacolo. Da qui, il passo successivo non è aggiungere altre animazioni. È imparare quando usare le props dichiarative e quando prendere il controllo diretto con i ref.
Padroneggiare i controlli delle animazioni Lottie
La maggior parte dei bug di Lottie React Native emerge quando l'animazione deve reagire allo stato. L'autoplay è facile. "Riproduci questo segmento quando l'utente mette like a un elemento, inverti la riproduzione quando toglie il like e non creare scatti quando il componente esegue il re-render": è qui che le cose si complicano.

Usa le props quando la riproduzione è semplice
Per la riproduzione non interattiva, le props bastano.
<LottieView
source={require('../assets/animations/loading.json')}
autoPlay
loop
speed={1}
/>
Questo stile è adatto a:
- indicatori di caricamento
- illustrazioni passive per l'onboarding
- stati vuoti decorativi
È dichiarativo e leggibile. Il componente si monta, la riproduzione parte e React mantiene il controllo. Se la logica dell'animazione può essere descritta interamente tramite le props, tienila lì.
Un caso dichiarativo più avanzato è progress, dove si lega il frame dell'animazione a un altro valore. Funziona bene quando il movimento deve riflettere una fonte di progresso esterna, ma è meno comodo per eventi di trigger una tantum.
Ecco un rapido confronto visivo prima di passare ai ref:
Usa i ref quando lo stato guida l'animazione
Quando l'utente tocca, alterna o completa un'azione, un ref è generalmente lo strumento più sicuro. I dati reali mostrano che Il 68% degli sviluppatori che usano framework ibridi segnala trigger di animazione falliti a causa di una gestione errata dei ref negli useEffect hook, motivo per cui i pattern affidabili basati su animation.current.play() sono fondamentali, come evidenziato in questa discussione focalizzata su Capacitor e sui trigger falliti.
Il problema non riguarda solo le app ibride. Si presenta anche in React Native puro, specialmente quando i dev ricreano i ref, avviano il playback prima del mount o legano le chiamate delle animazioni a effect instabili.
import React, { useRef, useState } from 'react';
import { Pressable } from 'react-native';
import LottieView from 'lottie-react-native';
export function LikeButton() {
const animationRef = useRef<LottieView>(null);
const [liked, setLiked] = useState(false);
const onPress = () => {
if (!animationRef.current) return;
if (liked) {
animationRef.current.play(60, 0);
} else {
animationRef.current.play(0, 60);
}
setLiked(!liked);
};
return (
<Pressable onPress={onPress}>
<LottieView
ref={animationRef}
source={require('../assets/animations/like.json')}
loop={false}
autoPlay={false}
style={{ width: 96, height: 96 }}
/>
</Pressable>
);
}
Un pattern affidabile per like e unlike
Questo pattern regge meglio in produzione rispetto a chiamare play() dentro useEffect a ogni cambio di stato.
Perché funziona:
- L'evento gestisce il trigger dell'animazione: Un evento di pressione è un momento stabile per avviare la riproduzione.
- Il ref resta locale e persistente:
useRefevita rerender non necessari. - Il componente evita conflitti di autoplay: Non vuoi che il comportamento di mount interferisca con quello attivato dall'utente.
Errori comuni da evitare:
-
Attivare prima che il ref esista
SeanimationRef.currentè null, la riproduzione non avverrà. Proteggilo. -
Usare
autoPlaycon controlli imperativi
Scegli un owner predefinito per la riproduzione. -
Gestire tutto tramite
useEffect
Gli Effects sono utili, ma per le azioni UI spesso introducono problemi di timing invece di eliminarli.
Se un'animazione risponde a un tap, innescala prima all'interno del tap handler. Usa
useEffectsolo quando la source of truth si trova al di fuori di quell'interazione.
Ottimizzazione delle performance per app in produzione
Lottie React Native è una di quelle librerie che sembra leggera finché i team non iniziano a inserire grandi file JSON nell'app bundle e si chiedono perché lo startup sia peggiorato. L'animazione in sé non è sempre il problema. È la strategia di delivery.

Dove i team incontrano problemi
L'errore più comune è includere ogni animazione direttamente nel JavaScript e caricarle tutte troppo presto. Secondo questa guida sulla gestione errata dei file Lottie JSON, sovraccaricare i bundle JS con asset come i JSON di Lottie può aumentare i tempi di avvio dell'app di 40% o più su dispositivi di fascia media, e spostarli in asset nativi per il caricamento on-demand è un'ottimizzazione cruciale.
Questo è in linea con ciò che molti team osservano nella pratica. Il problema non è una singola piccola animazione di successo. È l'accumulo:
- motion di onboarding
- stati di loader
- reazioni e-commerce
- schermate vuote brandizzate
- file di locale e altri asset pesanti nel bundle accanto a questi
Se la tua app ha già un problema di budget di avvio, i file Lottie possono peggiorarlo rapidamente.
Cosa ottimizzare per primo
Inizia dall'export. Un export di animazione disordinato porta complessità che pagherai in parsing, memoria e stabilità del render. Non accettare ogni export del designer così com'è.
Usa questa checklist di produzione:
- Comprimi il JSON prima di rilasciare: File più piccoli sono più facili da caricare e meno propensi a gonfiare l'avvio.
- Sposta le animazioni non critiche fuori dal bundle JS: Mantieni l'avvio code focalizzato su ciò che l'app serve immediatamente.
- Carica le animazioni on demand: Renderizza quando la schermata o l'azione lo richiede.
- Analizza il comportamento su dispositivi vecchi: Un simulatore moderno può nascondere un playback costoso.
- Evita di usare file Lottie grandi come decorazione all'avvio: Se non è critico per la prima interazione, non dovrebbe competere con l'avvio dell'app.
Per i team che lavorano seriamente sulle prestazioni mobili, la guida di AppLighter alle prestazioni mobili è una lettura utile perché colloca le decisioni sulle animazioni nel contesto più ampio di avvio dell'app, rendering e compromessi del framework.
Una verità scomoda: Un'animazione bella che ritarda la prima interazione è di solito un bug di prodotto, non un successo di design.
Dovresti anche guardare oltre React Native in isolamento. I team che lavorano con stack ibridi si scontrano con problemi simili di caricamento asset, e il contesto più ampio prestazioni delle animazioni per le app Capacitor si applicano bene anche alle decisioni su Lottie.
File locali vs distribuzione remota
I file locali sono prevedibili. Funzionano offline, eliminano la variabilità di rete e sono più facili da testare. Sono però facili da sovraccaricare nel bundle.
La distribuzione remota mantiene il binario più snello, ma ora la tua animazione deve tenere conto di disponibilità, caching e fallback. Questo compromesso è accettabile per motion non critici. È rischioso per stati UX principali come conferma d'acquisto o autenticazione riuscita.
Una separazione pratica funziona bene:
| Tipo di asset | Default migliore |
|---|---|
| Animazione di interazione principale | Locale, ottimizzata, non troppo grande |
| Motion promozionale occasionale | Remoto con fallback |
| Animazione nel percorso di avvio | Solo locale se strettamente necessario |
| Illustrazione di funzionalità usata raramente | Caricamento on-demand |
Se applichi solo una regola da questa sezione, usa questa: tratta i JSON Lottie come asset critici per le prestazioni, non come decorazioni innocue.
Risoluzione dei problemi comuni di Lottie
Quando Lottie si rompe, la causa è di solito banale. Percorso sbagliato. Dimensioni mancanti. Timing del ref errato. JSON troppo pesante. Il modo più veloce per fare debug è ridurre le variabili.
L'animazione non viene renderizzata su Android
Prima conferma che il file JSON si risolva. Poi assegna al componente dimensioni esplicite.
<LottieView
source={require('../assets/animations/success.json')}
autoPlay
style={{ width: 200, height: 200 }}
/>
Se continua a fallire, sostituiscilo con un'altra animazione nota e funzionante. Questo ti dirà se il problema è nel file o nella configurazione.
Il playback è scattoso sui dispositivi più vecchi
Di solito indica un problema nell'asset, non nel componente API.
Prova queste correzioni:
- Riduci la complessità dell'animazione: Chiedi un export più leggero se il file sorgente è pesante.
- Carica più tardi: Non competere con il lavoro della schermata iniziale.
- Testa una versione compressa: Se il file compresso si comporta meglio, hai trovato il collo di bottiglia.
- Rimuovi più viste Lottie simultanee: Diverse animazioni su una sola schermata possono essere troppe.
Il ref è null o play non fa nulla
I ref null di solito indicano che il trigger scatta prima del mount, oppure che il componente è stato rimosso in modo condizionale.
if (animationRef.current) {
animationRef.current.play();
}
Mantieni il ref stabile con useRef, e non ricreare inutilmente il componente animato. Se stai debuggando stranezze ricorrenti nelle build locali, svuotare le cache obsolete può aiutare. Una semplice routine di pulizia della cache Yarn a volte basta a eliminare comportamenti fuorvianti degli asset durante lo sviluppo.
L'animazione appare sbagliata su schermi di dimensioni diverse
Non lasciare che l'animazione definisca il layout. Mettila in un contenitore e impostane le dimensioni di proposito.
- Usa dimensioni fisse per icone e reazioni
- Usa wrapper aspect-aware per illustrazioni più grandi
- Evita di allargare a tutta la larghezza senza verificare la composizione prevista dell'export
La maggior parte dei report “Lottie è rotto” si rivela essere un problema di layout, asset o timing. La libreria fa esattamente quello che le hai chiesto.
Se ti serve un'ultima scorciatoia per il debugging, rimuovi tutte le prop avanzate, renderizza un'animazione locale in una view centrata e ricostruisci da lì. Questo approccio isola i problemi più velocemente che fissare uno schermo di produzione affollato.
Capgo aiuta i team a pubblicare fix di JavaScript, asset e config nelle app Capacitor senza aspettare la revisione dello store. Se mantieni un'app ibrida e ti serve un modo più sicuro per inviare aggiornamenti, gestire rollout graduali e recuperare rapidamente da problemi front-end, Capgo vale la pena dare un'occhiata.