expo/expo-router

Framework (código aberto). Navegação e roteamento para Expo Router. Abrange rotas baseadas em arquivos, grupos e rotas dinâmicas, organização de pastas, Link com pré-visualizações e menus de contexto, Stack nativo, títulos de página, modais e form sheets, NativeTabs, cabeçalhos e barras de ferramentas, e barras de pesquisa no cabeçalho.

O que é expo-router?

A skill **expo/expo-router** fornece as diretrizes e padrões para construir navegação nativa em aplicações Expo usando o sistema de roteamento baseado em arquivos do Expo Router. Ela abrange desde conceitos fundamentais como rotas dinâmicas, grupos e organização de pastas, até componentes avançados de interface como `Link` com pré-visualizações (Preview) e menus de contexto (Menu), pilhas de navegação com `Stack`, `NativeTabs` para abas nativas, modais, form sheets dinâmicos e barras de pesquisa no cabeçalho. A skill enfatiza boas práticas como usar kebab-case para nomes de arquivos, evitar a co-localização de componentes na pasta `app`, e preferir `expo-router/react-navigation` em vez de importações diretas do `@react-navigation` (a partir do SDK 56). Ela também faz referência a skills complementares como `expo-native-ui` para estilização e `expo-animation` para animações, garantindo uma abordagem modular e organizada para o desenvolvimento de interfaces nativas no ecossistema Expo.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/expo/skills/tree/main/plugins/expo/skills/expo-router

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Navegação com Expo Router

Navegação e roteamento para aplicativos Expo Router. Para estilização de tela, cores, controles, mídia e efeitos visuais, use a skill expo-native-ui; para movimento e gestos, use expo-animation.

Referências

Consulte estes recursos conforme necessário:

references/
  route-structure.md     Convenções de rota, rotas dinâmicas, grupos, organização de pastas
  tabs.md                NativeTabs, migração de abas JS, recursos do iOS 26
  toolbar-and-headers.md Cabeçalhos Stack e botões de barra de ferramentas, menus, pesquisa (somente iOS)
  form-sheet.md          Form sheets no expo-router: configuração, rodapés e interação de fundo.
  search.md              Barra de pesquisa com cabeçalhos, hook useSearch, padrões de filtragem
  zoom-transitions.md    Zoom da Apple: transições fluidas com Link.AppleZoom (iOS 18+)

Estilo de Código

  • Use sempre kebab-case para nomes de arquivos, ex.: comment-card.tsx
  • Sempre remova arquivos de rota antigos ao mover ou reestruturar a navegação
  • Nunca use caracteres especiais em nomes de arquivos
  • Configure tsconfig.json com aliases de caminho e prefira aliases em vez de imports relativos para refatorações.

Rotas

Consulte ./references/route-structure.md para convenções detalhadas de rota.

  • As rotas pertencem ao diretório app.
  • Nunca co-localize componentes, tipos ou utilitários no diretório app. Isso é um antipadrão.
  • Garanta que o app sempre tenha uma rota que corresponda a "/", ela pode estar dentro de uma rota de grupo.

