Da Astro 5 a Astro 6

Astro 6 è un major: porta miglioramenti di performance, ma rimuove il vecchio sistema di content collection a cartella. Se aggiorni un sito che usava src/content/config.ts, il build si ferma finché non migri. Ecco cosa ho cambiato su questo sito.

1. La config cambia posto

Il file di configurazione delle collection non sta più in src/content/config.ts: ora va in src/content.config.ts (un livello più su, fuori dalla cartella dei contenuti).

2. Loader esplicito con glob

Le collection non vengono più caricate “magicamente” dalla cartella: serve un loader. Per i file Markdown locali si usa glob():

import { defineCollection, z } from "astro:content";
import { glob } from "astro/loaders";

const articoli = defineCollection({
  loader: glob({ pattern: "**/*.md", base: "./src/content/articoli" }),
  schema: z.object({ /* ... */ }),
});

3. slug diventa id

Nella nuova Content Layer API ogni voce non ha più entry.slug: si usa entry.id. Ho aggiornato tutte le pagine [slug], i feed RSS/Atom, la sitemap e le immagini OG di conseguenza. Per non cambiare gli URL ho impostato un generateId che mantiene gli ID identici ai vecchi slug.

4. render() al posto di entry.render()

Per renderizzare il corpo Markdown non si chiama più entry.render(), ma si importa render da astro:content:

import { render } from "astro:content";
const { Content } = await render(entry);

Conclusione

La migrazione è meccanica ma tocca molti file. Una volta sistemati config, id, loader e render(), tutto torna a compilare e gli URL restano invariati. Vale l’aggiornamento: si resta sull’ultima versione, con la Content Layer pronta anche per sorgenti esterne (CMS, API) in futuro.