Cos'è React Native?

React Native è un framework open source sviluppato da Facebook che consente agli sviluppatori di costruire applicazioni mobili utilizzando JavaScript e React.A differenza degli approcci tradizionali ibridi che rendono le viste web, React Native compila i componenti della piattaforma nativa.Questo significa che l'interfaccia dell'app è costruita con reali viste native (come su iOS e ]] su Android), con conseguente performance che si abbinano strettamente a applicazioni native.

React Native è stato rilasciato per la prima volta nel 2015 ed è stato adottato da importanti aziende tra cui Instagram, Shopify e Discord. La sua vivace comunità e ecosistema di biblioteche lo rendono una scelta pratica per startup e imprese.

Iniziare con React Native: Impostazione ambiente

Prima di scrivere qualsiasi codice React Native, è necessario impostare il vostro ambiente di sviluppo. I passaggi esatti differiscono a seconda che si becchino iOS, Android, o entrambi, e se si utilizza il React Native CLI o Expo.

Prerequisiti

  • Node.js & npm (o Yarn): È consigliato la versione 18 o più recente. Scarica da nodejs.org].
  • Watchman (macOS/Linux):[] Uno strumento di monitoraggio dei file di Facebook che migliora le prestazioni. Installa via Homebrew ().
  • Xcode (iOS only):] Richiesto per la costruzione e il test sui simulatori iOS. Scarica dal Mac App Store. Assicurarsi di avere installato gli ultimi strumenti di linea di comando Xcode.
  • Android Studio (solo Android):[] Richiesto per emulatori Android e strumenti.

Scegliere tra React Native CLI e Expo

Esistono due modi principali per avviare un progetto React Native:

  • React Native CLI:[] L'approccio bare-metal. Hai il pieno controllo sul codice nativo e puoi integrare qualsiasi modulo nativo.
  • Expo:] Un framework gestito costruito sulla parte superiore del React Native. Astrae la maggior parte della configurazione nativa e fornisce un ricco insieme di moduli pre-costruiti (camera, notifiche push, ecc.). Ideale per una rapida prototipazione e progetti che non necessitano di codice nativo personalizzato.

Per questa guida, useremo il CLI React Native perché vi dà la massima flessibilità.

npx @react-native-community/cli init MyApp

Dopo l'inizializzazione, naviga nella cartella del progetto ed esegui [] per lanciare il bundler Metro. Quindi apri un secondo terminale ed esegui o ] per lanciare l'applicazione su un emulatore o dispositivo.

Concetti fondamentali in React Native

Mastering React Native richiede la comprensione dei suoi blocchi di costruzione principali, molti dei quali sono estensioni dirette di React per il web.

Componenti

Tutto in React Native è un componente. Il framework fornisce una serie di componenti fondamentali che mappano agli elementi nativi dell'interfaccia utente:

  • ][] – Un contenitore che supporta il layout con Flexbox, lo styling e la manipolazione del tocco.
  • ][] – Per la visualizzazione del testo. A differenza del web HTML, è necessario avvolgere qualsiasi testo all'interno .
  • ][] — Visualizza immagini locali o remote.
  • ][] — Un contenitore di scorrimento generico.
  • [] — Un campo di input di testo.
  • ][] — Rende una vista rispondere ai rubinetti con un feedback visivo.
  • ][] — Componente di lista ad alte prestazioni per i grandi set di dati.

Per una lista completa, controllare la documentazione ufficiale React Native].

Stato e Props

Questi sono gli stessi concetti come in React per il web:

  • Props:[]] Breve per le proprietà. Sono valori di sola lettura passati da un componente genitore a un componente bambino. Configurano il comportamento o l'aspetto del bambino.
  • State:[]] I dati utili gestiti all'interno di un componente. Quando lo stato cambia, il componente ri-renders. Usa [] hook (componenti funzionali) o ] (componenti di classe).

Esempio:

import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';

