Astro 5 (in beta a settembre 2024) ha portato il Content Layer: una API unificata per leggere contenuti da qualunque sorgente (file Markdown, Sanity, Notion, REST API) come se fossero collection tipizzate.
Il problema che risolve
Prima di Astro 5 le content collection lavoravano solo su file locali. Per integrare Sanity o un'API esterna serviva codice ad hoc, niente type-safety, niente getCollection(). Risultato: progetti misti dove metà contenuti erano in .md e l'altra metà in fetch sparsi.
Come funziona
Definisci un loader per ogni sorgente, e Astro lo materializza in una collection consistente.
// src/content/config.ts
const articles = defineCollection({
loader: sanityLoader({ query: '*[_type == "article"]' }),
schema: z.object({ title: z.string(), slug: z.string() }),
});
Da qui in poi getCollection('articles') restituisce dati tipizzati a build time.
I loader esistenti
- File Markdown / MDX (built-in)
- Sanity (community)
- Contentful (community)
- Notion (community)
- REST/GraphQL custom (10 righe di codice)
Quando ci interessa
Per progetti dove i contenuti vivono in più posti (CMS principale + repo + database interno), il Content Layer toglie 200 righe di "glue code" e dà una sola superficie di lettura. Per siti puramente Markdown il guadagno è marginale; per progetti reali editoriali è grande.
Cosa aspettare
L'API è ancora beta nella 5.0. La 5.1 dovrebbe stabilizzarla con qualche miglioramento sull'incremental rebuild. Per progetti che partono ora, vale la pena adottarla — il design è solido.