Collections de contenus
Ajouté à la version :
astro@2.0.0
Les collections de contenu sont le meilleur moyen de gérer des ensembles de contenu dans n’importe quel projet Astro. Les collections aident à organiser et à interroger vos documents, à activer Intellisense et la vérification de type dans votre éditeur et à fournir une sûreté du typage TypeScript automatique pour tout votre contenu. Astro v5.0 a introduit l’API Content Layer pour définir et interroger les collections de contenu. Cette API performante et évolutive fournit des chargeurs de contenu intégrés pour vos collections locales. Pour le contenu distant, vous pouvez utiliser des chargeurs tiers et créés par la communauté ou créer votre propre chargeur personnalisé et extraire vos données à partir de n’importe quelle source.
Les projets peuvent continuer à utiliser l’API de collections de contenu héritée introduite dans Astro v2.0. Cependant, nous vous encourageons à mettre à jour les collections existantes lorsque vous le pouvez.
Que sont les collections de contenu ?
Titre de la section Que sont les collections de contenu ?Vous pouvez définir une collection à partir d’un ensemble de données structurellement similaires. Il peut s’agir d’un répertoire d’articles de blog, d’un fichier JSON de produits ou de toute donnée représentant plusieurs éléments de la même forme.
Les collections stockées localement dans votre projet ou sur votre système de fichiers peuvent contenir des entrées de fichiers Markdown, MDX, Markdoc ou JSON :
Répertoiresrc/
- …
Répertoirenewsletter/ la collection “newsletter”
- week-1.md une entrée de collection
- week-2.md une entrée de collection
- week-3.md une entrée de collection
Répertoireauthors/ la collection “author”
- authors.json un fichier unique contenant toutes les entrées de la collection
Avec un chargeur de collection approprié, vous pouvez récupérer des données distantes à partir de n’importe quelle source externe, telle qu’un CMS, une base de données ou un système de paiement sans tête.
Configuration TypeScript pour les collections
Titre de la section Configuration TypeScript pour les collectionsLes collections de contenu s’appuient sur TypeScript pour fournir la validation Zod, Intellisense et la vérification de type dans votre éditeur. Si vous n’étendez pas l’un des paramètres TypeScript strict
ou strictest
d’Astro, vous devrez vous assurer que compilerOptions
définisse les options suivantesdans votre fichier tsconfig.json
:
Définition des collections
Titre de la section Définition des collectionsLes collections individuelles utilisent defineCollection()
pour configurer :
- un chargeur (
loader
) pour une source de données (obligatoire) - un schéma (
schema
) pour la sûreté du typage (facultatif, mais fortement recommandé !)
Le fichier de configuration des collections
Titre de la section Le fichier de configuration des collectionsPour définir des collections, vous devez créer un fichier src/content.config.ts
dans votre projet (les extensions .js
et .mjs
sont également prises en charge). Il s’agit d’un fichier spécial qu’Astro utilisera pour configurer vos collections de contenu en fonction de la structure suivante :
Définir le loader
de collection
Titre de la section Définir le loader de collectionL’API Content Layer vous permet de récupérer votre contenu (qu’il soit stocké localement dans votre projet ou à distance) et utilise une propriété loader
pour récupérer vos données.
Chargeurs intégrés
Titre de la section Chargeurs intégrésAstro fournit deux fonctions de chargement intégrées (glob()
et file()
) pour récupérer votre contenu local, ainsi qu’un accès à l’API pour construire votre propre chargeur et récupérer des données distantes.
Le chargeur glob()
crée des entrées à partir de répertoires de fichiers Markdown, MDX, Markdoc ou JSON à partir de n’importe quel endroit du système de fichiers. Il accepte un pattern
de fichiers d’entrée à faire correspondre et un chemin de fichier base
indiquant où se trouvent vos fichiers. L’id
de chaque entrée sera automatiquement généré à partir de son nom de fichier. Utilisez ce chargeur lorsque vous avez un fichier par entrée.
Le chargeur file()
crée plusieurs entrées à partir d’un seul fichier local. Chaque entrée du fichier doit avoir une propriété de clé id
unique. Il accepte un chemin de fichier base
vers votre fichier et éventuellement une fonction parser
pour les fichiers de données qu’il ne peut pas analyser automatiquement. Utilisez ce chargeur lorsque votre fichier de données peut être analysé comme un tableau d’objets.
Fonction parser
Titre de la section Fonction parserLe chargeur file()
accepte un second argument qui définit une fonction parser
. Cela vous permet de spécifier un analyseur personnalisé (par exemple toml.parse
ou csv-parse
) pour créer une collection à partir du contenu d’un fichier.
Le chargeur file()
détectera et analysera automatiquement un seul tableau d’objets à partir de fichiers JSON et YAML (en fonction de leur extension de fichier) sans avoir besoin d’un parser
à moins que vous n’ayez un document JSON imbriqué. Pour utiliser d’autres fichiers, tels que .toml
et .csv
, vous aurez besoin de créer une fonction d’analyse.
L’exemple suivant définit une collection de contenu dogs
à l’aide d’un fichier .toml
:
Après avoir importé l’analyseur de TOML, vous pouvez charger la collection dogs
dans votre projet en transmettant à la fois un chemin de fichier et la fonction parser
au chargeur file()
. Un processus similaire peut être utilisé pour définir une collection cats
à partir d’un fichier .csv
:
Documents .json
imbriqués
Titre de la section Documents .json imbriquésL’argument parser
vous permet également de charger une seule collection à partir d’un document JSON imbriqué. Par exemple, ce fichier JSON contient plusieurs collections :
Vous pouvez séparer ces collections en passant un parser
personnalisé au chargeur file()
pour chaque collection :
Construire un chargeur personnalisé
Titre de la section Construire un chargeur personnaliséVous pouvez créer un chargeur personnalisé pour récupérer du contenu distant à partir de n’importe quelle source de données, telle qu’un CMS, une base de données ou un point de terminaison d’API.
L’utilisation d’un chargeur pour récupérer vos données créera automatiquement une collection à partir de vos données distantes. Cela vous offre tous les avantages des collections locales, tels que les assistants API spécifiques aux collections tels que getCollection()
et render()
pour interroger et afficher vos données, ainsi que la validation de schéma.
Recherchez des chargeurs créés par la communauté et des tiers dans le répertoire des intégrations Astro.
Chargeurs en ligne
Titre de la section Chargeurs en ligneVous pouvez définir un chargeur en ligne, à l’intérieur de votre collection, comme une fonction asynchrone qui renvoie un tableau d’entrées.
Ceci est utile pour les chargeurs qui n’ont pas besoin de contrôler manuellement la manière dont les données sont chargées et stockées. Chaque fois que le chargeur est appelé, il efface le magasin et recharge toutes les entrées.
Les entrées renvoyées sont stockées dans la collection et peuvent être interrogées à l’aide des fonctions getCollection()
et getEntry()
.
Objets de chargement
Titre de la section Objets de chargementPour un meilleur contrôle du processus de chargement, vous pouvez utiliser l’API Content Loader pour créer un objet de chargement. Par exemple, avec un accès direct à la méthode load
, vous pouvez créer un chargeur qui permet de mettre à jour les entrées de manière incrémentielle ou d’effacer le magasin uniquement lorsque cela est nécessaire.
Similairement à la création d’une intégration Astro ou d’un plugin Vite, vous pouvez distribuer votre chargeur sous forme de paquet NPM que d’autres peuvent utiliser dans leurs projets.
Définition d’un schéma de collection
Titre de la section Définition d’un schéma de collectionLes schémas garantissent la cohérence des données du frontmatter ou d’entrée au sein d’une collection via la validation Zod. 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 viole son schéma de collection, Astro fournira une erreur utile pour vous en informer.
Les schémas alimentent également les typages automatiques TypeScript 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. Le résultat est une prise en charge complète de TypeScript lorsque vous interrogez votre collection, y compris la saisie semi-automatique des propriétés et la vérification des types.
Chaque frontmatter ou propriété de données de vos entrées de collection doit être défini à l’aide d’un type de données Zod :
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 les données de chaque fichier au sein d’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 elle prend en charge toutes les fonctionnalités de Zod.
Méthodes de schéma Zod
Titre de la section Méthodes de schéma ZodToutes les méthodes de schéma Zod (e.g. .parse()
, .transform()
) sont disponibles, avec certaines limitations. Notamment, l’exécution de contrôles de validation personnalisés sur les images à l’aide de image().refine()
n’est pas prise en charge.
Définition des références de collection
Titre de la section Définition des références de collectionLes entrées de collection peuvent également « faire référence » à d’autres entrées associées.
Avec la fonction reference()
de l’API Collections, vous pouvez définir une propriété dans un schéma de collection en tant qu’entrée d’une autre collection. Par exemple, vous pouvez exiger que chaque entrée space-shuttle
inclue une propriété pilot
qui utilise le schéma propre à la collection pilot
pour la vérification du type, la saisie semi-automatique et la validation.
Un exemple courant est un article de blog qui fait référence à des profils d’auteur réutilisables stockés au format JSON ou à des URL d’articles associés stockées dans la même collection :
Cet exemple d’article de blog spécifie les id
des articles associés et l’id
de l’auteur de l’article :
Définition d’identifiants personnalisés
Titre de la section Définition d’identifiants personnalisésLors de l’utilisation du chargeur glob()
avec des fichiers Markdown, MDX, Markdoc ou JSON, chaque id
d’entrée de contenu est automatiquement généré dans un format compatible URL basé sur le nom du fichier de contenu. L’id
est utilisé pour interroger l’entrée directement à partir de votre collection. Il est également utile lors de la création de nouvelles pages et URL à partir de votre contenu.
Vous pouvez remplacer l’identifiant généré par une entrée en ajoutant votre propre propriété slug à la page de garde du fichier ou à l’objet de données pour les fichiers JSON. Ceci est similaire à la fonctionnalité « permalien » d’autres frameworks Web.
Interroger les collections
Titre de la section Interroger les collectionsAstro fournit des fonctions d’aide pour interroger une collection et renvoyer une (ou plusieurs) entrées de contenu.
getCollection()
récupère une collection entière et renvoie un tableau d’entrées.getEntry()
récupère une seule entrée d’une collection.
Ces entrées de retour contiennent un id
unique, un objet data
avec toutes les propriétés définies et renverront également un body
contenant le corps brut et non compilé d’un document Markdown, MDX ou Markdoc.
CollectionEntry
.
Utilisation du contenu dans les modèles Astro
Titre de la section Utilisation du contenu dans les modèles AstroAprès avoir interrogé vos collections, vous pouvez accéder au contenu de chaque entrée directement dans votre modèle de composant Astro. Par exemple, vous pouvez créer une liste de liens vers vos articles de blog, en affichant les informations de la page de garde de votre entrée à l’aide de la propriété data
.
Restitution du contenu
Titre de la section Restitution du contenuUne fois la requête effectuée, vous pouvez restituer les entrées Markdown et MDX en HTML à l’aide de la propriété de fonction render()
. L’appel de cette fonction vous donne accès au contenu HTML restitué, y compris à la fois un composant <Content />
et une liste de tous les titres restitués.
Transmettre du contenu en tant que props
Titre de la section Transmettre du contenu en tant que propsUn composant peut également transmettre une entrée de collection entière en tant que propriété.
Vous pouvez utiliser l’utilitaire CollectionEntry
pour saisir correctement les propriétés de votre composant à l’aide de TypeScript. Cet utilitaire prend un argument de chaîne qui correspond au nom de votre schéma de collection et héritera de toutes les propriétés du schéma de cette collection.
Filtrer les requêtes sur les collections
Titre de la section Filtrer les requêtes sur les collectionsgetCollection()
prend une fonction de rappel facultative « filter » qui vous permet de filtrer votre requête en fonction des propriétés id
ou data
d’une entrée.
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 :
Accès aux données référencées
Titre de la section Accès aux données référencéesToutes références définies dans votre schéma doivent être interrogées séparément après la première interrogation de votre entrée de collection. Vous pouvez utiliser la fonction getEntry()
pour renvoyer un seul élément référencé ou getEntries()
pour récupérer plusieurs entrées référencées à partir de l’objet data
renvoyé.
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 page ou route n’est générée par défaut pour vos éléments de collection.
Vous devrez créer manuellement une nouvelle route dynamique si vous souhaitez générer des pages HTML pour chacune de vos entrées de collection, telles que des articles de blog individuels. 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 du fait que vos pages sont pré-rendues (par défaut) ou rendues à la demande par un serveur.
Construire pour une sortie statique (par défaut)
Titre de la section Construire pour une sortie statique (par défaut)Si vous créez un site Web statique (comportement par défaut d’Astro), utilisez la fonction getStaticPaths()
pour créer plusieurs pages à partir d’un seul composant de page (par exemple src/pages/[slug]
) pendant votre création.
Appelez getCollection()
à l’intérieur de getStaticPaths()
pour que vos données de collection soient disponibles pour la création de routes statiques. Ensuite, créez les chemins d’URL individuels à l’aide de la propriété id
de chaque entrée de contenu. Chaque page reçoit l’entrée de collection entière en tant que propriété à utiliser dans votre modèle de page.
Cela générera une route de page pour chaque entrée de la collection blog
. Par exemple, une entrée dans src/blog/hello-world.md
aura un id
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 (par exemple [...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/
du code de démonstration du tutoriel du blog sur GitHub pour voir des exemples complets de création de pages à partir de vos collections pour des fonctionnalités de blog telles qu’une liste d’articles de blog, des pages de balises, etc.
Quand créer une collection
Titre de la section Quand créer une collectionVous pouvez créer une collection à chaque fois que vous disposez d’un groupe de données ou de contenus associés qui partagent une structure commune.
Une grande partie des avantages liés à l’utilisation des collections provient de :
- Définir une forme de données commune pour valider qu’une entrée individuelle est « correcte » ou « complète », évitant ainsi les erreurs de production.
- API axées sur le contenu conçues pour rendre les requêtes intuitives (par exemple,
getCollection()
au lieu deimport.meta.glob()
) lors de l’importation et du rendu du contenu sur vos pages. - Une API de chargement de contenu pour récupérer votre contenu qui fournit à la fois des chargeurs intégrés et un accès à l’API de bas niveau. Il existe plusieurs chargeurs tiers et communautaires disponibles, et vous pouvez créer votre propre chargeur personnalisé pour récupérer des données de n’importe où.
- Performances et évolutivité. L’API Content Layer permet de mettre en cache les données entre les builds et convient à des dizaines de milliers d’entrées de contenu.
Définissez vos données comme une collection lorsque :
- Vous avez plusieurs fichiers ou données à organiser qui partagent la même structure globale (par exemple, des articles de blog écrits en Markdown qui ont tous les mêmes propriétés de frontmatter).
- Vous disposez d’un contenu existant stocké à distance, par exemple dans un CMS, et vous souhaitez profiter des fonctions d’assistance des collections et de l’API Content Layer au lieu d’utiliser
fetch()
ou des SDK. - Vous devez récupérer (des dizaines de) milliers de données connexes et avez besoin d’une méthode d’interrogation et de mise en cache capable de gérer à grande échelle.
Quand ne pas créer une collection
Titre de la section Quand ne pas créer une collectionLes collections offrent une excellente structure, sécurité et organisation lorsque vous avez plusieurs éléments de contenu qui doivent partager les mêmes propriétés.
Les collections ne sont peut-être pas votre solution si :
- Vous n’avez qu’une seule page ou un petit nombre de pages différentes. Envisagez plutôt de créer des composants de page individuels tels que
src/pages/about.astro
directement avec votre contenu. - Vos données ne sont pas stockées dans un format pris en charge, tel que TOML. Utilisez plutôt d’autres méthodes d’importation de fichiers ou de récupération de données.
- Vous affichez des fichiers qui ne sont pas traités par Astro, comme des fichiers PDF. Placez plutôt ces ressources statiques dans le répertoire
public/
de votre projet. - Vous utilisez des API qui doivent être mises à jour en temps réel. Les collections de contenu ne sont mises à jour qu’au moment de la création. Par conséquent, si vous avez besoin de données en direct, vous devez envisager le rendu à la demande (EN).