Expo Router Skill
Andamiaje de rutas, parámetros tipados y cableado de deep links - una Agent Skill para añadir pantallas de forma segura en Expo Router con enrutamiento basado en archivos de Expo SDK 57.
Busca en todas las páginas de la documentación
Andamiaje de rutas, parámetros tipados y cableado de deep links - una Agent Skill para añadir pantallas de forma segura en Expo Router con enrutamiento basado en archivos de Expo SDK 57.
Genera:
app/ (layouts, index, segmentos dinámicos)experiments.typedRoutes y módulos constructores de hrefapp.config.tstsc --noEmitapp/ (tabs, stacks, modals)/orders/[id] con navegación tipadamyapp:// o https:// deep links a pantallas existentesrouter.push a constructores Href centralizados| Entrada | Por qué |
|---|---|
| Mapa de rutas | Caminos, grupos (auth), tab vs stack |
| Formas de params | { id: string }, campos query opcionales |
app.config.ts | scheme, ios.bundleIdentifier, linking |
Árbol app/ existente | Evitar layouts duplicados |
| Ejemplos de deep link | myapp://orders/42, payloads de notificaciones |
app/...)app.config.tssrc/navigation/hrefs.ts (o routes.ts) con constructores tipadosnpx expo start, npx tsc --noEmitexperiments.typedRoutes: true - regenera tipos después de cada cambio en app/ (Typed Routes).href - { pathname: "/orders/[id]", params: { id } }.src/features/ (Mobile Architecture Basics)._layout providers duplicados - un límite auth/session en root.Tarjeta de referencia rápida - lista para copiar-pegar.
// app.config.ts
export default {
scheme: "myapp",
experiments: { typedRoutes: true },
} satisfies import("expo/config").ExpoConfig;// app/orders/[id].tsx
import { useLocalSearchParams } from "expo-router";
import { z } from "zod";
const paramsSchema = z.object({ id: z.string().min(1) });
export default function OrderDetailScreen() {
const raw = useLocalSearchParams<{ id: string }>();
const { id } = paramsSchema.parse(raw);
// ...
}// src/navigation/hrefs.ts
import type { Href } from "expo-router";
export const orderDetailHref = (id: string): Href => ({
pathname: "/orders/[id]",
params: { id },
});// Uso
import { Link, router } from "expo-router";
import { orderDetailHref } from "@/navigation/hrefs";
<Link href={orderDetailHref("42")}>Order 42</Link>
router.push(orderDetailHref("42"));npx expo start # regen .expo/types/router.d.ts
npx tsc --noEmit # catch invalid href at compile timeCuándo llegar a esta skill:
app/app/
├── _layout.tsx # root Stack o Slot
├── (tabs)/
│ ├── _layout.tsx
│ ├── index.tsx
│ └── orders/
│ ├── index.tsx
│ └── [id].tsx
└── (auth)/
├── _layout.tsx
└── login.tsx(tabs) no aparecen en URL - Route Groups// app/_layout.tsx
import { Stack, useRouter, useSegments } from "expo-router";
import { useEffect } from "react";
import { useSession } from "@/features/auth/session";
export default function RootLayout() {
const { session, isLoading } = useSession();
const segments = useSegments();
const router = useRouter();
useEffect(() => {
if (isLoading) return;
const inAuth = segments[0] === "(auth)";
if (!session && !inAuth) router.replace("/(auth)/login");
if (session && inAuth) router.replace("/(tabs)");
}, [session, isLoading, segments]);
return <Stack screenOptions={{ headerShown: false }} />;
}// app.config.ts
export default {
scheme: "myapp",
ios: { bundleIdentifier: "com.example.myapp" },
android: { package: "com.example.myapp" },
// Optional universal links:
// ios: { associatedDomains: ["applinks:myapp.com"] },
} satisfies import("expo/config").ExpoConfig;| URL | Resuelve a |
|---|---|
myapp://orders/42 | app/orders/[id].tsx con id=42 |
myapp://(tabs)/orders | lista de órdenes |
router.replace("/(tabs)") post-loginnpx expo start
npx tsc --noEmit
# iOS simulator deep link test
xcrun simctl openurl booted "myapp://orders/42"Usa Expo Router skill. SDK 57, typedRoutes on.
Añade /settings/notifications y /settings/profile bajo (tabs).
Proporciona constructores href y verificación tsc. Rutas delgadas - las pantallas viven en src/features/settings/.Usa Expo Router skill.
Deep link: myapp://orders/[id] desde payload push { orderId }.
Mapea a ruta tipada, valida id con Zod, documenta comando simctl test.Usa Expo Router skill.
Migra llamadas router.push("/order/" + id) a módulo Href centralizado.
Lista cada archivo a tocar y gate tsc.- [ ] Árbol app/ documentado
- [ ] experiments.typedRoutes: true en app.config.ts
- [ ] Constructores href exportados de módulo único
- [ ] Zod (o equivalente) en parámetros dinámicos
- [ ] scheme / associatedDomains si deep links requeridos
- [ ] npx tsc --noEmit en sección de verificación
- [ ] Sin lógica de negocio duplicada en archivos de rutaSí cuando se solicita - usa presentation: "modal" en opciones de layout. Mira Modal Routes para patrones de presentación SDK 57.
Parcialmente. Las uniones Href generadas cubren pathnames; los parámetros de búsqueda opcionales aún necesitan validación en tiempo de ejecución al entrar en la pantalla.
La skill debe usar el tipo Href de expo-router - funciona en web y native. La configuración de linking específica de plataforma pertenece solo a app.config.ts.
Href generadasVersiones de Stack: Esta página fue escrita para React 19.2.3, React Native 0.86.0, y Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última actualización: 16 jul 2026