Vue : construire une application web (école d'ingénieur) · Chapitre 11 · Exercice de TD
Servir sous un sous-dossier
Tests et mise en production · niveau 3 (difficile)
Énoncé
La Librairie doit être publiée à l'adresse /librairie/ d'un serveur qui héberge d'autres sites. On règle base: "/librairie/" dans vite.config.js, on construit, et l'on sert dist sous /librairie/.
- Ouverte à
/librairie/, l'application affiche « Page introuvable ». Pourquoi ? Corriger. - Le catalogue s'affiche alors, mais sans aucune couverture. Pourquoi ? Corriger.
- Écrire la configuration nginx correspondante.
Corrigé
La correction complète est dans code/ch11/exercices/ex11-sous-dossier/, servie par nginx dans Docker et ouverte dans Chromium à chaque étape.
- Avec
baseseul, Vite a bien réécrit les chemins deindex.html, mais le routeur, lui, compare l'adresse entière/librairie/à ses routes :
/librairie/ → h1 « Page introuvable »
/librairie/livres/9782956300052 → h1 « Page introuvable »
réponses en erreur : aucune
On lui donne la base, que Vite expose dans import.meta.env.BASE_URL :
// BASE_URL vaut la valeur de « base » dans vite.config.js : "/librairie/"
history: createWebHistory(import.meta.env.BASE_URL),
- Les couvertures sont désignées par
'/' + livre.image, un chemin absolu qui ignore la base :
/librairie/ → h1 « Catalogue »
/librairie/livres/9782956300052 → h1 « Le Petit Prince »
réponses en erreur : 404 /images/analyse.svg, 404 /images/algo.svg, 404 /images/physique.svg, 404 /images/prince.svg, 404 /images/etranger.svg, 404 /images/java.svg
Dans CarteLivre.vue et PageLivre.vue :
// Les images de public/ sont servies sous la base de l'application.
const base = import.meta.env.BASE_URL;
et :src="base + livre.image". Résultat :
/librairie/ → h1 « Catalogue »
/librairie/livres/9782956300052 → h1 « Le Petit Prince »
réponses en erreur : aucune
Les appels à /api/…, eux, restent absolus : l'API n'est pas sous /librairie/.
- On copie
distdans le sous-dossierlibrairiede la racine du serveur, et la réécriture renvoie l'index.htmlde ce sous-dossier :
# La Librairie servie sous /librairie/ (dist/ copié dans html/librairie/).
server {
listen 80;
root /usr/share/nginx/html;
location /librairie/assets/ {
add_header Cache-Control "public, max-age=31536000, immutable";
try_files $uri =404;
}
location /api/ {
proxy_pass http://host.docker.internal:8000;
}
location /librairie/ {
add_header Cache-Control "no-cache";
try_files $uri $uri/ /librairie/index.html;
}
}100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.