Guida allo Sviluppo App React Native 2026: Creare App di Produzione e Domande per Colloqui
Guida completa allo sviluppo di app React Native nel 2026 con Expo SDK 56, New Architecture, Hermes V1 e domande tipiche dei colloqui tecnici per sviluppatori React Native.

Lo sviluppo di app React Native nel 2026 si concentra sulla New Architecture, Expo SDK 56 e strumenti pronti per la produzione che sono maturati significativamente nell'ultimo anno. Questa guida copre il flusso di lavoro pratico per la creazione di app di produzione e affronta le domande comuni dei colloqui che distinguono gli sviluppatori React Native esperti.
Lo stack di produzione consigliato: Expo SDK 56 con EAS Build, React Native 0.85+, motore Hermes V1 e la New Architecture abilitata per impostazione predefinita. I tempi di build sono diminuiti del 16% su iOS e del 60% su Android rispetto all'SDK 55.
Configurare un Progetto React Native Pronto per la Produzione
Avviare un nuovo progetto React Native nel 2026 significa scegliere tra Expo (consigliato) e React Native bare. Expo si è evoluto da wrapper adatto ai principianti alla raccomandazione ufficiale del team React Native per la maggior parte delle app di produzione.
# Create a new Expo project with SDK 56
npx create-expo-app@latest my-production-app
cd my-production-app
# Verify the New Architecture is enabled (default since RN 0.76)
npx expo config --type introspect | grep newArchEnabledLa New Architecture, che include Fabric, TurboModules e JSI, elimina il bridge JSON asincrono che causava colli di bottiglia nelle prestazioni delle app complesse. JavaScript può ora chiamare moduli nativi in modo sincrono, eliminando un'intera categoria di bug di timing.
{
"expo": {
"name": "MyProductionApp",
"slug": "my-production-app",
"version": "1.0.0",
"newArchEnabled": true, // Default in SDK 56
"android": {
"package": "com.company.myproductionapp",
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"ios": {
"bundleIdentifier": "com.company.myproductionapp",
"supportsTablet": true
},
"plugins": [
"expo-router"
]
}
}Expo Router è diventato lo standard per la navigazione, portando il routing basato su file simile a Next.js. La struttura della directory /app viene mappata direttamente alle route.
Motore Hermes V1 e Prestazioni JavaScript
Hermes V1 è stato rilasciato come motore JavaScript predefinito in React Native 0.84, sostituendo sia JavaScriptCore che il vecchio Hermes. Il nuovo compilatore e la macchina virtuale offrono esecuzione bytecode più veloce, minor utilizzo di memoria e migliore distribuzione delle pause di garbage collection.
// Performance monitoring with Hermes V1
// HermesInternal is available globally when running on Hermes
declare global {
var HermesInternal: {
getRuntimeProperties: () => Record<string, unknown>;
enableSamplingProfiler: () => void;
disableSamplingProfiler: () => string;
} | undefined;
}
export function checkHermesStatus(): boolean {
const isHermes = typeof HermesInternal === 'object' && HermesInternal !== null;
if (isHermes && __DEV__) {
const props = HermesInternal.getRuntimeProperties();
console.log('Hermes version:', props['OSS Release Version']);
console.log('Bytecode version:', props['Bytecode Version']);
}
return isHermes;
}Hermes V1 precompila JavaScript in bytecode durante il processo di build. Questo elimina il parsing JavaScript a runtime, che rappresenta una parte significativa del tempo di avvio dell'app. Le build di produzione vedono un Time to Interactive più veloce del 10-30% rispetto a JSC.
Build con EAS Build e Compilazione Ottimizzata
EAS Build gestisce le build di produzione nel cloud con caching, firma e distribuzione. L'SDK 56 ha introdotto XCFramework precompilati per i moduli Expo su iOS e un plugin del compilatore Kotlin per Android che elimina la reflection a runtime.
{
"cli": {
"version": ">= 15.0.0"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"ios": {
"simulator": true
}
},
"preview": {
"distribution": "internal",
"ios": {
"resourceClass": "m-medium"
},
"android": {
"buildType": "apk"
}
},
"production": {
"ios": {
"resourceClass": "m-large"
},
"android": {
"buildType": "app-bundle"
},
"env": {
"EXPO_USE_PRECOMPILED_MODULES": "1"
}
}
},
"submit": {
"production": {}
}
}Compilare l'app di produzione:
# Build for iOS App Store
eas build --platform ios --profile production
# Build for Google Play
eas build --platform android --profile production
# Submit to stores after build
eas submit --platform allLa funzionalità degli header precompilati per Android (usePrecompiledHeaders in expo-build-properties) ha ridotto i tempi di compilazione CMake da 17 minuti a 6 minuti nei benchmark di Expo.
Pronto a superare i tuoi colloqui su React Native?
Pratica con i nostri simulatori interattivi, flashcards e test tecnici.
Pattern di State Management e Data Fetching
Le app React Native di produzione tipicamente combinano TanStack Query per lo stato del server con Zustand o Jotai per lo stato del client. Questa separazione mantiene il codebase prevedibile ed evita la complessità di Redux per la maggior parte dei casi d'uso.
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { api } from '@/lib/api';
import type { Product } from '@/types';
// Query key factory for type-safe cache management
export const productKeys = {
all: ['products'] as const,
lists: () => [...productKeys.all, 'list'] as const,
list: (filters: ProductFilters) => [...productKeys.lists(), filters] as const,
details: () => [...productKeys.all, 'detail'] as const,
detail: (id: string) => [...productKeys.details(), id] as const,
};
export function useProducts(filters: ProductFilters) {
return useQuery({
queryKey: productKeys.list(filters),
queryFn: () => api.products.list(filters),
staleTime: 5 * 60 * 1000, // 5 minutes
gcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)
});
}
export function useCreateProduct() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: CreateProductInput) => api.products.create(data),
onSuccess: () => {
// Invalidate list queries to refetch
queryClient.invalidateQueries({ queryKey: productKeys.lists() });
},
});
}Per funzionalità offline-first, TanStack Query può essere combinato con WatermelonDB o il supporto SQLite integrato attraverso expo-sqlite:
import * as SQLite from 'expo-sqlite';
import NetInfo from '@react-native-community/netinfo';
const db = SQLite.openDatabaseSync('app.db');
export async function initializeOfflineStorage() {
await db.execAsync(`
CREATE TABLE IF NOT EXISTS pending_mutations (
id TEXT PRIMARY KEY,
type TEXT NOT NULL,
payload TEXT NOT NULL,
created_at INTEGER NOT NULL
);
`);
}
export async function queueMutation(type: string, payload: object) {
const id = crypto.randomUUID();
await db.runAsync(
'INSERT INTO pending_mutations (id, type, payload, created_at) VALUES (?, ?, ?, ?)',
[id, type, JSON.stringify(payload), Date.now()]
);
}
export async function syncPendingMutations() {
const state = await NetInfo.fetch();
if (!state.isConnected) return;
const pending = await db.getAllAsync<PendingMutation>(
'SELECT * FROM pending_mutations ORDER BY created_at ASC'
);
for (const mutation of pending) {
try {
await processMutation(mutation);
await db.runAsync('DELETE FROM pending_mutations WHERE id = ?', [mutation.id]);
} catch (error) {
console.error('Sync failed for mutation:', mutation.id);
break; // Stop on first failure to maintain order
}
}
}Sistema di Animazioni con React Native Reanimated 4
React Native 0.85 ha introdotto un nuovo backend per le animazioni che si allinea con la New Architecture. Reanimated 4 ne sfrutta appieno le potenzialità, eseguendo le animazioni sul thread UI senza attraversare il bridge JS.
import Animated, {
useSharedValue,
useAnimatedStyle,
withSpring,
withTiming,
interpolate,
Extrapolation,
} from 'react-native-reanimated';
import { Gesture, GestureDetector } from 'react-native-gesture-handler';
const SWIPE_THRESHOLD = 120;
export function SwipeableCard({ onSwipe, children }: SwipeableCardProps) {
const translateX = useSharedValue(0);
const opacity = useSharedValue(1);
const panGesture = Gesture.Pan()
.onUpdate((event) => {
translateX.value = event.translationX;
})
.onEnd((event) => {
if (Math.abs(event.translationX) > SWIPE_THRESHOLD) {
const direction = event.translationX > 0 ? 'right' : 'left';
translateX.value = withTiming(
direction === 'right' ? 500 : -500,
{ duration: 200 }
);
opacity.value = withTiming(0, { duration: 200 }, () => {
onSwipe(direction);
});
} else {
translateX.value = withSpring(0, {
damping: 15,
stiffness: 150,
});
}
});
const animatedStyle = useAnimatedStyle(() => ({
transform: [
{ translateX: translateX.value },
{
rotate: `${interpolate(
translateX.value,
[-200, 0, 200],
[-15, 0, 15],
Extrapolation.CLAMP
)}deg`,
},
],
opacity: opacity.value,
}));
return (
<GestureDetector gesture={panGesture}>
<Animated.View style={animatedStyle}>
{children}
</Animated.View>
</GestureDetector>
);
}La direttiva worklet (implicita in Reanimated 4 per le funzioni passate a useAnimatedStyle) assicura che la logica di animazione venga eseguita sul thread UI. Questo permette di raggiungere un refresh rate costante di 120Hz sui dispositivi supportati.
Domande per Colloqui per Sviluppatori React Native
I colloqui tecnici per posizioni React Native nel 2026 si concentrano fortemente sulla New Architecture, l'ottimizzazione delle prestazioni e il deployment in produzione. Altre domande per colloqui React Native sono disponibili per esercitarsi su argomenti specifici.
Cosa è cambiato con la New Architecture e perché è importante?
La New Architecture ha sostituito il bridge JSON asincrono con JSI (JavaScript Interface), abilitando la comunicazione sincrona tra JavaScript e codice nativo. Tre componenti formano il nucleo:
- JSI: Un layer C++ che permette a JavaScript di mantenere riferimenti a oggetti nativi e chiamare i loro metodi direttamente
- Fabric: Il nuovo sistema di rendering che supporta misurazioni di layout sincrone e rendering concorrente
- TurboModules: Moduli nativi che si caricano in modo lazy e comunicano attraverso JSI invece del bridge
L'impatto pratico: la contesa del thread UI è diminuita del 10-30% nelle app tipiche. Le app con uso intensivo di moduli nativi vedono fino a 3x di miglioramento nelle prestazioni delle chiamate cross-thread perché l'overhead di serializzazione viene eliminato.
Come si differenzia Hermes V1 da JavaScriptCore?
Hermes V1 precompila JavaScript in bytecode al momento della build, eliminando il passaggio di parsing a runtime. Differenze chiave:
- Tempo di avvio: Hermes salta il parsing, riducendo il Time to Interactive del 10-30%
- Memoria: Minor utilizzo di memoria base grazie alla rappresentazione bytecode ottimizzata
- Debugging: Hermes usa il Chrome DevTools Protocol nativamente, mentre JSC richiedeva un adapter personalizzato
- Garbage collection: Hermes usa un GC generazionale con tempi di pausa più brevi
Il compromesso: Hermes storicamente aveva una velocità di esecuzione di picco più lenta per codice computazionalmente intensivo, anche se V1 ha ridotto significativamente questo divario.
Spiegare la differenza tra useCallback, useMemo e React.memo in React Native
Tutti e tre sono strumenti di memoizzazione, ma servono scopi diversi:
// useCallback: memoizes a function reference
const handlePress = useCallback(() => {
navigation.navigate('Detail', { id: item.id });
}, [item.id, navigation]);
// useMemo: memoizes a computed value
const sortedItems = useMemo(() => {
return items.slice().sort((a, b) => a.price - b.price);
}, [items]);
// React.memo: memoizes a component's render output
const ProductCard = React.memo(function ProductCard({ product, onPress }: Props) {
return (
<Pressable onPress={onPress}>
<Text>{product.name}</Text>
</Pressable>
);
});In React Native, React.memo è particolarmente importante per gli elementi delle liste renderizzati da FlatList. Senza di esso, ogni elemento si ri-renderizza quando lo stato del parent cambia, causando frame drop durante lo scrolling.
Come si gestisce il Deep Linking in un'app React Native di produzione?
Il Deep Linking richiede configurazione a più livelli: schemi URL nativi, universal/app links e il router JavaScript.
{
"expo": {
"scheme": "myapp",
"ios": {
"associatedDomains": ["applinks:myapp.com"]
},
"android": {
"intentFilters": [
{
"action": "VIEW",
"autoVerify": true,
"data": [
{
"scheme": "https",
"host": "myapp.com",
"pathPrefix": "/product"
}
],
"category": ["BROWSABLE", "DEFAULT"]
}
]
}
}
}Expo Router gestisce automaticamente il parsing quando la struttura della directory app corrisponde ai percorsi URL. Per una gestione personalizzata:
import { useURL } from 'expo-linking';
import { useEffect } from 'react';
import { router } from 'expo-router';
export default function RootLayout() {
const url = useURL();
useEffect(() => {
if (url) {
const parsed = parseDeepLink(url);
if (parsed.requiresAuth && !isAuthenticated) {
// Store intended destination, redirect to login
router.replace('/login');
}
}
}, [url]);
return <Slot />;
}I Universal Links (iOS) e gli App Links (Android) richiedono configurazione lato server: rispettivamente un file apple-app-site-association e un file assetlinks.json, serviti dal dominio root.
Inizia a praticare!
Metti alla prova le tue conoscenze con i nostri simulatori di colloquio e test tecnici.
Punti Chiave per lo Sviluppo React Native nel 2026
- La New Architecture è obbligatoria: il vecchio bridge è stato disabilitato in React Native 0.82 e l'85% dei pacchetti npm ora supporta la nuova architettura
- Expo SDK 56 con EAS Build fornisce il percorso più veloce verso la produzione, con moduli precompilati che riducono i tempi di build iOS del 16% e la compilazione CMake Android del 60%
- Hermes V1 è il motore predefinito senza necessità di configurazione, offrendo un avvio più veloce del 10-30% rispetto a JSC
- TanStack Query più una libreria leggera per lo stato client (Zustand/Jotai) copre la maggior parte delle esigenze di gestione dati di produzione senza la complessità di Redux
- Reanimated 4 con il nuovo backend per le animazioni raggiunge animazioni a 120Hz eseguendo interamente sul thread UI
- La preparazione ai colloqui dovrebbe concentrarsi sui meccanismi JSI, il rendering Fabric, il profiling delle prestazioni con Hermes e il deployment in produzione con EAS
Sapresti trovare il bug in React Native?
Uno snippet reale, un bug nascosto, un tentativo al giorno. Senza account per provare.

Scritto da
Anthony Fillion-MailletFondatore di SharpSkill
Sviluppatore fullstack da oltre 10 anni. Guida SharpSkill e risponde di tutto ciò che vi viene pubblicato.
Aggiornato il 14 settembre 2026
Condividi
Articoli correlati

Sviluppo App React Native 2026: Guida Completa e Domande di Colloquio
La guida completa allo sviluppo di app React Native nel 2026. JSI, Fabric, New Architecture, ottimizzazione delle performance e domande frequenti nei colloqui tecnici.

React Native 0.87 e SwiftPM nel 2026: Build iOS Moderno e Domande per Colloqui
React Native 0.87 introduce il supporto sperimentale per Swift Package Manager, eliminando CocoaPods dalle build iOS. Questa guida copre la configurazione di SwiftPM, la Strict TypeScript API, le ottimizzazioni di Metro 0.87 e domande per colloqui di sviluppatori mobile senior.

Flutter vs React Native Performance: Benchmark e Domande da Colloquio 2026
Confronto delle performance tra Flutter e React Native nel 2026 con benchmark reali. Impeller, New Architecture, frame rate, consumo memoria e domande tecniche per colloqui.