expo/expo-router

Framework (OSS). Navigation et routage pour Expo Router. Couvre les routes basées sur fichiers, les groupes et routes dynamiques, l'organisation des dossiers, les liens avec aperçus et menus contextuels, la Stack native, les titres de pages, les modales et form sheets, NativeTabs, en-têtes et barres d'outils, et les barres de recherche dans les en-têtes.

Qu'est-ce que expo-router ?

Cette compétence fournit des directives complètes pour la navigation et le routage dans les applications Expo Router, en se concentrant sur les routes basées sur fichiers, les groupes, les routes dynamiques et l'organisation des dossiers. Elle couvre l'utilisation des composants `Link` avec aperçus et menus contextuels, la configuration des piles de navigation natives (`Stack`), la présentation de modales et de feuilles de formulaire (`formSheet`), ainsi que la mise en place des onglets natifs (`NativeTabs`). Les développeurs peuvent également configurer les titres de page, les barres d'outils et les barres de recherche dans les en-têtes. La compétence est conçue pour l'écosystème Expo et recommande l'utilisation de chemins en kebab-case, l'évitement des importations directes depuis `@react-navigation/*` au profit de `expo-router/react-navigation`, et l'usage de `Color` depuis `expo-router` pour les couleurs sémantiques natives. Elle inclut des références détaillées sur la structure des routes, les onglets, les barres d'outils, les feuilles de formulaire et la recherche.

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

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Navigation Expo Router

Navigation et routage pour les applications Expo Router. Pour le style d'écran, les couleurs, les contrôles, les médias et les effets visuels, utilisez la compétence expo-native-ui ; pour les animations et les gestes, utilisez expo-animation.

Références

Consultez ces ressources selon vos besoins :

references/
  route-structure.md     Conventions de route, routes dynamiques, groupes, organisation des dossiers
  tabs.md                NativeTabs, migration depuis les onglets JS, fonctionnalités iOS 26
  toolbar-and-headers.md En-têtes Stack et boutons de barre d'outils, menus, recherche (iOS uniquement)
  form-sheet.md          Feuilles de formulaire dans expo-router : configuration, pieds de page et interaction avec l'arrière-plan.
  search.md              Barre de recherche avec en-têtes, hook useSearch, modèles de filtrage
  zoom-transitions.md    Apple Zoom : transitions de zoom fluides avec Link.AppleZoom (iOS 18+)

Style de code

  • Utilisez toujours le kebab-case pour les noms de fichiers, ex. comment-card.tsx
  • Supprimez toujours les anciens fichiers de route lors du déplacement ou de la restructuration de la navigation
  • N'utilisez jamais de caractères spéciaux dans les noms de fichiers
  • Configurez tsconfig.json avec des alias de chemin, et préférez les alias aux importations relatives pour les refontes.

Routes

Voir ./references/route-structure.md pour les conventions détaillées sur les routes.

  • Les routes appartiennent au répertoire app.
  • Ne co-localisez jamais de composants, types ou utilitaires dans le répertoire app. C'est un anti-patron.
  • Assurez-vous que l'application a toujours une route qui correspond à "/", elle peut être à l'intérieur d'une route de groupe.

Préférences de bibliothèque

  • Color depuis expo-router pour les couleurs sémantiques natives, pas PlatformColor brut (type-safe, s'adapte automatiquement au mode clair/sombre). Voir expo-native-ui pour le modèle de palette de couleurs complet.
  • Dans SDK 56+, n'importez jamais depuis @react-navigation/* directement — utilisez expo-router/react-navigation à la place (couvre @react-navigation/native, /core, /elements, /routers).

Comportement

  • Préférez Stack.SearchBar pour ajouter une barre de recherche à un écran.

Navigation

Link

Utilisez <Link href="/path" /> depuis 'expo-router' pour la navigation entre les routes.

import { Link } from 'expo-router';

// Lien basique
<Link href="/path" />

// Pour envelopper des composants personnalisés
<Link href="/path" asChild>
  <Pressable>...</Pressable>
</Link>

Dans la mesure du possible, incluez un <Link.Preview> pour suivre les conventions iOS. Ajoutez fréquemment des menus contextuels et des aperçus pour améliorer la navigation.

Stack

  • Utilisez TOUJOURS des fichiers _layout.tsx pour définir les piles.
  • Utilisez Stack depuis 'expo-router/stack' pour les piles de navigation natives.

Titre de page

Définissez le titre de la page avec Stack.Title :

<Stack.Title>Accueil</Stack.Title>

Menus contextuels

Ajoutez des menus contextuels par appui long aux composants Link :

import { Link } from "expo-router";

<Link href="/parametres" asChild>
  <Link.Trigger>
    <Pressable>
      <Card />
    </Pressable>
  </Link.Trigger>
  <Link.Menu>
    <Link.MenuAction
      title="Partager"
      icon="square.and.arrow.up"
      onPress={handleSharePress}
    />
    <Link.MenuAction
      title="Bloquer"
      icon="nosign"
      destructive
      onPress={handleBlockPress}
    />
    <Link.Menu title="Plus" icon="ellipsis">
      <Link.MenuAction title="Copier" icon="doc.on.doc" onPress={() => {}} />
      <Link.MenuAction
        title="Supprimer"
        icon="trash"
        destructive
        onPress={() => {}}
      />
    </Link.Menu>
  </Link.Menu>
</Link>;

Aperçus de liens

Utilisez fréquemment les aperçus de liens pour améliorer la navigation :

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

L'aperçu de lien peut être utilisé avec des menus contextuels.

Modal

Présentez un écran en tant que modal :

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

Préférez cette approche à la construction d'un composant modal personnalisé.

Sheet

Présentez un écran en tant que feuille de formulaire dynamique :

<Stack.Screen
  name="sheet"
  options={{
    presentation: "formSheet",
    sheetGrabberVisible: true,
    sheetAllowedDetents: [0.5, 1.0],
    contentStyle: { backgroundColor: "transparent" },
  }}
/>
  • L'utilisation de contentStyle: { backgroundColor: "transparent" } rend l'arrière-plan en verre liquide sur iOS 26+.

Structure de route courante

Une disposition d'application standard avec des onglets et des piles à l'intérieur de chaque onglet :

app/
  _layout.tsx — <NativeTabs />
  (index,recherche)/
    _layout.tsx — <Stack />
    index.tsx — Liste principale
    recherche.tsx — Vue de recherche
// 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>Éléments</NativeTabs.Trigger.Label>
        </NativeTabs.Trigger>
        <NativeTabs.Trigger name="(recherche)" role="search" />
      </NativeTabs>
    </ThemeProvider>
  );
}

Créez une route de groupe partagée afin que les deux onglets puissent pousser des écrans communs :

// app/(index,recherche)/_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: "Éléments", recherche: "Recherche" };

  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 est le nom de l'option dans SDK 56+ ; les SDK plus anciens utilisent headerLargeTitle, qui est obsolète en amont.

Soumettre un retour

Si vous rencontrez des erreurs, des informations trompeuses ou obsolètes dans cette compétence, signalez-les pour qu'Expo puisse s'améliorer :

npx --yes submit-expo-feedback@latest --category skills --subject "expo-router" "<retour actionnable>"

Ne soumettez que lorsque vous avez quelque chose de spécifique et actionnable à signaler. Incluez autant de contexte pertinent que possible. Si un agent IA a échoué à plusieurs reprises ou si l'utilisateur a dû reprendre une tâche Expo, chargez la compétence expo-skill-feedback et suivez son flux d'évaluation de candidat au lieu de réutiliser la commande ci-dessus.

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.

Skills associés