
Justement, dans ce cadre, nous devons absolument voir l'utilisation de Vue Router. Nous en sommes à la version 4 (vue router 4). Il serait aussi intéressant de regarder l'API de composition, mais nous la verrons dans un second temps.
Petit rappel de ce qu'est une SPA dans un premier temps : il s'agit d'une application web qui n'a qu'une seule vraie page (qu'on va appeler point d'entrée) et qui gère côté front (côté client donc) le passage d'une page à une autre. Il n'y a donc pas de "rafraichissements" de page, on a l'impression de ne jamais changer de page :).
Les avantages d'une SPA, qui sont de plus en plus nombreux au fil des années car les technologies évoluent, sont, entre autre :
- Un temps de développement plus rapide car on se concentre sur HTML/CSS/JS
- Un chargement de l'application plus rapide qu'avec une application classique. En effet, il suffit simplement de charger des assets (HTML/CSS/JS) une fois, lors de la première visite de l'internaute. Après, ils sont mis en cache ;).
- Il est plus rapide de faire une application mobile. En effet, avec une SPA, le back sera le même pour l'application web et pour l'application mobile.
Néanmoins, il faut savoir qu'il y a encore quelques désagréments à utiliser les SPAs. Notamment, il faut absolument que Javascript soit activé sur le navigateur du client (mais il y a des techniques, comme le SSR, qui évitent ce problème). Si une SPA est mal codée, elle est plus sensible aux failles XSS, car la surface d'attaque est plus grande (beaucoup plus de javascript). Et enfin, une SPA mal codée a de lourdes conséquences quant au référencement naturel du site (par exemple, des URLs pas très user friendly, un code excessivement lourd, une ergonomie qui n'est pas adaptée...).

En bref, une SPA c'est chouette, c'est moderne, mais il faut que cela réponde aux besoins du projet sur lequel tu travailles ! Compris ?

C'est cela. Vue Routeur est développé par l'équipe de Vue.JS et permet d'associer à chaque URL un composant.

C'est le cas. Mais l'URL change quand même ;). Si par exemple, l'URL indique "index" sur ton site, alors on peut imaginer qu'il y a derrière à afficher le composant "Index". Comme suit :

Et si, dans le composant Index, il y a un lien vers une autre page de ton site, cela signifie en réalité que :
- Le lien est de la forme http://monsite.com/nom_de_la_page
- Vue Routeur sait qu'à l'URL qui se termine par nom_de_la_page (on va appeler ça l'action), il faut associer le composant NomDeLaPage
- Vue Routeur intercepte le fait que l'URL change au clic sur le lien, et donc remplace le composant Index par NomDeLaPage
- Il n'y a donc pas de rafraichissement de la page dans le navigateur, tout a été fait sur une seule et même page, même si l'URL a bien changé ;)

Parfait. Qui dit Routeur dit plusieurs problématiques à aborder... Évidemment, d'abord, l'association entre une action et un composant. Cette association s'appelle la route. Ensuite, que se passe-t-il dans le cas où une route n'existe pas ? Autrement dit, s'il y a une action qui n'a pas de composant associé. Et, dans le cas où nous avons un espace d'administration, comment limiter les routes d'administration aux administrateurs ? Comment passer d'un composant à un autre (en changeant d'URL et d'action donc) de manière fluide et personnalisable ?
Toutes ces questions vont être abordées dans ce cours ;).
Comme toujours dans cette série de cours sur Vue.JS, nous allons partir d'une situation concrète qui sera le fil rouge de notre parcours d'apprentissage. Et au vu du nombre d'informations que nous entendons à longueur de journée concernant les actualités, j'ai pensé intéressant de réaliser un site qui récupère les dernières news françaises et qui permet aux gens de les commenter pour sourcer les informations citées dans ladite actualité. Pour ça, nous utiliserons l'API gratuite Mediastack. Je tiens à préciser que nous n'avons aucune affiliation avec Mediastack pour la réalisation de ce tutoriel ;).