const Counter = () => {
 const [count, setCount] = useState(0);
 return (
 <View>
 <Text>You pressed {count} times</Text>
 <Button title="Press me" onPress={() => setCount(count + 1)} />
 </View>
 );
};
export default Counter;

La soluzione più popolare è Riattiva navigazione[[]. Fornisce un navigatore stack (come uno stack stack stack stack stack stack), un navigatore scheda e un navigatore di cassetti.

npm install @react-navigation/native @react-navigation/stack

Dopo l'installazione, avvolgere la vostra app con [] e definire i vostri schermi:

import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

function App() {
 return (
 <NavigationContainer>
 <Stack.Navigator>
 <Stack.Screen name="Home" component={HomeScreen} />
 <Stack.Screen name="Details" component={DetailsScreen} />
 </Stack.Navigator>
 </NavigationContainer>
 );
}

Styling

React Native utilizza oggetti JavaScript per lo styling invece di CSS. Definisci gli stili usando o oggetti in linea. Il motore di layout è Flexbox per impostazione predefinita, con proprietà come , , . Non ci sono richieste di media CSS; il design reattivo è raggiunto attraverso l'API o libredi libreriereriereriereriereriereriererie [[

Costruire la vostra prima applicazione Cross-Platform: un esempio passo-passo

Costruiamo una semplice app meteo che consente di recuperare i dati da un'API pubblica e di visualizzarli su entrambe le piattaforme, dimostrando la gestione dello stato, le richieste di rete e la composizione dei componenti.

Passo 1: Impostazione del progetto

Creare un nuovo progetto utilizzando il React Native CLI:

npx @react-native-community/cli init WeatherApp
cd WeatherApp

Fase 2: Installare dipendenze

Abbiamo bisogno di alcuni pacchetti:

npm install @react-navigation/native @react-navigation/stack react-native-screens react-native-safe-area-context

Per la chiamata API, useremo l'API incorporata .

Passo 3: costruire la schermata iniziale

Crea :

import React, { useState, useEffect } from 'react';
import { View, Text, TextInput, Button, StyleSheet, ActivityIndicator } from 'react-native';

const API_KEY = 'YOUR_OPENWEATHERMAP_API_KEY';
const BASE_URL = 'https://api.openweathermap.org/data/2.5/weather';

const HomeScreen = () => {
 const [city, setCity] = useState('');
 const [weather, setWeather] = useState(null);
 const [loading, setLoading] = useState(false);
 const [error, setError] = useState(null);

 const fetchWeather = async () => {
 if (!city.trim()) return;
 setLoading(true);
 setError(null);
 try {
 const response = await fetch(`${BASE_URL}?q=${city}&appid=${API_KEY}&units=metric`);
 const data = await response.json();
 if (data.cod !== 200) {
 setError(data.message);
 } else {
 setWeather(data);
 }
 } catch (err) {
 setError('Network error');
 } finally {
 setLoading(false);
 }
 };

 return (
 <View style={styles.container}>
 <Text style={styles.title}>Weather App</Text>
 <TextInput
 style={styles.input}
 placeholder="Enter city name"
 value={city}
 onChangeText={setCity}
 />
 <Button title="Get Weather" onPress={fetchWeather} />
 {loading && <ActivityIndicator size="large" />}
 {error && <Text style={styles.error}>{error}</Text>}
 {weather && (
 <View style={styles.weatherContainer}>
 <Text style={styles.cityName}>{weather.name}</Text>
 <Text>Temperature: {weather.main.temp}°C</Text>
 <Text>Conditions: {weather.weather[0].description}</Text>
 </View>
 )}
 </View>
 );
};

const styles = StyleSheet.create({
 container: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 },
 title: { fontSize: 24, fontWeight: 'bold', marginBottom: 20 },
 input: { borderWidth: 1, borderColor: '#ccc', borderRadius: 5, width: '80%', padding: 10, marginBottom: 10 },
 error: { color: 'red', marginTop: 10 },
 weatherContainer: { marginTop: 20, alignItems: 'center' },
 cityName: { fontSize: 20, fontWeight: '600', marginBottom: 10 }
});

