Le parcours
Huit étapes, de la page blanche à l'application finie. Les durées sont indicatives, elles servent surtout à repérer quand tu es en train de t'enliser.
Coche au fur et à mesure
Chaque étape se termine par les critères « comment tu sais que c'est bon ». Coche-les quand tu les as vraiment vérifiés : ils restent enregistrés dans ce navigateur, et ils font un point de départ parfait quand ton encadrant passe te voir.
Mise en place
30 minObjectif : une page blanche qui s'affiche, avec les trois fichiers correctement reliés entre eux.
À faire
- Crée ton dossier de travail et tes trois fichiers (
.html,.css,.js). À toi de choisir les noms et l'organisation. - Écris le squelette HTML minimal, puis relie la feuille de style et le script.
- Ouvre la page dans le navigateur, puis la console (F12).
- Vérifie que les trois fichiers sont bien chargés : un texte visible dans le HTML, une couleur de fond dans le CSS, un
console.logdans le JS.
Piège classique
Une balise <script> placée dans le <head>
s'exécute avant que le HTML n'existe. Cherche « où placer la balise
script », et comprends pourquoi la réponse est ce qu'elle
est, ne te contente pas de la déplacer.
Comment tu sais que c'est bon
Ressources
La structure de la page
1 hObjectif : tout le HTML de l'application, sans une seule ligne de JavaScript.
À faire
Écris le HTML de : un titre, un formulaire de recherche (un champ texte et un bouton), et une zone vide destinée à recevoir le résultat.
Questions à te poser
Ce sont elles qui font la différence entre du HTML et du bon HTML.
- Pourquoi un
<form>plutôt qu'un simple<input>et un<div>cliquable ? - Comment un utilisateur qui n'a pas de souris valide-t-il ta recherche ?
- Un champ de saisie sans
<label>: qu'est-ce que ça change pour quelqu'un qui utilise un lecteur d'écran ? - Le navigateur peut-il refuser tout seul une saisie vide ou trop courte, sans JavaScript ?
Comment tu sais que c'est bon
Ressources
Le style
45 min, timeboxéObjectif : que ce soit propre et lisible. Pas beau. Propre.
Mets un minuteur à 45 minutes
C'est l'étape où l'on perd le plus facilement une demi-journée. Si tu n'as pas fini au bout de 45 minutes, tu passes à la suite quand même : tu reviendras peaufiner en fin de journée s'il te reste du temps.
À faire
Centre le contenu, donne-lui une largeur maximale, aère (marges, espacements), choisis une palette de trois ou quatre couleurs maximum, et prévois des styles pour les quatre états du résultat : accueil, chargement, erreur, succès.
Questions à te poser
- Comment centrer un bloc horizontalement dans la page ? (il y a plusieurs réponses, et elles ne se valent pas)
- Comment aligner ton champ et ton bouton côte à côte ?
- Est-ce que ton bouton a l'air cliquable au survol ?
- Voit-on clairement où est le focus quand on navigue au clavier ?
Comment tu sais que c'est bon
Ressources
Comprendre l'API avant de coder
45 minObjectif : savoir exactement quelles données tu vas recevoir, et où elles se trouvent. Zéro ligne de code à cette étape.
Il te faut deux appels successifs : l'API météo ne comprend pas les noms de ville, elle ne parle qu'en coordonnées GPS.
À faire
- Sur la doc du géocodage, construis l'URL qui cherche la ville « Rodez », limitée à 1 résultat, en français. Colle-la dans ton navigateur.
- Sur la doc météo, la page génère une URL en bas quand tu coches des options. Coche les variables current : température à 2 m, code météo, vitesse du vent à 10 m, humidité relative. Récupère l'URL générée, remplace les coordonnées par celles de Rodez, colle-la dans ton navigateur.
- Regarde les deux JSON obtenus. Ils n'ont pas du tout la même forme : l'un renvoie un tableau de résultats, l'autre un objet unique.
-
Écris noir sur blanc, dans ton journal, le chemin exact
pour atteindre la latitude dans le premier JSON et la température dans
le second. Quelque chose comme
truc.machin[0].bidule. - Cherche dans la doc météo le tableau « WMO Weather interpretation codes ». La météo n'est pas renvoyée en toutes lettres mais sous forme d'un nombre : tu devras traduire ces nombres en texte et en pictogramme.
Comment tu sais que c'est bon
Ressources
- Qu'est-ce que le JSONMDN
- API de géocodageOpen-Meteo
- API météo et codes WMOOpen-Meteo
Ton premier appel réseau : le géocodage
1 h 15Objectif : une fonction qui prend un nom de ville et renvoie ses coordonnées : testée dans la console avant d'être branchée à la page.
À faire
Écris une fonction dédiée qui :
- construit l'URL avec ses paramètres ;
- appelle l'API ;
- vérifie que la réponse est bien un succès avant de l'exploiter ;
- transforme la réponse en objet JavaScript ;
- renvoie un objet simple et propre (nom, pays, latitude, longitude), ou une valeur signalant clairement « ville introuvable ».
Notions à aller chercher, dans cet ordre
fetch()ne renvoie pas des données mais une promesse : comprends ce mot avant d'écrire quoi que ce soit.async/await: le moyen d'attendre une promesse sans s'arracher les cheveux.- Il y a deux attentes successives dans un appel
fetch: l'arrivée de la réponse, puis la lecture de son contenu. Beaucoup d'erreurs de débutant viennent d'en oublier une. - Une réponse reçue n'est pas forcément une réponse réussie : une erreur 404 est une réponse parfaitement reçue.
- Pour construire ton URL, préfère l'objet
URLà la concaténation de chaînes, et cherche pourquoi. Indice : « Saint-Étienne », et l'espace dans « Le Mans ».
Comment tu sais que c'est bon
Dans la console du navigateur, tu appelles ta fonction à la main :
Ressources
- Utiliser fetchMDN
- Référence de fetch()MDN
- Les promessesMDN
- asyncMDN
- awaitMDN
- response.okMDN
- response.json()MDN
- Construire une URL proprementMDN
- Les paramètres d'URLMDN
Deuxième appel : la météo
30 minObjectif : une deuxième fonction, qui prend une latitude et une longitude et renvoie les conditions actuelles.
C'est le même exercice que l'étape 4, en plus court. Si tu y passes une heure, c'est que l'étape 4 n'était pas comprise : relis-la plutôt que d'avancer.
Question à te poser
Tes deux fonctions se ressemblent beaucoup. Y a-t-il quelque chose à mettre en commun ? Attention, parfois la réponse est non. Sache justifier ton choix, quel qu'il soit.
Comment tu sais que c'est bon
Brancher le formulaire
1 hObjectif : que ça marche pour de vrai, depuis la page.
À faire
Écoute la validation du formulaire, et enchaîne : afficher le chargement → chercher la ville → si elle n'existe pas, afficher l'erreur et s'arrêter là → sinon chercher la météo → afficher le résultat. Et prévois le cas où tout part en vrille : réseau coupé, API en panne.
Points d'attention
- Par défaut, valider un formulaire recharge la page. Il faut l'en empêcher.
- Pendant le chargement, un utilisateur impatient peut cliquer cinq fois. Que se passe-t-il ? Regarde l'onglet Réseau pendant que tu spammes le bouton.
- « La ville n'existe pas » et « le réseau est coupé » sont deux erreurs différentes et méritent deux messages différents. La première est prévisible et normale ; la seconde est accidentelle.
- L'utilisateur voit un message compréhensible ; toi, tu veux le détail technique en console pour déboguer. Les deux, pas l'un ou l'autre.
Comment tu sais que c'est bon
Teste les quatre cas, dans cet ordre :
Ressources
Afficher le résultat
1 hObjectif : la carte météo, avec le bon pictogramme.
À faire
- Construis ta table de correspondance entre les codes météo WMO et un couple « libellé en français + pictogramme ». Mets-en au moins une douzaine, en couvrant les cas courants : dégagé, nuageux, brouillard, pluie, neige, averses, orage.
- Génère le HTML de la carte et injecte-le dans ta zone de résultat.
- Prévois le cas où l'API renvoie un code que tu n'as pas dans ta table. Ça arrivera. L'application ne doit ni planter ni afficher « undefined ».
Questions à te poser
- La température brute ressemble à
18.7. Est-ce ce que tu veux afficher ? - Ta zone de résultat contient déjà quelque chose (l'état précédent). Que devient-il quand tu écris le nouveau contenu ?
La question la plus importante de la journée
Tu insères dans ta page du texte qui vient d'un serveur externe.
Que se passerait-il si le nom d'une ville contenait des balises
HTML ? Cherche « XSS », et regarde la différence entre
innerHTML et textContent. Ce réflexe-là, on
l'attend de toi sur tous les projets : c'est probablement ce que tu
retiendras de plus utile aujourd'hui.
Comment tu sais que c'est bon
Ressources
Relecture
30 min, ne la saute pasObjectif : relire ton propre code comme si c'était celui de quelqu'un d'autre.
- Reste-t-il des
console.logde débogage ? Du code commenté ? Des variables inutilisées ? - Tes noms de variables et de fonctions se comprennent-ils sans lire leur contenu ? (
data2,x,truc→ à renommer) - As-tu des morceaux copiés-collés à trois endroits ?
- Tes commentaires expliquent-ils pourquoi, ou juste ce que le code dit déjà ?
- Reprends tous les critères des étapes précédentes et refais-les une dernière fois : tu as beaucoup modifié depuis.
Le test final
Ouvre ton fichier JS et prends une ligne au hasard. Tu sais l'expliquer ? Recommence cinq fois. Toute ligne que tu n'expliques pas est une ligne à comprendre, ou à supprimer.
Comment tu sais que c'est bon
Bonus
Seulement si tout le reste est fini et relu. Du plus simple au plus ambitieux : un bonus bien fait et bien compris vaut mieux que trois bâclés.
1. °C / °F
Un bouton pour basculer d'unité. Piège : vaut-il mieux convertir toi-même ou refaire un appel réseau ? Regarde d'abord si l'API sait le faire toute seule.
2. Historique
Mémorise les cinq dernières villes cherchées et affiche-les en boutons de
raccourci. Elles doivent survivre à un rechargement de la page.
localStorageMDN
3. Prévisions
Affiche aussi les trois prochains jours. La doc Open-Meteo a un bloc
daily à côté du bloc current.
4. Géolocalisation
Propose la météo de la position actuelle de l'utilisateur. Attention :
c'est une permission, elle peut être refusée : que se passe-t-il alors ?
Geolocation APIMDN
5. Accessibilité
Utilise ton application sans souris, uniquement au
clavier, du début à la fin. Puis vérifie que le résultat d'une recherche
est bien annoncé aux lecteurs d'écran (aria-live).