# Expo Router in React Native: Guida Completa alla Navigazione File-Based > Guida completa a Expo Router per React Native nel 2026. Navigazione basata su file, route dinamiche, tab, modali, typed routes, middleware e protezione delle route con esempi di codice. - Published: 2026-04-18 - Updated: 2026-04-18 - Author: SharpSkill - Tags: react-native, expo, expo-router, navigation, mobile-development, tutorial - Reading time: 9 min --- Expo Router ridefinisce la gestione della navigazione nelle applicazioni React Native, sostituendo la configurazione manuale dei navigatori con un sistema di routing basato sulla struttura dei file. Ispirato a framework web come Next.js, ogni file all'interno della directory `app/` diventa automaticamente una route accessibile. Con l'SDK Expo 55 e Expo Router v6, la dichiarazione esplicita degli stack di navigazione appartiene al passato. Android, iOS e web vengono gestiti in modo unificato, senza configurazioni aggiuntive per ciascuna piattaforma. Questo approccio riduce drasticamente la complessità dei progetti multipiattaforma e accelera i cicli di sviluppo mobile. > **Avvio rapido** > > I nuovi progetti Expo integrano Expo Router per impostazione predefinita. Il comando `npx create-expo-app@latest --template default@sdk-55` genera un progetto preconfigurato con il routing file-based. Per i progetti esistenti, e sufficiente installare il pacchetto `expo-router` e aggiornare il punto di ingresso dell'applicazione. ## Come funziona il routing basato su file in Expo Router Ogni file inserito nella directory `app/` si trasforma automaticamente in una route. Il percorso del file corrisponde direttamente al percorso dell'URL, eliminando la necessita di un file di configurazione centralizzato. Un file `app/settings.tsx` genera la route `/settings`, mentre `app/profile/edit.tsx` corrisponde a `/profile/edit`. Questa convenzione offre tre vantaggi fondamentali rispetto alla configurazione tradizionale con React Navigation: - **Zero configurazione**: le route esistono nel momento stesso in cui il file viene creato - **Deep linking automatico**: ogni schermata dispone di un URL, semplificando la condivisione e il testing - **Navigazione tipizzata**: TypeScript conosce le route esistenti gia in fase di compilazione ```typescript // app/index.tsx import { View, Text, StyleSheet } from 'react-native' import { Link } from 'expo-router' export default function HomeScreen() { return ( Welcome {/* Link maps directly to file path */} Open Settings Edit Profile ) } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', padding: 24 }, title: { fontSize: 28, fontWeight: 'bold', marginBottom: 16 }, link: { fontSize: 16, color: '#61DAFB', marginTop: 12 }, }) ``` Il componente `Link` gestisce la navigazione su tutte le piattaforme. Sul web, genera un tag anchor con gli attributi `href` appropriati per l'indicizzazione nei motori di ricerca. Sulle piattaforme native, attiva una navigazione di tipo stack con le transizioni previste dal sistema operativo. ## Struttura del progetto e file di layout Expo Router utilizza file `_layout.tsx` per definire i contenitori di navigazione. Ogni directory puo contenere il proprio layout, creando gerarchie di navigazione annidate. Il layout radice avvolge l'intera applicazione, mentre i layout annidati controllano sezioni specifiche. Una struttura di progetto tipica si presenta nel modo seguente: ```text app/ _layout.tsx # Root layout (Stack or custom) index.tsx # Home screen (/) (tabs)/ # Tab group (parentheses = route group) _layout.tsx # Tab navigator home.tsx # /home tab search.tsx # /search tab profile.tsx # /profile tab settings/ _layout.tsx # Settings stack layout index.tsx # /settings notifications.tsx # /settings/notifications privacy.tsx # /settings/privacy ``` I gruppi di route -- directory racchiuse tra parentesi -- organizzano i file senza influire sull'URL. La directory `(tabs)` nell'esempio precedente crea un navigatore a schede, ma gli URL rimangono `/home`, `/search` e `/profile` anziche `/tabs/home`. ```typescript // app/_layout.tsx import { Stack } from 'expo-router' export default function RootLayout() { return ( ) } ``` Il layout radice funge anche da punto di inizializzazione per il caricamento dei font, la configurazione dei provider e le impostazioni globali. Sostituisce il tradizionale `App.tsx` come punto di ingresso dell'applicazione. ## Costruzione di una navigazione a schede La navigazione a schede rappresenta uno dei pattern piu diffusi nelle applicazioni mobile. Expo Router ne semplifica l'implementazione tramite il componente `Tabs`, configurabile direttamente nel file `_layout.tsx` del gruppo di route corrispondente. ```typescript // app/(tabs)/_layout.tsx import { Tabs } from 'expo-router' import { Ionicons } from '@expo/vector-icons' export default function TabLayout() { return ( ( ), }} /> ( ), }} /> ( ), }} /> ) } ``` Ogni file di schermata all'interno del gruppo di schede esporta un componente React standard. L'icona, l'etichetta e il badge della barra delle schede si configurano attraverso la prop `options` del layout. L'ordine di dichiarazione nel file `_layout.tsx` determina la sequenza delle schede nella barra di navigazione. ## Route dinamiche e parametri di route I segmenti dinamici utilizzano le parentesi quadre nel nome del file. Un file denominato `[id].tsx` cattura un singolo segmento dell'URL, mentre `[...slug].tsx` intercetta tutti i segmenti rimanenti del percorso. ```typescript // app/product/[id].tsx import { View, Text, StyleSheet } from 'react-native' import { useLocalSearchParams, Stack } from 'expo-router' export default function ProductScreen() { const { id } = useLocalSearchParams<{ id: string }>() return ( Product Details ID: {id} ) } const styles = StyleSheet.create({ container: { flex: 1, padding: 24 }, heading: { fontSize: 24, fontWeight: 'bold', marginBottom: 8 }, id: { fontSize: 16, color: '#888' }, }) ``` Navigando verso `/product/42`, la schermata viene visualizzata con la variabile `id` impostata su `"42"`. L'hook `useLocalSearchParams` fornisce un accesso tipizzato a tutti i parametri della route. Per le route catch-all, la sintassi `[...slug].tsx` consente di catturare interi segmenti di percorso: ```typescript // app/docs/[...slug].tsx import { useLocalSearchParams } from 'expo-router' export default function DocsScreen() { const { slug } = useLocalSearchParams<{ slug: string[] }>() return } ``` Le route catch-all catturano tutti i segmenti restanti dell'URL in un array. La route `/docs/getting-started/installation` produce un array `['getting-started', 'installation']` che il componente puo utilizzare per il rendering del contenuto corrispondente. ## Tipizzazione delle route per la sicurezza in fase di compilazione Uno dei problemi ricorrenti nella navigazione mobile riguarda il passaggio di route come stringhe di testo prive di qualsiasi verifica a tempo di compilazione. Expo Router risolve questa criticita con le typed routes, una funzionalita che genera automaticamente i tipi TypeScript a partire dalla struttura dei file. L'attivazione avviene nel file `app.json`: ```json { "expo": { "experiments": { "typedRoutes": true } } } ``` Una volta attivata, la prop `href` del componente `Link` e l'argomento di `router.push()` accettano esclusivamente stringhe corrispondenti a route valide: ```typescript // app/checkout.tsx import { router } from 'expo-router' function handleCheckout(cartId: string) { router.push(`/product/${cartId}`) } ``` La tipizzazione delle route funziona particolarmente bene con `useLocalSearchParams`. I tipi generati garantiscono la corrispondenza tra i nomi dei parametri nella definizione della route e quelli utilizzati dal componente, prevenendo bug sottili che si manifesterebbero soltanto durante la navigazione verso una schermata specifica. ## Schermate modali e opzioni di presentazione Le modali in Expo Router sono schermate ordinarie configurate con `presentation: 'modal'` nel layout. Questo approccio rispetta la convenzione del routing file-based: una modale rimane semplicemente una route come le altre. ```typescript // app/_layout.tsx (modal) import { Stack } from 'expo-router' export default function RootLayout() { return ( ) } ``` ```typescript // app/create-post.tsx import { View, TextInput, Button, StyleSheet } from 'react-native' import { router } from 'expo-router' import { useState } from 'react' export default function CreatePostModal() { const [title, setTitle] = useState('') const handleSubmit = () => { router.back() } return (