export default HomeScreen;

Passo 4: Navigazione via cavo

, importare il navigatore e lo schermo:

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import HomeScreen from './screens/HomeScreen';

const Stack = createStackNavigator();

export default function App() {
 return (
 <NavigationContainer>
 <Stack.Navigator>
 <Stack.Screen name="Home" component={HomeScreen} options={{ title: 'Weather' }} />
 </Stack.Navigator>
 </NavigationContainer>
 );
}

Passo 5: Eseguire l'app

Avviare il bundler della metropolitana ([), quindi eseguire su Android ([[]) o iOS ([[]]). Si dovrebbe vedere un input di testo, un pulsante e dati meteo dopo una chiamata API di successo.

Questa applicazione di base funziona su entrambe le piattaforme con codice JavaScript identico.

Vantaggi dell'utilizzo di React Native

  • Reusability del codice:[] Condividi logica aziendale, gestione dello stato e componenti dell'interfaccia utente su piattaforme. Puoi anche riutilizzare il codice con un'app web utilizzando React Native for Web.
  • Performance:[] Prestazioni quasi native perché l'interfaccia utente viene resa utilizzando componenti nativi, non viste web. Il thread JavaScript viene eseguito in modo asincrono e i calcoli pesanti possono essere scaricati in moduli nativi.
  • Grande comunità & Ecosistema:[ Migliaia di biblioteche, una comunità vivace su GitHub, e strumenti di vasta portata. I problemi sono ben documentati e i plugin esistono per quasi ogni esigenza.
  • Fast Development with Hot Reload:[] Il bundler Metro supporta la sostituzione del modulo caldo (HMR). È possibile modificare il codice e vedere le modifiche istantaneamente senza ricostruire l'intera app.
  • Aggiornamento all'aria:[ Con servizi come Microsoft App Center o CodePush, è possibile spingere JavaScript e aggiornamenti di asset direttamente agli utenti senza l'approvazione dell'app store.
  • Cost-Effective:[] Un team può mantenere un unico codice base invece di due squadre autonome separate, riducendo così i costi di sviluppo e manutenzione.

Sfide e limitazioni

Nonostante i suoi punti di forza, React Native non è un proiettile d'argento:

  • Moduli di carattere:[] Quando è necessario accedere alle funzionalità del dispositivo non coperte dalle librerie di nucleo o comunità (ad esempio, Bluetooth avanzato, filtri per fotocamera personalizzati), è necessario scrivere codice specifico della piattaforma in Java/Kotlin (Android) o Obiettivo-C/Swift (iOS).
  • Performance Collocature:[[] React Native si basa su un ponte tra JavaScript e thread nativi. Animazioni molto complesse, grafica in tempo reale (come giochi 3D), o elaborazione dati pesante può causare jank. Per la maggior parte delle applicazioni aziendali, le prestazioni sono adeguate, ma per giochi o applicazioni intensive considerano Flutter o full nativo.
  • Complessità di debug:[] Mentre gli strumenti di debugging sono migliorati, la risoluzione dei problemi dei bug specifici della piattaforma può essere difficile. I problemi possono verificarsi solo su alcuni dispositivi Android o versioni iOS. La comunità e gli strumenti React Native come aiuto Flipper, ma l'esperienza di debugging non è così semplice come lo sviluppo nativo.
  • UI Consistency:[] Poiché ogni piattaforma rende i componenti in modo diverso (ad esempio ha diverse apparizioni su iOS e Android), potresti dover scrivere stili o componenti specifici della piattaforma. L'API aiuta a rilevare il sistema operativo, ma mantenere un design veramente pixel-perfect su entrambe le piattaforme può essere di consumo di tempo.
  • Size of the App:[ Le app React Native tendono ad essere più grandi delle applicazioni completamente native a causa dell'inclusione del motore JavaScript (Hermes o JavaScriptCore).

Argomenti avanzati: Quando hai bisogno di più

Interagendo con i moduli nativi

Per colmare il divario quando una libreria JavaScript non esiste, è possibile scrivere un modulo nativo, ad esempio utilizzare un sensore hardware non supportato da un pacchetto comunitario:

  • Su Android: Crea una classe Java che si estende ] e registrala con il pacchetto.
  • Su iOS: Crea una classe Swift/ObjC che implementa il protocollo .
  • Poi chiamalo da JavaScript:

Strategie di ottimizzazione delle prestazioni

  • Use Hermes:[] Hermes è un motore JavaScript ottimizzato per il mobile. Abilita nel vostro e . Riduce il tempo di avvio e l'utilizzo della memoria.
  • FlatList vs ScrollView:[]] Usa [] o ] per lunghe liste, riciclano le viste e evitano di rendere gli elementi off-screen.
  • Memoization:[]] Usa e ] per evitare inutili ri-render.
  • InteractionManager:[] Deferire calcoli pesanti fino a dopo che le animazioni o le transizioni complete.
  • Native Driver for Animations:[] Usa quando si animano le proprietà non-layout (opacità, trasformarsi).
  • Caching di immagini:[] Sostituire il componente standard [ con ] (da ]) per una migliore gestione della memoria e caching.

