Skip to content

Type de ressource : Composant Astro (UI atomique)
Fichier source : src/components/BaseHead.astro
Statut : Actif

Composant pour les métadonnées HTML globales de la page (meta tags, title, description, Open Graph, Twitter Card). Importe également le CSS global.

  • Centraliser les mĂ©tadonnĂ©es SEO pour toutes les pages
  • Assurer la cohĂ©rence des meta tags sur tout le site
  • Importer le CSS global pour inclure les styles sur toutes les pages
  • Fournir une image de fallback pour le partage social
Propriété Valeur
Type UI atomique
Hydratation Aucune
Framework JS Aucun
Accessibilité Partiellement conforme (meta tags)
Responsive Non applicable
src/components/
├── BaseHead.astro
├── Header.astro
├── Footer.astro
├── FormattedDate.astro
└── HeaderLink.astro
Composant parent Fichier Relation
Toutes les pages src/pages/*.astro Utilisation dans le <head>
Composant enfant Fichier RĂŽle
Aucun - Composant leaf

3.1. Variante : Composant UI atomique (HTML + CSS purs)

Section titled “3.1. Variante : Composant UI atomique (HTML + CSS purs)”
src/components/BaseHead.astro
---
import '../styles/global.css';
import type { ImageMetadata } from 'astro';
import FallbackImage from '../assets/blog-placeholder-1.jpg';
import { SITE_TITLE } from '../consts';
interface Props {
title: string;
description: string;
image?: ImageMetadata;
}
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
const { title, description, image = FallbackImage } = Astro.props;
---
<!-- Global Metadata -->
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" href="/favicon.ico" />
<link rel="sitemap" href="/sitemap-index.xml" />
<link
rel="alternate"
type="application/rss+xml"
title={SITE_TITLE}
href={new URL('rss.xml', Astro.site)}
/>
<meta name="generator" content={Astro.generator} />
<!-- Canonical URL -->
<link rel="canonical" href={canonicalURL} />
<!-- Primary Meta Tags -->
<title>{title}</title>
<meta name="description" content={description} />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content={Astro.url} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={new URL(image.src, Astro.url)} />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
---
import BaseHead from '../components/BaseHead.astro';
import { SITE_TITLE, SITE_DESCRIPTION } from '../consts';
---
<!doctype html>
<html lang="en">
<head>
<BaseHead title={SITE_TITLE} description={SITE_DESCRIPTION} />
</head>
<body>
<!-- Contenu de la page -->
</body>
</html>
Prop Type Description Exemple
title string Titre de la page "Accueil"
description string Description de la page "Blog personnel"
Prop Type Description Valeur par défaut
image ImageMetadata Image pour Open Graph/Twitter FallbackImage (blog-placeholder-1.jpg)

Aucun slot n’est implĂ©mentĂ© dans ce composant.

Type de composant Stratégie Rationale
Composant UI atomique Aucune HTML pur, pas d’interaction

Aucune directive n’est utilisĂ©e (composant HTML pur).

Métrique Sans hydratation
HTML size +1 KB
CSS size +taille global.css
JS size 0 KB
TTI Immédiat

Non applicable - ce composant n’a pas de styles inline, il importe le CSS global.

Non applicable - les meta tags viewport assurent le responsive design au niveau global.

Non applicable - ce composant ne gĂšre pas le mode sombre.

CritÚre Implémentation Statut
1.1.1 Non-text Content Alt text non applicable (pas d’images) N/A
1.3.1 Info and Relationships Structure HTML sĂ©mantique (<head>, <title>) ✅
1.4.3 Contrast (Minimum) Non applicable (pas de contenu visuel) N/A
2.4.7 Focus Visible Non applicable (pas d’élĂ©ments interactifs) N/A

Aucun attribut ARIA n’est utilisĂ© (composant de mĂ©tadonnĂ©es).

Non applicable (composant de métadonnées).

Terminal window
# Test avec Lighthouse
npx lighthouse http://localhost:4321/ --view
  • ✅ HTML statique par dĂ©faut
  • ✅ Pas de JavaScript
  • ✅ Import unique du CSS global
  • ✅ Canonical URL pour Ă©viter le duplicate content
Métrique Objectif Stratégie
LCP < 2.5s Pas de JS bloquant
INP < 200ms Pas de JS
CLS < 0.1 Pas de layout shift
Type HTML CSS JS (hydraté) Total
UI atomique 1 KB +global.css 0 KB 1 KB + global.css
SymptĂŽme Cause probable Solution
Styles non appliquĂ©s global.css non importĂ© VĂ©rifier le chemin d’import
Meta tags incorrects Props non passées Vérifier les props title et description
Image fallback incorrecte FallbackImage non trouvĂ© VĂ©rifier le chemin de l’asset
Terminal window
# Test local
npm run dev
# Vérification des meta tags
# Ouvrir les DevTools → Onglet Network → Recharger la page
# Vérifier les meta tags dans la réponse HTML

Non applicable (composant statique).

  • ✅ Centraliser les mĂ©tadonnĂ©es dans un composant unique
  • ✅ Importer le CSS global une seule fois
  • ✅ Utiliser une image de fallback pour le partage social
  • ✅ Typer les props avec TypeScript
  • ✅ Toujours inclure un title et une description
  • ✅ Utiliser les meta tags Open Graph et Twitter Card
  • ✅ Inclure une canonical URL
  • ✅ Pas de JavaScript inutile
  • ✅ Image fallback optimisĂ©e
  • ✅ Pas de styles inline
  • ✅ Mettre Ă  jour les meta tags selon les besoins SEO
  • ✅ VĂ©rifier la compatibilitĂ© des meta tags avec les rĂ©seaux sociaux
  • Ajout de meta tags supplĂ©mentaires (robots, author)
  • Support du mode sombre (theme-color)
  • Ajout de structured data (JSON-LD)
  • Support des diffĂ©rentes images pour Open Graph et Twitter
  • ❌ Pas de support du mode sombre
  • ❌ Pas de structured data
  • ❌ Meta tags Twitter incomplets (twitter:title, twitter:description manquants)
  • Documentation Astro : Components
  • Documentation Astro : SEO
  • DAT L2 : §4 - StratĂ©gie d’Hydratation & Gestion du JavaScript
  • Composants associĂ©s :
    • src/components/Header.astro
    • src/components/Footer.astro
  • Fichiers assets : src/assets/blog-placeholder-1.jpg
  • CSS global : src/styles/global.css
Date Version Description Auteur
2026-09-15 1.0 Création initiale Devin
Edit page

Last updated: