[Nom de la Route]
Type de ressource : Route Astro (Page SSG / Page SSR / Endpoint API)
Fichier source :src/pages/[chemin].astroousrc/pages/api/[endpoint].ts
Statut : [Actif / Déprécié / En développement]
1. Vue dâensemble
Section titled â1. Vue dâensembleâ1.1. Description
Section titled â1.1. Descriptionâ[Description concise du rĂŽle de cette route dans lâarchitecture du site]
1.2. Objectif
Section titled â1.2. Objectifâ- [Objectif principal : ex. afficher la liste des articles de blog]
- [BĂ©nĂ©fice pour lâutilisateur final]
1.3. Caractéristiques
Section titled â1.3. CaractĂ©ristiquesâ| PropriĂ©tĂ© | Valeur |
|---|---|
| URL publique | /[chemin] |
| Mode de rendu | [SSG / SSR / Hybride] |
| Type | [Page HTML / Endpoint JSON / Redirect] |
| Méthode HTTP | [GET / POST / Les deux] |
| Authentification requise | [Oui / Non / Preview uniquement] |
| Cache | [Voir §6] |
2. Architecture et flux
Section titled â2. Architecture et fluxâ2.1. Diagramme de flux
Section titled â2.1. Diagramme de fluxâ[RequĂȘte utilisateur] â âŒ[Cloudflare Pages / Edge] â âą Middleware global (CSP, cookies) â âą Routage vers Astro âŒ[Astro Route] â âą getStaticPaths (si SSG dynamique) â âą RĂ©cupĂ©ration des donnĂ©es (Sanity / local) â âą Rendu du composant âŒ[RĂ©ponse HTML / JSON]2.2. Composants impliquĂ©s
Section titled â2.2. Composants impliquĂ©sâ| Composant | RĂŽle | Couche |
|---|---|---|
Fichier .astro ou .ts |
Définition de la route | L2 (Astro) |
getSanityClient() |
Récupération des données CMS | L2 (Astro) |
| Composants UI | Rendu visuel | L2 (Astro) |
| Layout | Structure HTML globale | L2 (Astro) |
| Middleware Cloudflare | Sécurité + Preview cookie | L3 (Cloudflare) |
3. Implémentation
Section titled â3. ImplĂ©mentationâ3.1. Code de la route
Section titled â3.1. Code de la routeâ---import BaseLayout from '../layouts/BaseLayout.astro';import { getSanityClient } from '../lib/sanity';import type { [TypeName] } from '../types/sanity';
// Configuration du renduexport const prerender = true; // ou false pour SSR
// Génération des chemins statiques (si SSG dynamique)export async function getStaticPaths() { const client = getSanityClient(/* ... */); const items = await client.fetch(`*[_type == "[type]" && status == "published"]{ slug }`);
return items.map(item => ({ params: { slug: item.slug.current }, }));}
// Récupération des donnéesconst { slug } = Astro.params;const client = getSanityClient(Astro);const data = await client.fetch<[TypeName]>(`*[_type == "[type]" && slug.current == $slug][0]{ ..., author->{name, image}, categories[]->{title, slug}}`, { slug });
// Gestion du 404if (!data) { return Astro.redirect('/404');}---
<BaseLayout title={data.title} description={data.seo?.metaDescription}> <!-- Contenu de la page --> <h1>{data.title}</h1> <!-- ... --></BaseLayout>3.2. Variante : Endpoint API (SSR)
Section titled â3.2. Variante : Endpoint API (SSR)âexport const prerender = false; // SSR obligatoire
export async function GET({ request, cookies, params }: APIContext) { // Logique de l'endpoint const data = { /* ... */ };
return new Response(JSON.stringify(data), { status: 200, headers: { 'Content-Type': 'application/json', 'Cache-Control': 'public, max-age=60', }, });}
export async function POST({ request }: APIContext) { const body = await request.json(); // Traitement du formulaire ou de l'action return new Response(JSON.stringify({ success: true }), { status: 200, headers: { 'Content-Type': 'application/json' }, });}3.3. Variante : Page SSR avec mode Preview
Section titled â3.3. Variante : Page SSR avec mode Previewâ---export const prerender = false; // SSR pour supporter la preview
import { getSanityClient } from '../lib/sanity';
const client = getSanityClient(Astro); // DĂ©tection auto du mode previewconst data = await client.fetch(/* GROQ query */);---4. DonnĂ©es et requĂȘtes GROQ
Section titled â4. DonnĂ©es et requĂȘtes GROQâ4.1. RequĂȘte principale
Section titled â4.1. RequĂȘte principaleâ*[_type == "[type]" && slug.current == $slug][0]{ _id, title, slug, publishedAt, mainImage { url, metadata { dimensions, alt } }, body, seo { metaTitle, metaDescription, ogImage }}4.2. RequĂȘtes secondaires (si applicable)
Section titled â4.2. RequĂȘtes secondaires (si applicable)â| RequĂȘte | Description | ParamĂštres |
|---|---|---|
| [Nom] | [Description] | [ParamĂštres] |
4.3. Types TypeScript associés
Section titled â4.3. Types TypeScript associĂ©sâ// Type gĂ©nĂ©rĂ© par sanity-typegenexport type [TypeName] = { _id: string; _type: '[type]'; title: string; slug: { _type: 'slug'; current: string }; // ... autres champs};5. ParamĂštres et validation
Section titled â5. ParamĂštres et validationâ5.1. ParamĂštres dâURL
Section titled â5.1. ParamĂštres dâURLâ| ParamĂštre | Type | Obligatoire | Description | Validation |
|---|---|---|---|---|
slug |
string |
â | Identifiant de la page | ^[a-z0-9-]+$ |
| [Autre] | [Type] | [â /â] | [Description] | [RĂšgle] |
5.2. Query strings (si applicable)
Section titled â5.2. Query strings (si applicable)â| ParamĂštre | Type | Obligatoire | Description | Valeur par dĂ©faut |
|---|---|---|---|---|
page |
number |
â | Pagination | 1 |
category |
string |
â | Filtre par catĂ©gorie | all |
5.3. Gestion des erreurs
Section titled â5.3. Gestion des erreursâ| Code HTTP | Condition | RĂ©ponse |
|---|---|---|
| 200 | SuccĂšs | Page HTML / JSON |
| 301 | Slug modifié (redirect permanent) | Redirection vers nouveau slug |
| 307 | Preview redirect | Redirection temporaire |
| 404 | Document non trouvé | Page 404 personnalisée |
| 500 | Erreur serveur (Sanity indisponible) | Page dâerreur gĂ©nĂ©rique |
6. Stratégie de cache
Section titled â6. StratĂ©gie de cacheâ6.1. En-tĂȘtes de cache
Section titled â6.1. En-tĂȘtes de cacheâ| Mode | Cache-Control |
CDN-Cache-Control |
Rationale |
|---|---|---|---|
| SSG (build time) | public, max-age=31536000, immutable |
public, max-age=31536000 |
Contenu statique, invalidé au rebuild |
| SSR standard | public, max-age=60 |
max-age=300, stale-while-revalidate=86400 |
Contenu semi-dynamique |
| SSR Preview | no-store, no-cache, must-revalidate, private |
no-store |
Contenu draft, jamais en cache |
| Endpoint API | public, max-age=300 |
max-age=600 |
Données JSON |
| POST (actions) | no-store |
no-store |
Jamais en cache |
6.2. Implémentation dans la route
Section titled â6.2. ImplĂ©mentation dans la routeâ---// SSG : pas besoin de headers (gĂ©rĂ© par Cloudflare Pages)export const prerender = true;
// SSR : configuration expliciteexport const prerender = false;Astro.response.headers.set('Cache-Control', 'public, max-age=60');Astro.response.headers.set('CDN-Cache-Control', 'max-age=300, stale-while-revalidate=86400');
// Preview : bypass totalconst isPreview = Astro.cookies.get('sanity-preview')?.value === 'true';if (isPreview) { Astro.response.headers.set('Cache-Control', 'no-store, no-cache, must-revalidate, private'); Astro.response.headers.set('CDN-Cache-Control', 'no-store');}---7. SEO et métadonnées
Section titled â7. SEO et mĂ©tadonnĂ©esâ7.1. Balises meta
Section titled â7.1. Balises metaâ| Balise | Source | Fallback |
|---|---|---|
<title> |
data.seo.metaTitle |
data.title |
<meta name="description"> |
data.seo.metaDescription |
data.excerpt |
<meta property="og:title"> |
data.seo.metaTitle |
data.title |
<meta property="og:description"> |
data.seo.metaDescription |
data.excerpt |
<meta property="og:image"> |
data.seo.ogImage |
data.mainImage |
<link rel="canonical"> |
URL publique de la page | - |
7.2. Sitemap
Section titled â7.2. Sitemapâ- â Cette route est-elle incluse dans le sitemap ? [Oui/Non]
- â FrĂ©quence de mise Ă jour : [daily / weekly / monthly]
- â PrioritĂ© : [0.0 Ă 1.0]
7.3. Indexation Pagefind
Section titled â7.3. Indexation Pagefindâ- â Cette route est-elle indexĂ©e par Pagefind ? [Oui/Non]
- â Poids du titre : [2.0]
- â Filtres applicables : [type, catĂ©gorie]
8. Composants UI utilisés
Section titled â8. Composants UI utilisĂ©sâ| Composant | Fichier | RĂŽle | Hydratation |
|---|---|---|---|
BaseLayout |
src/layouts/BaseLayout.astro |
Structure HTML | Aucune |
HeroSection |
src/components/sections/HeroSection.astro |
Section hero | Aucune |
MobileNav |
src/components/ui/MobileNav.astro |
Navigation mobile | client:load |
| [Autre] | [Chemin] | [RÎle] | [Stratégie] |
9. Sécurité
Section titled â9. SĂ©curitĂ©â9.1. AccĂšs et authentification
Section titled â9.1. AccĂšs et authentificationâ| Condition | Comportement |
|---|---|
| AccĂšs public | Page accessible sans authentification |
| Mode Preview | Cookie sanity-preview requis pour voir les drafts |
| Endpoint API sensible | Validation du secret/token requise |
9.2. Validation des entrées
Section titled â9.2. Validation des entrĂ©esâ- â Les paramĂštres dâURL sont validĂ©s (format du slug)
- â Les query strings sont sanitizĂ©es
- â Les entrĂ©es de formulaire sont validĂ©es cĂŽtĂ© serveur
- â Protection CSRF pour les endpoints POST
9.3. En-tĂȘtes de sĂ©curitĂ©
Section titled â9.3. En-tĂȘtes de sĂ©curitĂ©âInjectĂ©s par le Middleware Cloudflare (voir /cloudflare/workers/middleware.md) :
Content-Security-PolicyX-Content-Type-Options: nosniffX-Frame-Options: DENYStrict-Transport-Security
10. Débogage et troubleshooting
Section titled â10. DĂ©bogage et troubleshootingâ10.1. ProblĂšmes courants
Section titled â10.1. ProblĂšmes courantsâ| SymptĂŽme | Cause probable | Solution |
|---|---|---|
| Page 404 | Slug incorrect ou document non publié | Vérifier le slug dans Sanity |
| Contenu draft en production | Mode preview activé par erreur | Supprimer le cookie sanity-preview |
| Page blanche | Erreur GROQ ou type manquant | Vérifier les logs de build |
| Cache stale | CDN non invalidé | Attendre le TTL ou forcer un rebuild |
| 500 en SSR | Token Sanity manquant | VĂ©rifier les variables dâenvironnement |
| getStaticPaths lent | RequĂȘte GROQ non optimisĂ©e | Ajouter des projections explicites |
10.2. Logs et monitoring
Section titled â10.2. Logs et monitoringâ# Logs de dĂ©veloppementnpm run dev
# Logs de build (SSG)npm run build -- --verbose
# Logs Cloudflare (SSR production)wrangler pages deployment tail
# Vérification des typesnpx astro check10.3. Tests manuels
Section titled â10.3. Tests manuelsâ# Test de la route en localcurl -I http://localhost:4321/[chemin]
# Test du mode previewcurl -I -b "sanity-preview=true" http://localhost:4321/[chemin]
# Test d'un endpoint APIcurl -X POST http://localhost:4321/api/[endpoint] \ -H "Content-Type: application/json" \ -d '{"key": "value"}'
# Test de la gestion 404curl -I http://localhost:4321/[chemin-inexistant]# Attendu : 404 ou redirect vers /40411. Bonnes pratiques
Section titled â11. Bonnes pratiquesâ11.1. Architecture
Section titled â11.1. Architectureâ- â
Utiliser
export const prerender = truepar dĂ©faut (SSG) - â
Nâutiliser
prerender = falseque si nĂ©cessaire (preview, formulaires, API) - â
Centraliser les requĂȘtes GROQ dans
src/lib/queries.ts - â
Toujours typer les données avec les types générés par
sanity-typegen - â GĂ©rer le cas 404 explicitement
11.2. Performance
Section titled â11.2. Performanceâ- â
Utiliser
getStaticPathspour prĂ©-gĂ©nĂ©rer les pages dynamiques en SSG - â Limiter les projections GROQ aux champs nĂ©cessaires
- â
Utiliser
loading="lazy"pour les images non-LCP - â Ăviter les composants hydratĂ©s sauf si interaction requise
11.3. Maintenance
Section titled â11.3. Maintenanceâ- â Documenter les changements de route dans ce fichier
- â Mettre Ă jour le sitemap lors de lâajout/suppression de routes
- â Tester les routes en staging avant production
- â VĂ©rifier les redirects lors de la modification de slugs
12. Ăvolutions et roadmap
Section titled â12. Ăvolutions et roadmapâ12.1. AmĂ©liorations planifiĂ©es
Section titled â12.1. AmĂ©liorations planifiĂ©esâ- [Ăvolution 1 : ex. Pagination pour les listings]
- [Ăvolution 2 : ex. Support i18n (routes localisĂ©es)]
- [Ăvolution 3 : ex. View Transitions Astro]
12.2. Limitations connues
Section titled â12.2. Limitations connuesâ- â Les pages SSG ne supportent pas le mode Preview
- â
getStaticPathsest exĂ©cutĂ© uniquement au build (pas de mise Ă jour en temps rĂ©el) - â Les Pages Functions SSR ont une limite de 128 MB de mĂ©moire
13. Ressources liées
Section titled â13. Ressources liĂ©esâ- Documentation Astro : Routing
- Documentation Astro : getStaticPaths
- Documentation Astro : Endpoints
- DAT L2 : §3 - Structure des Routes et Stratégie de Rendu
- DAT L2 : §5 - Intégration Sanity dans Astro
- DAT L3 : §3 - Middleware Global
- Routes associées :
- [Liste des routes liées ou dépendantes]
- Fichiers concernés :
src/pages/[chemin].astrosrc/lib/queries.tssrc/layouts/BaseLayout.astro
14. Historique des modifications
Section titled â14. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| YYYY-MM-DD | 1.0 | Création initiale | [Nom] |
| YYYY-MM-DD | 1.1 | [Modification] | [Nom] |
---
**Points clés de ce template :**- Couvre les trois types de routes Astro (page SSG, page SSR, endpoint API)- Détaille la stratégie de cache par mode de rendu- Inclut la gestion du mode Preview au niveau de la route- Documente le SEO, l'indexation Pagefind et le sitemap- Fournit les variantes de code pour chaque type de route- Inclut la gestion des erreurs et des codes HTTP- Sépare clairement les paramÚtres d'URL, les query strings et la validation