Preferências de Biblioteca

  • Color do expo-router para cores semânticas nativas, não PlatformColor bruto (type-safe, adapta-se automaticamente a claro/escuro). Consulte expo-native-ui para o padrão completo de paleta de cores.
  • No SDK 56+, nunca importe diretamente de @react-navigation/* — use expo-router/react-navigation (cobre @react-navigation/native, /core, /elements, /routers)

Comportamento

  • Prefira Stack.SearchBar para adicionar uma barra de pesquisa a uma tela

Navegação

Link

Use <Link href="/path" /> de 'expo-router' para navegação entre rotas.

import { Link } from 'expo-router';

// Link básico
<Link href="/path" />

// Encapsulando componentes personalizados
<Link href="/path" asChild>
  <Pressable>...</Pressable>
</Link>

Sempre que possível, inclua um <Link.Preview> para seguir as convenções do iOS. Adicione menus de contexto e pré-visualizações frequentemente para melhorar a navegação.

Stack

  • Use SEMPRE arquivos _layout.tsx para definir stacks
  • Use Stack de 'expo-router/stack' para pilhas de navegação nativas

Título da Página

Defina o título da página com Stack.Title:

<Stack.Title>Início</Stack.Title>

Menus de Contexto

Adicione menus de contexto de pressão longa a componentes Link:

import { Link } from "expo-router";

<Link href="/configuracoes" asChild>
  <Link.Trigger>
    <Pressable>
      <Card />
    </Pressable>
  </Link.Trigger>
  <Link.Menu>
    <Link.MenuAction
      title="Compartilhar"
      icon="square.and.arrow.up"
      onPress={handleCompartilharPress}
    />
    <Link.MenuAction
      title="Bloquear"
      icon="nosign"
      destructive
      onPress={handleBloquearPress}
    />
    <Link.Menu title="Mais" icon="ellipsis">
      <Link.MenuAction title="Copiar" icon="doc.on.doc" onPress={() => {}} />
      <Link.MenuAction
        title="Excluir"
        icon="trash"
        destructive
        onPress={() => {}}
      />
    </Link.Menu>
  </Link.Menu>
</Link>;

Pré-visualizações de Link

Use pré-visualizações de link frequentemente para melhorar a navegação:

<Link href="/configuracoes">
  <Link.Trigger>
    <Pressable>
      <Card />
    </Pressable>
  </Link.Trigger>
  <Link.Preview />
</Link>

A pré-visualização de link pode ser usada com menus de contexto.

Modal

Apresente uma tela como modal:

<Stack.Screen name="modal" options={{ presentation: "modal" }} />

Prefira isso em vez de construir um componente modal personalizado.

Sheet

Apresente uma tela como um form sheet dinâmico:

<Stack.Screen
  name="sheet"
  options={{
    presentation: "formSheet",
    sheetGrabberVisible: true,
    sheetAllowedDetents: [0.5, 1.0],
    contentStyle: { backgroundColor: "transparent" },
  }}
/>
  • Usar contentStyle: { backgroundColor: "transparent" } torna o fundo vidro líquido no iOS 26+.

Estrutura de Rota Comum

Um layout de aplicativo padrão com abas e stacks dentro de cada aba:

app/
  _layout.tsx — <NativeTabs />
  (index,search)/
    _layout.tsx — <Stack />
    index.tsx — Lista principal
    search.tsx — Visualização de pesquisa
// app/_layout.tsx
import { NativeTabs } from "expo-router/unstable-native-tabs";
import { ThemeProvider, DarkTheme, DefaultTheme } from "expo-router/react-navigation";
import { useColorScheme } from "react-native";

export default function Layout() {
  const colorScheme = useColorScheme();
  return (
    <ThemeProvider value={colorScheme === "dark" ? DarkTheme : DefaultTheme}>
      <NativeTabs>
        <NativeTabs.Trigger name="(index)">
          <NativeTabs.Trigger.Icon sf="list.dash" md="list" />
          <NativeTabs.Trigger.Label>Itens</NativeTabs.Trigger.Label>
        </NativeTabs.Trigger>
        <NativeTabs.Trigger name="(search)" role="search" />
      </NativeTabs>
    </ThemeProvider>
  );
}

Crie uma rota de grupo compartilhada para que ambas as abas possam empurrar telas comuns:

// app/(index,search)/_layout.tsx
import { Stack } from "expo-router/stack";
import { colors } from "@/theme/colors";

export default function Layout({ segment }) {
  const screen = segment.match(/\((.*)\)/)?.[1]!;
  const titles: Record<string, string> = { index: "Itens", search: "Pesquisa" };

  return (
    <Stack
      screenOptions={{
        headerTransparent: true,
        headerShadowVisible: false,
        headerLargeTitleShadowVisible: false,
        headerLargeStyle: { backgroundColor: "transparent" },
        headerTitleStyle: { color: colors.label },
        headerLargeTitleEnabled: true,
        headerBlurEffect: "none",
        headerBackButtonDisplayMode: "minimal",
      }}
    >
      <Stack.Screen name={screen} options={{ title: titles[screen] }} />
      <Stack.Screen name="i/[id]" options={{ headerLargeTitleEnabled: false }} />
    </Stack>
  );
}

headerLargeTitleEnabled é o nome da opção no SDK 56+; SDKs mais antigos usam headerLargeTitle, que está obsoleto upstream.

Enviando Feedback

Se você encontrar erros, informações enganosas ou desatualizadas nesta skill, reporte para que a Expo possa melhorar:

npx --yes submit-expo-feedback@latest --category skills --subject "expo-router" "<feedback acionável>"

Envie apenas quando tiver algo específico e acionável para reportar. Inclua o máximo de contexto relevante possível. Se um agente de IA falhou repetidamente ou o usuário teve que assumir uma tarefa do Expo, carregue a skill expo-skill-feedback e siga o fluxo de avaliação de candidato em vez de reutilizar o comando acima.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

expo/add-app-clip

Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.

expo/building-native-ui

Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.

expo/eas-update-insights

Check the health of published EAS Updates: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per channel. Use when the user asks how an update is performing, whether a rollout is healthy, how many users are on the embedded build vs OTA, or wants to gate CI on update health.

expo/expo-api-routes

Guidelines for creating API routes in Expo Router with EAS Hosting

expo/expo-brownfield

Integrate Expo and React Native into an existing native iOS or Android app. Use when the user mentions brownfield, embedding React Native in a native app, AAR/XCFramework, or adding Expo to an existing Kotlin/Swift project. Covers both the isolated approach and the integrated approach.

expo/expo-cicd-workflows

Helps understand and write EAS workflow YAML files for Expo projects. Use this skill when the user asks about CI/CD or workflows in an Expo or EAS context, mentions .eas/workflows/, or wants help with EAS build pipelines or deployment automation.

expo/expo-deployment

Deploying Expo apps to iOS App Store, Android Play Store, web hosting, and API routes

expo/expo-dev-client

Build and distribute Expo development clients locally or via TestFlight

expo/expo-examples

Framework (OSS). Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia, NativeWind, and more). Use when integrating a third-party library or service into an existing Expo app and you want the canonical, version-matched pattern to adapt, or when scaffolding a new project from one with `npx create-expo --example`.

expo/expo-module

Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript). Covers module definition DSL, native views, shared objects, config plugins, lifecycle hooks, autolinking, and type system. Use when building or modifying native modules for Expo.

expo/expo-observe

Use for anything related to EAS Observe — adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive, the useObserve hook, and the Expo Router / React Navigation integrations for per-route metrics), querying via the EAS CLI (`eas observe:metrics-summary`, `observe:metrics`, `observe:routes`, `observe:events`, `observe:versions`), or interpreting the resulting metrics (cold/warm launch, TTR, TTI, navigation cold/warm TTR, update download, and the TTI frameRate params for triaging slow startups).

expo/expo-overview

Framework (OSS). Entry point and router for every Expo or EAS task. Load this skill first — before writing code and before choosing another expo-* / eas-* skill — when the request, PRD, or spec mentions Expo, EAS, Expo Go, or an expo-* package, or the project has an `expo` dependency in `package.json`. Within that gate it also covers app specs and designs to implement (tabs, stacks, maps, lists, navigation, building from a screenshot), and phrasings like 'implement a mobile app', 'make my app look native', 'add navigation', 'fetch some data', 'upgrade my SDK', 'add Expo to my existing native app', 'ship to the App Store', or 'I'm new to Expo, where do I start'. A fully specified request (SDK pinned, libraries named, layout given) still routes through here — the shared setup rules still apply. Do NOT load it when neither signal is present: a bare React Native project with no `expo` dependency is not Expo work. Detects the real goal, routes to the right expo-* / eas-* skill, and owns the shared setup rules.

expo/expo-skill-eval

Evaluate Expo skills in this repo end-to-end - trigger accuracy, generated code quality, and runtime screenshots on iOS simulator and Android emulator via Expo Go (web optional). Use when the user wants to eval an Expo skill, test that a skill produces working code, benchmark a skill with device screenshots, or verify a skill's output renders correctly.

expo/expo-tailwind-setup

Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling

expo/expo-ui

Framework (OSS). Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android. Default to @expo/ui for sheets (BottomSheet), pickers, sliders, toggles, menus, and grouped-form sections — do NOT reach for Reanimated, @gorhom/bottom-sheet, or RN built-in Picker/Switch; use @expo/ui instead. Fall back to RN built-ins only when @expo/ui is missing the component. NOTE: @expo/ui List renders native grouped rows like an iOS Settings screen — it is NOT a virtualized list; use FlatList/FlashList for large datasets. Covers universal components (Host, Column, Row, Button, Text, List, BottomSheet, FieldGroup, Switch, Slider, Picker, Menu), drop-in replacements for RN community libraries, and platform-specific SwiftUI/Jetpack Compose trees. Not for Expo Router navigation, Reanimated, or data fetching.

expo/expo-ui-jetpack-compose

`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.

expo/expo-ui-swiftui

`@expo/ui/swift-ui` package lets you use SwiftUI Views and modifiers in your app.

expo/expo-upgrade

Framework (OSS). Guidelines for upgrading Expo SDK versions and fixing dependency issues

expo/native-data-fetching

Use when implementing or debugging ANY network request, API call, or data fetching. Covers fetch API, React Query, SWR, error handling, caching, offline support, and Expo Router data loaders (`useLoaderData`).

expo/skills

Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play. Supports Expo and other React Native projects, plus existing native apps. Use for eas.json setup, release pipelines, signing, app versions and build numbers, store submissions, and listing metadata. For Expo websites and API routes, use eas-hosting; for adding React Native screens to a native app, use expo-brownfield.

Habilidades Relacionadas