Merci ;).
Installation
Nous devons donc dans un premier temps générer un nouveau projet Vue. Pour ce, j'utilise vue-cli.
{"language":"shell","content":"vue create vue-news\ncd vue-news\nvue add router","filename":"console"}
Il te sera demandé de choisir d'utiliser ou non le mode historique pour le router (Use history mode for router? (Requires proper server setup for index fallback in production). Si tu choisis Yes ("Y"), alors tu utiliseras le mode "classique" et recommandé. Tu auras alors le code présenté dans la suite de ce cours. Si tu choisis No ("n"), cela signifie que ce sera le mode "hash" utilisé. Ce mode est préconisé uniquement dans le cas où tu n'utilises pas de serveur web pour rendre ton application et/ou que le SEO n'est pas une de tes priorités pour ce projet.
Pour information, l'history mode est indispensable au fonctionnement de ta SPA. Avec le mode hash, un "hash" sera utilisé pour simuler chaque URL. Ainsi, la page ne sera jamais vraiment rechargée (d'où le fait qu'il n'y a pas besoin de serveur web ;)). Dans le cas où tu utilises le mode classique recommandé, tu pourras avoir des URL qui ont forme explicite car un serveur web est capable de les traiter.
Pour utiliser l'API de Mediastack, il nous faut une clé API. Pour l'obtenir, il faut s'inscrire (https://mediastack.com/). Si tu ne désires pas t'inscrire, sache que tu peux tout de même réaliser ce tutoriel avec une autre API de ton choix. Tu peux également, pour plus de simplicité, faire un fichier JSON contenant une liste d'actualités fixe ;).

On va travailler de manière propre. Étant donné qu'on aura des données de configuration (la clé API et l'URL de base pour les appels API), le mieux est d'avoir un fichier .env. Ce fichier, très courant dans les projets web, permet de renseigner des couples de clé/valeur qui dépendent de chaque projet. Le fichier est à la racine du projet et on le met dans le .gitignore de telle sorte qu'il n'apparaisse pas dans un repository public. En effet, vu qu'il contient des données sensibles, c'est mieux de le garder pour soi et de ne pas le publier partout !

Avec vue-cli 3, une solution de lecture des .env est déjà implémentée ;). Si tu n'utilises pas vue-cli 3, il faut alors installer avec npm (ou yarn) la librairie dotenv.
Voici le fichier .env que j'ai créé :
{"language":"","content":"VUE_APP_MEDIASTACK_KEY=VotreClé\nVUE_APP_MEDIASTACK_BASE_URL=http://api.mediastack.com/v1/","filename":".env"}
Il faut évidemment remplacer "VotreClé" par la clé API fournie après inscription sur Mediastack.

C'est la convention lorsqu'on utilise vue-cli 3 et les .env ;). C'est pour éviter de publier des clés privées partout, une protection de vue-cli ;). Pour plus d'infos : https://cli.vuejs.org/guide/mode-and-env.html#modes
Ensuite, pour éviter que nos données sensibles se retrouvent sur GitHub, gitlab ou autre repository public, il faut rajouter le .env dans le .gitignore.
Ainsi, le fichier ressemble à ça :
{"language":"","content":".DS_Store\nnode_modules\n/dist\n\n\n# local env files\n.env.local\n.env.*.local\n\n#ICI ON AJOUTE .env\n.env\n\n# Log files\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n\n# Editor directories and files\n.idea\n.vscode\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n","filename":".gitignore"}
Et voilà ! On peut faire notre premier git add / git commit ;).
Attention, cependant. Ici, notre clé API sera quand même publique... Effectivement, étant donné que les appels API seront faits avec fetch en javascript (donc côté frontend), la clé API sera visible si quelqu'un inspecte le code Javascript. Dans une situation réelle, il faudrait donc faire les appels à l'API qui nécessitent une clé privée avec un langage comme Node.JS ou PHP (ou autre), côté back. Mediastack conseille d'ailleurs vivement de ne pas faire les appels avec Javascript. Pour résumé : nous sommes dans une situation pédagogique, donc pas de soucis, mais dans la vraie vie, pas de clé privée qui passe dans des appels API faits en Javascript côté front ! Et si jamais la clé API que tu vas utiliser dans ce projet est rendue publique par mégarde, au pire, quelqu'un pourra utiliser le quota de ton compte gratuit. Mais rien de plus !

On sort un peu du cadre du cours, mais dans la pratique, c'est ça. Sauf quand les APIs sont sécurisées avec d'autres protections que la simple clé secrète. Ces protections peuvent être, non exhaustivement :
- Une vérification de l'origine de l'appel par exemple
- Par des protocoles comme OAUTH (le plus courant)

Du coup, on peut passer à la suite : nous allons créer nos premières routes ;).
J'ai terminé cette partie