Skip to content

Type de ressource : Layout Astro (Gabarit de page)
Fichier source : src/layouts/[NomLayout].astro
Statut : [Actif / Déprécié / En développement]
Slice : [Numéro de la tranche verticale]
Version : 1.0


[Description concise du rîle de ce layout dans l’architecture du site]

  • [Objectif principal : ex. fournir la structure HTML globale pour les pages de blog]
  • [BĂ©nĂ©fice pour l’architecture : ex. cohĂ©rence visuelle + SEO centralisĂ©]
Type de pages Statut
Blog [✅/❌]
Portfolio [✅/❌]
Vitrine [✅/❌]
Documentation [✅/❌]
Toutes [✅/❌]
Mode de rendu Statut
SSG [✅/❌]
SSR [✅/❌]
Les deux [✅/❌]

[Page Astro]
│ (import du layout)
▌
[Layout]
│ ‱ Structure HTML globale
│ ‱ Injection des mĂ©tadonnĂ©es SEO
│ ‱ Inclusion des composants globaux (Header, Footer)
│ ‱ Gestion des slots de contenu
▌
[HTML final]
Composant RĂŽle Fichier
Layout parent Structure HTML de base src/layouts/BaseLayout.astro (si applicable)
Header Navigation globale src/components/ui/Header.astro
Footer Pied de page global src/components/ui/Footer.astro
SEO Component Injection des balises meta src/components/seo/SeoJsonLd.astro
Slot de contenu Zone de contenu dynamique <slot />

src/layouts/[NomLayout].astro
---
import BaseLayout from './BaseLayout.astro';
import Header from '../components/ui/Header.astro';
import Footer from '../components/ui/Footer.astro';
import SeoJsonLd from '../components/seo/SeoJsonLd.astro';
interface Props {
title: string;
description?: string;
ogImage?: string;
canonical?: string;
jsonLd?: object;
}
const {
title,
description,
ogImage,
canonical = Astro.url.href,
jsonLd
} = Astro.props;
---
<BaseLayout
title={title}
description={description}
ogImage={ogImage}
}
<Header />
<main id="main-content">
<slot />
</main>
<Footer />
{jsonLd && <SeoJsonLd data={jsonLd} />}
</BaseLayout>
src/layouts/BlogLayout.astro
---
import BaseLayout from './BaseLayout.astro';
import Header from '../components/ui/Header.astro';
import Footer from '../components/ui/Footer.astro';
import Sidebar from '../components/ui/Sidebar.astro';
interface Props {
title: string;
description?: string;
}
const { title, description } = Astro.props;
---
<BaseLayout title={title} description={description}>
<Header />
<div class="flex">
<aside class="w-64">
<Sidebar />
</aside>
<main id="main-content" class="flex-1">
<slot />
</main>
</div>
<Footer />
</BaseLayout>

Prop Type Obligatoire Validation
title string ✅ Non vide
description string ❌ Valeur par dĂ©faut
ogImage string ❌ URL valide
canonical string ❌ URL valide
jsonLd object ❌ Structure JSON-LD valide
ÉlĂ©ment Type Description
HTML structure HTMLElement Structure HTML complĂšte
Meta tags HTMLMetaElement Balises SEO
Slot content HTMLElement Contenu injecté

Scénario Description Résultat attendu
Rendu avec props Props valides Layout rendu correctement
Injection SEO Meta tags Balises injectées
Slot content Contenu injecté Slot rendu correctement
Scénario Dépendances Description Résultat attendu
Intégration page Page + Layout Page utilise le layout Structure correcte
Scénario Parcours utilisateur Description Résultat attendu
Navigation Utilisateur → Page Navigation sur le site Layout cohĂ©rent

Composant Type RĂŽle MĂ©thode d’intĂ©gration
Page L2 Utilisation du layout Import et wrapper
Header L2 Navigation globale Import et rendu
Footer L2 Pied de page Import et rendu
  • Les props doivent ĂȘtre typĂ©es avec TypeScript
  • Le SEO doit ĂȘtre centralisĂ© dans le layout
  • L’accessibilitĂ© doit ĂȘtre conforme WCAG AA
  • Le layout fonctionne avec toutes les pages
  • Les meta tags sont injectĂ©s correctement
  • L’accessibilitĂ© est conforme
  • Les tests E2E passent

  • ✅ CSP headers appliquĂ©s par le middleware
  • ✅ Validation des props
  • ✅ Protection XSS (Astro par dĂ©faut)
  • ✅ Ne jamais exposer de donnĂ©es sensibles dans le HTML
  • ✅ Valider toutes les URLs (canonical, ogImage)
  • ✅ Utiliser les en-tĂȘtes de sĂ©curitĂ© appropriĂ©s

Optimisation Description
Lazy loading Chargement différé des composants
Code splitting Séparation du code par layout
Critical CSS CSS critique inline
  • ❌ Les layouts augmentent la taille du bundle
  • ❌ Les slots complexes peuvent affecter les performances

SymptĂŽme Cause probable Solution
Layout non appliquĂ© Import incorrect VĂ©rifier l’import
Meta tags manquants Props non passées Vérifier les props
Slot vide Contenu non injecté Vérifier le slot
Terminal window
# Build local
npm run build
# Preview du build
npm run preview

  • ✅ Layouts hiĂ©rarchiques (BaseLayout → Layout spĂ©cifique)
  • ✅ Props typĂ©es avec TypeScript
  • ✅ SEO centralisĂ©
  • ✅ Utiliser des composants rĂ©utilisables
  • ✅ Optimiser les images et les assets
  • ✅ Documenter les props complexes
  • ✅ Documenter les changements dans ce fichier
  • ✅ Tester les modifications en local

  • [Évolution 1]
  • [Évolution 2]
  • ❌ [Limitation 1]
  • ❌ [Limitation 2]

  • Documentation Astro : Layouts
  • DAT L2 : §5.3 - Structure du Projet

Date Version Description Auteur
YYYY-MM-DD 1.0 Création initiale [Nom]
Edit page

Last updated: