Table of Contents
Perché Dimensioni applicazioni Matters per React applicazioni native
Gli studi dimostrano che un aumento di 10 MB nella dimensione APK può ridurre la conversione del download dell'1% o più. Su Android, il Play Store visualizza le dimensioni delle app in modo prominente, e su iOS, gli utenti devono spesso aspettare per grandi download su reti cellulari.
Comprendere gli artefatti della ricostruzione nativa
Prima di applicare strategie di ottimizzazione, è essenziale capire che cosa costituisce la dimensione finale dell'app.
- Pacchetto JavaScript[[] — l'intera logica dell'applicazione, comprese le librerie di terze parti e React stesso, compilato in un unico file JS da Metro.
- Codice binario di base[[ — compilato C++/Objective-C/Java/Kotlin codice per ogni architettura (armeabi-v7a, arm64-v8a, x86 64 su Android; arm64, x86 64 su iOS).
- Asset risorse[[] — immagini, font, audio, video e file JSON memorizzati in res/drawable (Android) o le risorse del bundle (iOS).
- Libri di supporto[] — Reagisci in modo autonomo, più qualsiasi modulo nativo (ad esempio, reagisci-native-camera, reagisci-native-maps) che aggiunge codice e risorse compilate.
- Metadata[] — file manifesti, icone, schermi di lancio, storyboard e voci Info.plist.
Su Android, il bundle JavaScript è incorporato all'interno dell'APK/AAB. Su iOS, il bundle JS vive all'interno del fascio dell'app insieme agli eseguibili nativi. Sapendo da dove il peso viene da permette di targetare le ottimizzazioni con precisione.
Ottimizzare i beni — Oltre la compressione di base
L'ottimizzazione dei beni è il frutto più basso, ma molte squadre si fermano a una semplice compressione.
Utilizzare formati di immagine moderni
WebP su Android e HEIC su iOS offrono 25-35% dimensioni di file più piccole rispetto a JPEG o PNG a qualità equivalente. Per Android, il sistema di build React Native converte automaticamente PNG in WebP se li posizionate nella cartella e abilitare in ]].
Ridimensionare e Comprimere al Tempo di costruzione
Utilizzare strumenti come ] o uno script di build che riduce le immagini alla dimensione massima del display richiesta. Ad esempio, un'icona visualizzata a 48px non dovrebbe essere larga 1920px. Combinare il ridimensionamento con compressione senza perdita o perdita utilizzando , ], o servizi online. Integrare la compressione nella vostra pipeline di bilancio in modo che ogni richiesta esegui.
Eliminare i beni non utilizzati
Nel corso del tempo, i progetti accumulano immagini, screenshot e animazioni legacy. Eseguire uno strumento di analisi statica come [ (o uno script personalizzato) per contrassegnare le attività non menzionate in alcun , , o dichiarazioni.
Subset Fonts
Se la tua app supporta solo caratteri latini (o un sottoinsieme), usa uno strumento di sotto-setting font come [] o per rimuovere caratteri non utilizzati. Questo può ridurre un file di carattere da 200 KB a 20 KB. Per applicazioni internazionalizzate, considerare il caricamento dinamico del carattere — prendere solo il sottoinsieme locale-specifico a tempo di esecuzione.
Codice Spalato e carico pigro — Un approccio sistemico
Il bundler della metropolitana di React Native supporta la divisione del pacchetto JavaScript in più pezzi che possono essere caricati su richiesta. Questa tecnica, spesso chiamata “codice splitting”, riduce il tempo di download e di parse iniziale.
Come il codice di Spalato funziona in React Native
Per dividere, è necessario configurare Metro con un approccio di serializzazione personalizzato (ad esempio, utilizzando o ]). In alternativa, è possibile utilizzare React.lazy e Suspense per importare dinamicamente componenti a runtime. Tuttavia, i veri pacchetti asincroni richiedono un meccanismo di caricamento a blocchi lato server o pacchetti di distribuzione più comuni.
Implementazione di carico pigro
Anche senza la completa distribuzione del codice, è possibile lazy-load componenti utilizzando React.lazy:
const SettingsScreen = React.lazy(() => import('./Screens/SettingsScreen'));
Avvolgere il componente pigro in un limite con un'interfaccia utente fallback. Questo modello deferisce importare il modulo fino al primo render, riducendo la dimensione iniziale del fascio. Tuttavia, si noti che React.lazy da solo non crea file fisici separati — il codice componente è ancora in bundle nella principale JS. True file-level splitting Metro richiede modifiche di configurazione.
Strategie di precarico
Per le funzioni mission-critical, è possibile precaricare i pacchetti di chunk in background dopo il lancio dell'app. Utilizzare librerie come [] per servire i pezzi localmente, o incorporarli come beni. Su iOS, è possibile sfruttare l'API per le risorse on-demand. La chiave è di bilanciare le dimensioni iniziali con le prestazioni percepite: caricare solo ciò che l'utente ha bisogno immediatamente, quindi prendere il resto senza soluzione di continuità.
Leverage ProGuard e R8 per Android
Android costruisce beneficia fortemente di codice restringimento e strumenti di offuscamento.
ProGuard vs. R8
ProGuard è lo strumento tradizionale; R8 è il successore di Google che funziona di default in Android Gradle Plugin 3.4.0 e più in alto. R8 è più veloce e aggressivo nella rimozione del codice morto. Per abilitare R8, assicurarsi che il contiene:
android.enableR8=true
E in , set [ e per includere le regole di default ProGuard. R8 allora si restringe, ofuscate, e ottimizzare sia il codice Java/Kotlin che il codice nativo react C++ nativo se si utilizza Hermes.
Regole di protezione personalizzate per il react native
React Native si basa sulla riflessione e chiama JNI che possono essere spezzati da oltraggio aggressivo. È necessario mantenere alcune classi e metodi. Utilizzare le seguenti regole nel vostro :
-keep class com.facebook.react.** { *; }
-keep class com.facebook.hermes.** { *; }
-keepclassmembers class * {
@com.facebook.react.uimanager.annotations.ReactProp ;
}
Tenere anche le classi utilizzate dai moduli nativi (ad esempio, []). Testare la vostra produzione costruire accuratamente — una regola mancante può causare crash runtime.
Hermes e dimensione del Bundle
Se si utilizza il motore JavaScript di Hermes (React Native), il bundle JS è precompilato in bytecode, che è tipicamente 20-30% più piccolo della fonte JS grezzo. Abilita Hermes nel vostro e (per Android) o Podfile (per iOS). Hermes riduce anche l'utilizzo della memoria e il tempo di avvio.
Rimuovere Dipendenze e Bilancia Non Utilizzate
Molti sviluppatori aggiungono librerie per una singola caratteristica, quindi non li rimuovi mai.
Verifica le tue dipendenze
Usa per elencare i pacchetti che vengono installati ma mai importati. Tuttavia, questo strumento controlla solo le importazioni dirette nel tuo codice JS. Per i moduli nativi, è necessario rivedere manualmente [ e iOS Podfile per i Pod non utilizzati. Inoltre, ispezionare il per le dipendenze transitive che estrarre in librerie pesanti (ad esempio, una piccola utility che dipende da [33][FLT:
Sostituire le biblioteche pesanti con le alternative più leggere
Ad esempio, sostituire (70 KB minified) con (tree-shakeable, ~8 KB) o l'API incorporata . Swap kit UI full-featured con set minimi di componenti. Utilizzare funzionalità platform-native dove possibile: può essere sostituito con un WebViewj che carica un PDF.
Rimuovere le dipendenze di prova e sviluppo dalla produzione
Assicurarsi che i pacchetti come , [, e gli strumenti di debug sono esclusi dalla costruzione del rilascio.
Ottimizzare il JavaScript Bundle
Il pacchetto JS è spesso il più grande singolo pezzo dell'app — a volte 2-10 MB non compresso.
Minificazione e Eliminazione del codice morto
I fasci Metro utilizzano già UglifyJS o Terser in modalità di produzione. Ma è possibile ridurre ulteriormente le dimensioni consentendo a Babel plugin [[] di strisciare [] dichiarazioni. Inoltre, utilizzare gli obiettivi [ per evitare le caratteristiche di trasposizione che sono nativamente supportate dalla versione Android/iOS target (ad esempio, funzioni freccia, asincrona/await).
Albero che scuote
L'eliminazione del codice di rimozione degli alberi in React Native è limitata perché Metro non supporta pienamente i moduli ES. Tuttavia, è possibile migliorare i risultati importando solo moduli specifici da una libreria piuttosto che dall'intera libreria.
// Bad: imports the entire lodash bundle
import _ from 'lodash';
// Good: imports only the pick function (~5 KB)
import pick from 'lodash/pick';
Usare il con la regola per far rispettare le importazioni granulari.
Spalato Bundle
Come accennato in codice di divisione, è possibile dividere il bundle in più file. Un modello collaudato è quello di creare un pacchetto “core” contenente React, React Native, e la navigazione, e un “business” bundle con le schermate app. Questo consente agli utenti di aggiornare solo la logica aziendale ( download più piccoli) e sfrutta la cache HTTP se servita da un server.
Analizzare la composizione Bundle
Usa per generare una mappa interattiva del tuo fascio JS. Ciò rivela quali librerie consumano più spazio. Ad esempio, si potrebbe scoprire che una libreria di localizzazione aggiunge 500 KB, che potrebbe essere sostituita con un approccio JSON più semplice, a valore di chiave.
Tecniche di riduzione delle dimensioni di piattaforma-Specific
iOS: App Thinning e Bitcode
Abilita Codice di codice] in Xcode (Impostazioni di file -> Abilita Bitcode -> Sì). Bitcode @ permette a Apple di ri-ottimizzare e strisciare codice non richiesto durante la presentazione, riducendo le dimensioni del download. Inoltre, utilizzare Asset Cataloghi[FFFFFF]]
Per ulteriori risparmi, abilitare Risorse on-Demand (ODR)[[]] per beni come video introduttivi o livelli di gioco ad alta risoluzione. ODR consente di tag risorse e scaricare solo quando necessario, riducendo direttamente la dimensione iniziale del pacchetto App Store.
Android: App Bundle (AAB) e Split APKs
AAB genera APKs per densità, lingua e architettura. Questo può ridurre la dimensione del download del 30-50% perché gli utenti ottengono solo il codice e le risorse per il loro dispositivo specifico. In , assicura ].
Inoltre, utilizzare Android Dynamic Delivery[[]] per modulare le caratteristiche: installare il modulo base e scaricare i moduli delle funzionalità a richiesta (simile a iOS ODR).
Moduli nativi: Opt per Hermes e TurboModules
Per le versioni React Native più recenti (0.71+), abilitare New Architecture con TurboModules. TurboModules consentono ai moduli nativi di essere caricati pigramente, il che significa che il loro codice nativo non è collegato fino a quando il modulo di riduttore JS non è effettivamente utilizzato.
Monitoraggio e ottimizzazione continua
L'ottimizzazione delle dimensioni non è un'attività di una volta sola. Integralo nel flusso di lavoro di sviluppo.
Set di budget
Definire una dimensione massima APK/AAB (ad esempio, 40 MB per l'installazione iniziale) e applicarla durante CI. Utilizzare strumenti come [] o script personalizzati che confrontano la nuova dimensione di costruzione contro una linea di base. Se la dimensione aumenta oltre una soglia, la costruzione fallisce e il team indaga.
Track Size impatto in Pull Richieste
Commenta automaticamente le PRs il delta in formato JS bundle, dimensione binaria nativo e dimensione totale del patrimonio. Servizi come [] possono suggerire alternative più leggere.
Pulizie di dipendenza regolari
Impostare un audit trimestrale di dipendenza. Rimuovere i pacchetti non utilizzati, aggiornare alle versioni più recenti che possono avere azzerato, e sostituire librerie monolitiche con micro-librari. Strumenti come ] possono aiutare a identificare i pacchetti non utilizzati.
Risorse esterne per una lettura più approfondita
- React Native Official Docs: Ottimizzazione Flatlist[ (performance ma relativa alla dimensione di rendering)
- Android Sviluppatori: Ridurre APK Size[
- Apple: Guida alle risorse on-Demand[
- [react-native-bundle-visualizer[]
- Sito ufficiale del motore Hermes[
Conclusioni
Reducing app size in React Native projects demands a multi-layered strategy that addresses assets, JavaScript bundle, native code, and dependency management. By adopting modern image formats, enabling Hermes and R8, splitting code and resources, and continuously monitoring size in CI, you can deliver apps that are fast to download, light on storage, and respectful of users’ data plans. The investment in size optimization pays off in higher conversion rates, better ratings, and lower churn — especially in global markets where every kilobyte matters. Start with an audit of your current build, prioritize the largest offenders, and iterate. Your users will thank you with every update they install.