Aller au contenu principal

Anatomie d'un projet Expo

Explorer les fichiers du projet et créer le premier écran d'accueil du Quiz Cyber.

Objectifs de la séance​

  • repérer le rôle de chaque fichier du projet (app.json, package.json, tsconfig.json, src/app/...) ;
  • comprendre qu'un écran est une fonction qui renvoie du JSX ;
  • afficher du texte avec <View> et <Text>, et le mettre en forme avec StyleSheet ;
  • personnaliser le titre de l'écran et le nom de l'application.

Petite vérification​

Avant de commencer, vérifiez si vous savez...

  1. afficher la version de Node.js installée, en ligne de commandes, et vérifier qu'elle est compatible avec Expo SDK 58
  2. lancer le projet quiz-cyber-expo et l'ouvrir dans le navigateur, puis lire la phrase affichée au centre de l'écran
  3. citer la commande qui a supprimé les écrans d'exemple du modèle de projet
📌 Réponse attendue

TP pour réfléchir et résoudre des problèmes​

L'écran actuel affiche une phrase en anglais. Votre mission : le transformer en écran d'accueil du Quiz Cyber, avec un titre et une phrase de présentation. Gardez le serveur lancé (npx expo start, touche w) : chaque enregistrement met l'écran à jour immédiatement.

Étape 1 — Repérer les fichiers du projet​

Ouvrez le dossier quiz-cyber-expo dans VS Code (Fichier > Ouvrir le dossier) et observez l'arborescence. Le dossier le plus important est src/app/ : chaque fichier de ce dossier est un écran de l'application.

  • src/app/index.tsx : l'écran d'accueil (l'adresse / de l'application) ;
  • src/app/_layout.tsx : la mise en page commune à tous les écrans (la barre de titre).

Bonne pratique - Un dossier, un rôle

Le dossier src/app/ ne doit contenir que des écrans (et leurs _layout.tsx). Le reste du code (composants, fonctions, données) sera rangé dans d'autres dossiers de src/ : c'est ce qui rend un projet facile à reprendre par un autre développeur.

Étape 2 — Écrire le titre de l'écran d'accueil​

Ouvrez src/app/index.tsx. Remplacez son contenu par le code ci-dessous, en complétant la ligne qui affiche le titre Quiz Cyber avec le style styles.titre :


Bonne pratique - Nommer ses composants clairement

Le modèle appelait la fonction Index. En la renommant Accueil, son rôle devient évident pour quiconque lit le code. Le nom du fichier (index.tsx), lui, ne change pas : c'est lui qui détermine l'adresse de l'écran.

Étape 3 — Mettre le titre en forme avec StyleSheet​

Sous la fonction Accueil, ajoutez l'objet styles. Complétez la ligne qui met le titre en gras :


Bonne pratique - Regrouper les styles en bas du fichier

Écrire les styles dans un seul StyleSheet.create({...}) en bas du fichier, plutôt que directement dans chaque balise, garde le JSX lisible et permet de réutiliser un même style plusieurs fois.

Étape 4 — Changer le titre de la barre en haut de l'écran​

La barre en haut de l'écran affiche « index » : c'est le nom du fichier. Ouvrez src/app/_layout.tsx et donnez un titre à tous les écrans de la pile (Stack) :


Bonne pratique - Les doubles accolades

Dans screenOptions={{ title: "Quiz Cyber" }}, la première paire d'accolades signifie « ici, du JavaScript », la seconde crée un objet. Cette écriture reviendra très souvent, notamment pour les styles.

Étape 5 — Renommer l'application​

Ouvrez app.json : c'est la configuration de l'application (nom, icône, écran de démarrage...). Remplacez la valeur de "name" par "Quiz Cyber" : c'est le nom affiché sous l'icône de l'application sur le téléphone. Ne modifiez pas "slug", qui sert d'identifiant technique.


Bonne pratique - Ne pas confondre nom et identifiant

Le nom (name) peut contenir des espaces et des accents : il est fait pour les humains. L'identifiant (slug) reste en minuscules, sans espace : il est utilisé par les outils d'Expo.

Résultat attendu dans le navigateur :

L&#39;écran d&#39;accueil du Quiz Cyber

📌 Une solution

Notions théoriques​

Les fichiers du projet​

