Expo Router Skill
Roteamento, parâmetros tipados e links profundos - um Agent Skill para adicionar telas com segurança no Expo Router com roteamento baseado em arquivos do Expo SDK 57.
Busque em todas as páginas da documentação
Roteamento, parâmetros tipados e links profundos - um Agent Skill para adicionar telas com segurança no Expo Router com roteamento baseado em arquivos do Expo SDK 57.
Gera:
app/ (layouts, index, segmentos dinâmicos)experiments.typedRoutes e módulos de construtor de hrefapp.config.tstsc --noEmitapp/ (abas, stacks, modais)/orders/[id] com navegação tipadamyapp:// ou https:// a telas existentesrouter.push para construtores Href centralizados| Entrada | Por quê |
|---|---|
| Mapa de rotas | Caminhos, grupos (auth), aba vs stack |
| Formatos de parâmetros | { id: string }, campos de consulta opcionais |
app.config.ts | scheme, ios.bundleIdentifier, linking |
Árvore app/ existente | Evitar layouts duplicados |
| Exemplos de links profundos | myapp://orders/42, payloads de notificação |
app/...)app.config.tssrc/navigation/hrefs.ts (ou routes.ts) com construtores tipadosnpx expo start, npx tsc --noEmitexperiments.typedRoutes: true - regenere tipos após cada alteração em app/ (Typed Routes).href de objeto - { pathname: "/orders/[id]", params: { id } }.src/features/ (Mobile Architecture Basics)._layout duplicados - um limite de autenticação/sessão na raiz.Cartão de receita de referência rápida - pronto para copiar e colar.
// 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")}>Pedido 42</Link>
router.push(orderDetailHref("42"));npx expo start # regen .expo/types/router.d.ts
npx tsc --noEmit # captura href inválido em tempo de compilaçãoQuando usar este skill:
app/app/
├── _layout.tsx # Stack ou Slot raiz
├── (tabs)/
│ ├── _layout.tsx
│ ├── index.tsx
│ └── orders/
│ ├── index.tsx
│ └── [id].tsx
└── (auth)/
├── _layout.tsx
└── login.tsx(tabs) não aparecem na 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" },
// Links universais opcionais:
// ios: { associatedDomains: ["applinks:myapp.com"] },
} satisfies import("expo/config").ExpoConfig;| URL | Resolve para |
|---|---|
myapp://orders/42 | app/orders/[id].tsx com id=42 |
myapp://(tabs)/orders | lista de pedidos |
router.replace("/(tabs)") pós-loginnpx expo start
npx tsc --noEmit
# Teste de link profundo no simulador iOS
xcrun simctl openurl booted "myapp://orders/42"Use o skill Expo Router. SDK 57, typedRoutes ativado.
Adicione /settings/notifications e /settings/profile sob (tabs).
Forneça construtores de href e verificação tsc. Rotas enxutas - telas vivem em src/features/settings/.Use o skill Expo Router.
Link profundo: myapp://orders/[id] do payload de notificação { orderId }.
Mapeie para rota tipada, valide id com Zod, documente o comando de teste simctl.Use o skill Expo Router.
Migre as chamadas router.push("/order/" + id) para o módulo Href centralizado.
Liste todos os arquivos a serem tocados e o portão tsc.- [ ] Árvore app/ documentada
- [ ] experiments.typedRoutes: true em app.config.ts
- [ ] Construtores de href exportados de um único módulo
- [ ] Zod (ou equivalente) em parâmetros dinâmicos
- [ ] scheme / associatedDomains se links profundos forem necessários
- [ ] npx tsc --noEmit na seção de verificação
- [ ] Nenhuma lógica de negócios duplicada em arquivos de rotaSim, quando solicitado - use presentation: "modal" nas opções de layout. Veja Modal Routes para padrões de apresentação do SDK 57.
Parcialmente. As uniões Href geradas cobrem os pathnames; parâmetros de pesquisa opcionais ainda precisam de validação em tempo de execução na entrada da tela.
O skill deve usar o tipo Href do expo-router - funciona na web e nativo. A configuração de linking específica da plataforma pertence apenas a app.config.ts.
Href geradasVersões do Stack: Esta página foi escrita para React 19.2.3, React Native 0.86.0 e Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026