Testare la tua App

React Native supporta varie strategie di test:

  • Prova di prova:[] Usa Jest (preconfigurato) per testare funzioni e logica puri.
  • Ricerca completa:[] Utilizzare la libreria di test nativi reatti per rendere i componenti e le interazioni degli utenti di prova.
  • End-to-End Testing:[[] Detox by Wix è un popolare framework di test E2E grigio-box che funziona su dispositivi e simulatori reali.

Distribuzione su App Stores

Prima di distribuire, assicurarsi di avere una costruzione pronta alla produzione:

  • Configurare le icone delle app e gli schermi di schizzi per entrambe le piattaforme.
  • Impostare la versione dell'app e costruire il numero in [ e file di configurazione nativi.
  • Per Android: Generare un APK firmato o AAB utilizzando il tastiere Android Studio. Quindi caricare su Google Play Console.
  • Per iOS: Archivia l'app in Xcode (Product > Archive), firma con un certificato di distribuzione e carica tramite Xcode o Transporter su App Store Connect.
  • Considerate l'utilizzo di servizi di integrazione continua come GitHub Actions o Bitrise per automatizzare la costruzione e la firma.

Esempi reali di applicazioni native reatti

  • Instagram (Explore Tab / Threads): Instagram utilizza React Native per parti della sua applicazione, tra cui la scheda Esplora e l'app standalone Threads.
  • Discord (Mobile):[] L'app mobile di Discord è stata costruita con React Native. Hanno approfittato del motore Hermes per prestazioni e condivisione di codice tra Android e iOS.
  • Walmart:[[] Il gigante del retail ricostruì la sua applicazione mobile utilizzando React Native, ottenendo esperienze quasi identiche su entrambe le piattaforme e riducendo il tempo di sviluppo.
  • Uber Eats (Restaurant Dashboard): Uber Eats utilizza React Native per il suo cruscotto rivolto al ristorante, consentendo un rapido iterazione e distribuzione cross-platform.

Conclusioni

React Native rimane una scelta ideale per lo sviluppo mobile multipiattaforma a causa del suo equilibrio tra prestazioni, esperienza di sviluppo e riutilizzabilità del codice. Nonostante abbia limitazioni, soprattutto intorno alle applicazioni ad alta intensità grafica e alla complessità dei moduli nativi, eccelle per la maggior parte delle applicazioni mobili standard, dall'e-commerce ai social media agli strumenti aziendali.

Con la padronanza dei concetti fondamentali (componenti, stati, navigazione, styling), sfruttando l'esteso ecosistema di librerie, e seguendo le migliori pratiche per le prestazioni e i test, è possibile fornire applicazioni di alta qualità sia agli utenti iOS e Android con un unico codice base.