Fichier ou dossierRôle
src/app/les écrans : chaque fichier devient une adresse (index.tsx = /)
src/app/_layout.tsxla mise en page commune aux écrans (ici une pile d'écrans)
assets/les images : icône, écran de démarrage (splash screen)...
app.jsonla configuration de l'application : nom, icône, couleurs, extensions
package.jsonla liste des dépendances et les scripts (npm run ...)
package-lock.jsonles versions exactes installées (à ne jamais modifier à la main)
tsconfig.jsonla configuration de TypeScript (et l'alias @/ vers src/)
node_modules/le code des bibliothèques installées (jamais modifié, jamais versionné)
.gitignorela liste des fichiers que Git doit ignorer
L'alias @/

Dans tsconfig.json, la ligne "@/*": ["./src/*"] permet d'écrire import ... from "@/components/Bouton" au lieu de import ... from "../../components/Bouton", où que l'on soit dans le projet. Vous l'utiliserez dès le prochain tutoriel.

Un écran est une fonction qui renvoie du JSX​

export default function Accueil() {
return (
<View>
<Text>Bonjour</Text>
</View>
);
}
  • c'est une fonction JavaScript dont le nom commence par une majuscule : un composant ;
  • elle renvoie du JSX : une syntaxe qui ressemble à du HTML, écrite dans du JavaScript ;
  • export default rend la fonction utilisable par Expo Router, qui l'affiche comme écran.

Les fichiers qui contiennent du JSX ont l'extension .tsx (TypeScript + JSX).

View et Text : les deux composants de base​

  • <View> est un conteneur (comme une <div>) : il regroupe et dispose d'autres composants ;
  • <Text> affiche du texte.
Tout texte doit être dans un Text

En React Native, un texte écrit directement dans une <View> provoque une erreur (« Text strings must be rendered within a <Text> component »). Contrairement au HTML, on ne peut pas écrire de texte « nu » : il faut toujours l'entourer d'un <Text>.

StyleSheet : la mise en forme​

Il n'y a pas de fichier CSS en React Native. Les styles sont des objets JavaScript :

  • les propriétés s'écrivent en camelCase : font-size devient fontSize ;
  • les tailles sont des nombres sans unité (fontSize: 32), exprimés en points indépendants de l'écran ;
  • StyleSheet.create({...}) regroupe les styles et vérifie leurs noms ;
  • un composant reçoit son style par l'attribut style={styles.titre}.
CSSReact Native
font-size: 32px;fontSize: 32
font-weight: bold;fontWeight: "bold"
background-color: #fff;backgroundColor: "#fff"
text-align: center;textAlign: "center"

La mise en page (centrer, aligner, répartir) utilise Flexbox, que vous étudierez en détail au tutoriel 3. Retenez pour l'instant que flex: 1 fait occuper tout l'espace disponible à la View, et que alignItems: "center" et justifyContent: "center" centrent son contenu.

La pile d'écrans (Stack)​

Le fichier _layout.tsx renvoie un composant <Stack> (une pile) : chaque nouvel écran ouvert se pose au-dessus du précédent, et le bouton « retour » le retire de la pile, comme une pile d'assiettes. screenOptions règle les options communes à tous les écrans de la pile, par exemple leur titre.


Test de mémorisation/compréhension​


Quel fichier correspond à l'écran d'accueil (l'adresse /) de l'application ?


Comment s'écrit la propriété CSS font-size dans un StyleSheet ?


Que se passe-t-il si l'on écrit du texte directement dans une View, sans Text ?


À quoi sert le fichier app.json ?


Que permet l'alias @/ défini dans tsconfig.json ?


Dans _layout.tsx, que fait screenOptions={{ title: "Quiz Cyber" }} sur le composant Stack ?



Exercices complémentaires​

Exercice A : une couleur pour le titre​

Ajoutez au style titre la propriété color avec la valeur "#1F5FBF" (bleu). Vérifiez le résultat dans le navigateur.

Exercice B : une phrase en italique​

Créez un style sousTitre qui met la phrase « Testez vos connaissances en cybersécurité ! » en italique (fontStyle: "italic") et en taille 18, puis appliquez-le au deuxième <Text>.


Ce qu'il faut retenir​

NotionRésumé
src/app/Chaque fichier de ce dossier est un écran ; index.tsx est l'écran d'accueil.
_layout.tsxDéfinit la mise en page commune (ici une pile d'écrans Stack).
app.jsonConfiguration de l'application : nom affiché, icône, extensions.
ComposantFonction dont le nom commence par une majuscule et qui renvoie du JSX.
<View> / <Text>Conteneur et texte ; tout texte doit être dans un <Text>.
StyleSheetStyles écrits en objets JavaScript, propriétés en camelCase, nombres sans unité.

Aperçu de la prochaine séance​

Votre écran d'accueil existe, mais il n'est enregistré que sur votre ordinateur : une panne de disque, et tout est perdu. Dans la prochaine séance, vous allez versionner votre projet avec Git et le publier sur GitHub, comme le font tous les développeurs professionnels.