Collections de contenus
Ajouté à la version :
astro@2.0.0
Les collections de contenu sont le meilleur moyen de gérer et de créer du contenu dans n’importe quel projet Astro. Les collections permettent d’organiser vos documents, de valider votre frontmatter et d’assurer automatiquement la sécurité des types TypeScript pour l’ensemble de votre contenu.
Que sont les collections de contenu ?
Titre de la section Que sont les collections de contenu ?Une collection de contenu est un répertoire de premier niveau dans le répertoire réservé du projet src/content
, comme src/content/newsletter
et src/content/authors
. Seules les collections de contenu sont autorisées dans le répertoire src/content
. Ce répertoire ne peut pas être utilisé pour autre chose.
Une entrée de collection est un élément de contenu stocké dans votre répertoire de collection de contenu. Les entrées peuvent utiliser des formats de création de contenu tels que Markdown (.md
) et MDX (.mdx
) en utilisant l’intégration MDX) ou l’un des deux formats de données supportés : YAML (.yaml
) et JSON (.json
). Nous recommandons d’utiliser un schéma de nommage cohérent (minuscules, tirets au lieu d’espaces) pour vos fichiers afin de faciliter la recherche et l’organisation de votre contenu, mais ce n’est pas obligatoire. Vous pouvez également exclure des entrées de la construction en préfixant le nom du fichier avec un trait de soulignement (_).
Répertoiresrc/content/
Répertoirenewsletter/ la collection “lettre d’information”
- week-1.md une entrée de la collection
- week-2.md une entrée de la collection
- week-3.md une entrée de la collection
Une fois que vous avez une collection, vous pouvez commencer à interroger votre contenu en utilisant les API de contenu intégrées d’Astro.
Le répertoire “.astro”
Titre de la section Le répertoire “.astro”Astro stocke des métadonnées importantes pour les collections de contenu dans un répertoire .astro
dans votre projet. Aucune action n’est nécessaire de votre part pour maintenir ou mettre à jour ce répertoire. Vous êtes encouragé à l’ignorer complètement lorsque vous travaillez sur votre projet.
Le répertoire .astro
sera mis à jour automatiquement chaque fois que vous lancerez les commandes astro dev
, astro build
. Vous pouvez lancer astro sync
à tout moment pour mettre à jour le répertoire .astro
manuellement.
Si vous utilisez Git pour le contrôle de version, nous vous recommandons d’ignorer le répertoire .astro
en ajoutant .astro
à votre .gitignore
. Cela indique à Git d’ignorer ce répertoire et tous les fichiers qu’il contient.
Organisation avec plusieurs collections
Titre de la section Organisation avec plusieurs collectionsSi deux fichiers représentent différents types de contenu (par exemple, un article de blog et un profil d’auteur), il est fort probable qu’ils appartiennent à des collections différentes. Ceci est important car de nombreuses fonctionnalités (validation de frontmatter, sécurité de type TypeScript automatique) exigent que toutes les entrées d’une collection partagent une structure similaire.
Si vous travaillez avec différents types de contenu, vous devez créer plusieurs collections pour représenter chaque type. Vous pouvez créer autant de collections différentes que vous le souhaitez dans votre projet.
Répertoiresrc/content/
Répertoirenewsletter/
- week-1.md
- week-2.md
Répertoireblog/
- post-1.md
- post-2.md
Répertoireauthors/
- grace-hopper.json
- alan-turing.json
Organisation avec des sous-répertoires
Titre de la section Organisation avec des sous-répertoiresUne collection de contenus est toujours un dossier de premier niveau à l’intérieur du répertoire src/content/
. Vous ne pouvez pas imbriquer une collection dans une autre. Cependant, vous pouvez utiliser des sous-répertoires pour organiser votre contenu au sein d’une collection.
Par exemple, vous pouvez utiliser la structure de répertoire suivante pour organiser les traductions i18n dans une seule collection docs
. Lorsque vous interrogez cette collection, vous pouvez filtrer les résultats par langue en utilisant le chemin d’accès au fichier.
Répertoiresrc/content/
Répertoiredocs/ cette collection utilise des sous-répertoires pour classer les documents par langue.
Répertoireen/
- …
Répertoirees/
- …
Répertoirede/
- …
Définition des collections
Titre de la section Définition des collectionsLe fichier src/content/config.ts
est optionnel. Cependant, choisir de ne pas définir vos collections désactivera certaines de leurs meilleures fonctionnalités comme la validation de schéma frontmatter ou les typages automatiques TypeScript.
Pour tirer le meilleur parti de vos collections de contenus, créez un fichier src/content/config.ts
dans votre projet (les extensions .js
et .mjs
sont également supportées.) Il s’agit d’un fichier spécial qu’Astro chargera et utilisera automatiquement pour configurer vos collections de contenus.
Configuration de TypeScript
Titre de la section Configuration de TypeScriptSi vous n’étendez pas déjà les paramètres TypeScript recommandés par Astro strict
ou strictest
dans votre fichier tsconfig.json
, vous devrez peut-être mettre à jour votre tsconfig.json
pour activer strictNullChecks
.
Si vous utilisez des fichiers .js
ou .mjs
dans un projet Astro, vous pouvez activer IntelliSense et la vérification de type dans votre éditeur en activant allowJs
dans votre tsconfig.json
:
Définition d’un schéma de collection
Titre de la section Définition d’un schéma de collectionLes schémas assurent la cohérence des données de base ou d’entrée au sein d’une collection. Un schéma garantit que ces données existent sous une forme prévisible lorsque vous devez les référencer ou les interroger. Si un fichier ne respecte pas le schéma de sa collection, Astro affichera une erreur utile pour vous en informer.
Les schémas alimentent également les typages TypeScript automatiques d’Astro pour votre contenu. Lorsque vous définissez un schéma pour votre collection, Astro génère et applique automatiquement une interface TypeScript à ce schéma. Le résultat est un support TypeScript complet lorsque vous interrogez votre collection, y compris l’autocomplétion des propriétés et la vérification des types.
Pour définir votre première collection, créez un fichier src/content/config.ts
s’il n’existe pas déjà (les extensions .js
et .mjs
sont également supportées) :
- Importer les utilitaires appropriés de
astro:content
. - Définissez chaque collection que vous souhaitez valider. Cela inclut un
type
(introduit dans Astro v2.5.0) spécifiant si la collection contient des formats de création de contenu comme Markdown (type : 'content'
) ou des formats de données comme JSON ou YAML (type : 'data'
). Il inclut également unschema
qui définit la forme de votre frontmatter ou des données d’entrée. - Exporter un seul objet
collections
pour enregistrer vos collections.
Définir plusieurs collections
Titre de la section Définir plusieurs collectionsVous pouvez utiliser defineCollection()
autant de fois que vous le souhaitez pour créer plusieurs schémas. Toutes les collections doivent être exportées à partir d’un seul objet collections
.
Au fur et à mesure que votre projet grandit, vous êtes également libre de réorganiser votre base de code et de déplacer la logique hors du fichier src/content/config.ts
. Définir vos schémas séparément peut être utile pour réutiliser les schémas dans plusieurs collections et pour partager les schémas avec d’autres parties de votre projet.
Utilisation de schémas de collection tiers
Titre de la section Utilisation de schémas de collection tiersVous pouvez importer des schémas de collection de n’importe où, y compris de paquets npm externes. Cela peut s’avérer utile lorsque vous travaillez avec des thèmes et des bibliothèques qui fournissent leurs propres schémas de collection.
Définition des types de données avec Zod
Titre de la section Définition des types de données avec ZodAstro utilise Zod pour alimenter ses schémas de contenu. Avec Zod, Astro est capable de valider le frontmatter de chaque fichier dans une collection et de fournir des types TypeScript automatiques lorsque vous interrogez le contenu à partir de votre projet.
Pour utiliser Zod dans Astro, importez l’utilitaire z
depuis "astro:content"
. Il s’agit d’une réexportation de la bibliothèque Zod, et il supporte toutes les fonctionnalités de Zod. Voir le README de Zod’s pour une documentation complète sur le fonctionnement de Zod et les fonctionnalités disponibles.
Définition des références de collection
Titre de la section Définition des références de collectionLes entrées d’une collection peuvent également “référencer” d’autres entrées connexes.
Avec la fonction reference()
de l’API Collections, vous pouvez définir une propriété dans un schéma de collection comme une entrée d’une autre collection. Par exemple, vous pouvez exiger que chaque entrée space-shuttle
comprenne une propriété pilot
qui utilise le propre schéma de la collection pilot
pour la vérification de type, l’autocomplétion et la validation.
Un exemple courant est un article de blog qui fait référence à des profils d’auteurs réutilisables stockés en JSON, ou à des URL d’articles connexes stockés dans la même collection :
Cet exemple d’article de blog spécifie les slug
des articles liés et l’id
de l’auteur de l’article :
Définition d’un slug personnalisé
Titre de la section Définition d’un slug personnaliséLorsque vous utilisez type: 'content'
, chaque entrée de contenu génère une propriété slug
conviviale à partir de son fichier id
. Cette propriété est utilisée pour interroger l’entrée directement à partir de votre collection. Il est également utile pour créer de nouvelles pages et URL à partir de votre contenu.
Vous pouvez remplacer la balise générée par une entrée en ajoutant votre propre propriété slug
au fichier frontmatter. Ceci est similaire à la fonctionnalité “permalink” d’autres frameworks web. "slug"
est un nom de propriété spécial et réservé qui n’est pas autorisé dans le schema
de votre collection personnalisée et qui n’apparaîtra pas dans la propriété data
de votre entrée.
Interroger les collections
Titre de la section Interroger les collectionsAstro fournit deux fonctions pour interroger une collection et retourner une (ou plusieurs) entrée de contenu : getCollection()
et getEntry()
.
Les deux fonctions renvoient des entrées de contenu telles que définies par le type CollectionEntry
.
Accès aux données référencées
Titre de la section Accès aux données référencéesToutes les références définies dans votre schéma doivent être interrogées séparément après avoir interrogé votre entrée de collection. Vous pouvez utiliser à nouveau la fonction getEntry()
, ou getEntries()
, pour récupérer l’entrée référencée dans l’objet data
retourné.
Filtrer les requêtes sur les collections
Titre de la section Filtrer les requêtes sur les collectionsgetCollection()
prend un callback optionnel “filter” qui vous permet de filtrer votre requête basée sur les propriétés id
ou data
(frontmatter) d’une entrée. Pour les collections de type : 'content', vous pouvez aussi filtrer en fonction de
slug`.
La propriété slug
est spécifique aux collections de contenu, et ne sera pas disponible lors du filtrage des collections JSON ou YAML.
Vous pouvez utiliser cette propriété pour filtrer selon n’importe quel critère de contenu. Par exemple, vous pouvez filtrer par des propriétés telles que draft
pour empêcher la publication d’un brouillon d’article sur votre blog :
Vous pouvez également créer des pages provisoires qui sont disponibles lors de l’exécution du serveur de développement, mais qui ne sont pas construites dans la production :
L’argument filter permet également de filtrer les répertoires imbriqués dans une collection. Puisque id
inclut le chemin imbriqué complet, vous pouvez filtrer par le début de chaque id
pour ne renvoyer que les éléments d’un répertoire imbriqué spécifique :
Utilisation du contenu dans les modèles Astro
Titre de la section Utilisation du contenu dans les modèles AstroUne fois que vous avez interrogé les entrées de votre collection, vous pouvez accéder à chaque entrée directement dans votre modèle de composant Astro. Cela vous permet de rendre du HTML pour des choses comme des liens vers votre contenu (en utilisant le contenu slug
) ou des informations sur votre contenu (en utilisant la propriété data
).
Pour plus d’informations sur le rendu de votre contenu en HTML, voir Rendre le contenu en HTML ci-dessous.
Transmettre du contenu en tant que propriété
Titre de la section Transmettre du contenu en tant que propriétéUn composant peut également passer une entrée de contenu entière en tant que propriété.
Si vous faites cela, vous pouvez utiliser l’utilitaire CollectionEntry
pour taper correctement les propriétés de vos composants en utilisant TypeScript. Cet utilitaire prend un argument de type chaîne qui correspond au nom du schéma de votre collection, et hérite de toutes les propriétés du schéma de cette collection.
Rendre le contenu en HTML
Titre de la section Rendre le contenu en HTMLUne fois la requête effectuée, vous pouvez rendre les entrées Markdown et MDX en HTML en utilisant la propriété de fonction render()
de l’entrée. L’appel à cette fonction vous permet d’accéder au contenu rendu et aux métadonnées, y compris un composant <Contenu />
et une liste de tous les titres rendus.
Générer des routes à partir du contenu
Titre de la section Générer des routes à partir du contenuLes collections de contenu sont stockées en dehors du répertoire src/pages/
. Cela signifie qu’aucune route n’est générée par défaut pour les éléments de votre collection. Vous devrez créer manuellement une nouvelle route dynamique pour générer des pages HTML à partir des entrées de votre collection. Votre route dynamique va mettre en correspondance le paramètre de la requête entrante (ex : Astro.params.slug
dans src/pages/blog/[...slug].astro
) pour récupérer la bonne entrée à l’intérieur d’une collection.
La méthode exacte de génération des routes dépendra de votre mode de construction output
: ‘static’ (par défaut) ou ‘server’ (pour SSR).
Construire pour une sortie statique (par défaut)
Titre de la section Construire pour une sortie statique (par défaut)Si vous construisez un site web statique (le comportement par défaut d’Astro), vous devez utiliser la fonction getStaticPaths()
pour créer plusieurs pages à partir d’un seul composant src/pages/
pendant votre construction.
Appelez getCollection()
à l’intérieur de getStaticPaths()
pour interroger votre contenu ou votre collection de données. Ensuite, créez vos nouveaux chemins d’URL en utilisant la propriété slug
(collections de contenu) ou la propriété id
(collections de données) de chaque entrée de contenu.
Cela générera une nouvelle page pour chaque entrée de la collection blog
. Par exemple, une entrée dans src/content/blog/hello-world.md
aura un slug de hello-world
, et donc son URL finale sera /posts/hello-world/
.
Si vos slugs personnalisés contiennent le caractère /
pour produire des URLs avec plusieurs segments de chemin, vous devez utiliser un paramètre rest ([...slug]
) dans le nom de fichier .astro
pour cette page de routage dynamique.
Construction pour la sortie serveur (SSR)
Titre de la section Construction pour la sortie serveur (SSR)Si vous construisez un site web dynamique (en utilisant le support SSR d’Astro), vous n’êtes pas censé générer des chemins à l’avance pendant la construction. Au lieu de cela, votre page devrait examiner la requête (en utilisant Astro.request
ou Astro.params
) pour trouver le slug
à la demande, et ensuite le récupérer en utilisant getEntry()
.
Explorez le dossier src/pages/
présent dans la base de code du tutoriel Construire un blog sur GitHub ou ouvrez-le dans StackBlitz pour voir des exemples complets de création de pages utilisant vos collections pour ajouter des fonctionnalités de blog comme une liste d’articles de blog, des pages d’étiquettes, et plus encore !
Migration basée sur le routage des fichiers
Titre de la section Migration basée sur le routage des fichiersSi vous avez un projet Astro existant, comme un blog, qui utilise des fichiers Markdown ou MDX dans les sous-dossiers de src/pages/
, envisagez de migrer le contenu associé ou les fichiers de données vers des collections de contenus.
Regardez comment convertir un exemple de blog basique de src/pages/posts/
à src/content/posts
dans notre tutoriel étape par étape qui utilise la base de code du projet fini du tutoriel Construire un blog.
Activation de la génération de schémas JSON
Titre de la section Activation de la génération de schémas JSON
Ajouté à la version :
astro@4.13.0
Si vous travaillez avec des collections de type data
, Astro générera automatiquement des fichiers de schéma JSON pour votre éditeur afin d’obtenir IntelliSense et la vérification des types. Un fichier séparé sera créé pour chaque collection de données dans votre projet basé sur vos collections définies dans src/content/config.ts
en utilisant une bibliothèque appelée zod-to-json-schema
.
Cette fonctionnalité nécessite que vous définissiez manuellement le chemin d’accès au fichier de votre schéma comme valeur de $schema
dans chaque fichier de saisie de données de la collection :
Vous pouvez également définir cette valeur dans les paramètres de votre éditeur. Par exemple, pour définir cette valeur dans le paramètre json.schemas
de VSCode, indiquez le chemin des fichiers à faire correspondre et l’emplacement de votre schéma JSON :
Activation de la mise en cache de la construction
Titre de la section Activation de la mise en cache de la construction
Ajouté à la version :
astro@3.5.0
Experimentale
Si vous travaillez avec de grandes collections, vous pouvez activer la mise en cache avec l’option experimental.contentCollectionCache
. Cette fonctionnalité expérimentale optimise le processus de construction d’Astro, permettant aux collections inchangées d’être stockées et réutilisées entre les constructions.
Dans de nombreux cas, cela peut conduire à des améliorations significatives des performances de construction.
Pendant que cette fonctionnalité se stabilise, vous pouvez rencontrer des problèmes avec le cache stocké. Vous pouvez toujours réinitialiser votre cache de construction en exécutant la commande suivante :
Modifier le Frontmatter avec Remark
Titre de la section Modifier le Frontmatter avec RemarkDéconseillé. Les plugins Remark et rehype accèdent au raw du frontmatter du document Markdown ou MDX. Cela signifie que le document remarkPluginFrontmatter
est traité séparément de votre schema
sécurisé, et ne reflétera pas les changements ou les valeurs par défaut appliqués par Astro. Utilisez-le à vos risques et périls !
Astro supporte les plugins remark ou rehype qui modifient votre frontmatter directement. Vous pouvez accéder à ce frontmatter modifié à l’intérieur d’un contenu en utilisant la propriété remarkPluginFrontmatter
renvoyée par render()
:
Les pipelines remark et rehype ne s’exécutent que lorsque votre contenu est rendu, ce qui explique pourquoi remarkPluginFrontmatter
n’est disponible qu’après avoir appelé render()
sur votre entrée de contenu. En revanche, getCollection()
et getEntry()
ne peuvent pas retourner ces valeurs directement parce qu’ils ne rendent pas votre contenu.
Travailler avec des dates dans le frontmatter
Titre de la section Travailler avec des dates dans le frontmatterPlusieurs formats de date sont possibles dans les collections de contenus, mais le schéma de votre collection doit correspondre au format utilisé dans votre texte de présentation YAML Markdown ou MDX.
YAML utilise la norme ISO-8601 pour exprimer les dates. Utilisez le format yyyy-mm-dd
(par exemple 2021-07-28
) avec un type de schéma z.date()
:
Le format de la date sera spécifié en UTC si aucun fuseau horaire n’est fourni. Si vous devez spécifier un fuseau horaire, vous pouvez utiliser le format ISO 8601.
Pour ne rendre que le YYY-MM-DD
de l’horodatage UTC complet, utilisez la méthode JavaScript slice
pour supprimer l’horodatage :
Pour voir un exemple d’utilisation de toLocaleDateString
pour formater le jour, le mois et l’année à la place, voir le <FormattedDate />
component dans le modèle officiel du blog Astro.