JT
← Terug naar overzicht

De Astro Content Layer API: collecties zonder beperkingen

Door Trine

astro content-layer javascript static-site

Astro 5.0 introduceerde een fundamentele herinrichting van het content-systeem: de Content Layer API. Waar de oude defineCollection je beperkte tot bestanden in src/content/, kun je nu met loaders data ophalen vanuit elke gewenste bron.

Hoe de nieuwe API eruitziet

De configuratie verhuist van src/content/config.ts naar src/content.config.ts (direct in src/). De kern is de loader-optie:

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

const blog = defineCollection({
  loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
  schema: z.object({
    title: z.string(),
    pubDate: z.coerce.date(),
    tags: z.array(z.string()).optional(),
  }),
});

export const collections = { blog };

De glob-loader is de ingebouwde vervanger voor het oude bestandsgebaseerde systeem. Maar je kunt ook custom loaders schrijven.

Een custom loader voor een externe API

Stel je haalt berichten op uit een headless CMS:

import type { Loader } from "astro/loaders";

const cmsLoader: Loader = {
  name: "cms-loader",
  async load({ store, logger }) {
    logger.info("Berichten ophalen uit CMS...");
    const res = await fetch("https://mijn-cms.nl/api/posts");
    const posts = await res.json();

    store.clear();
    for (const post of posts) {
      store.set({ id: post.slug, data: post });
    }
  },
};

Door store.clear() te roepen voor elke build zorg je ervoor dat verwijderde berichten ook daadwerkelijk uit de collectie verdwijnen.

Data opvragen in pagina’s

De query-API is nagenoeg hetzelfde als voorheen:

---
import { getCollection } from "astro:content";

const posts = await getCollection("blog");
const gesorteerd = posts.sort(
  (a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf(),
);
---

Voordelen ten opzichte van de oude aanpak

AspectOud systeemContent Layer
DatabronnenAlleen lokale bestandenBestanden, API’s, databases
Configuratielocatiesrc/content/config.tssrc/content.config.ts
LoadersIngebouwd, niet uitbreidbaarVolledig pluggable
Incrementele updatesNiet ondersteundVia store.set() mogelijk

Conclusie

De Content Layer API maakt Astro aanzienlijk flexibeler als data-laag. Of je nu Markdown-bestanden, een headless CMS of een eigen database gebruikt: het schema-validatiemechanisme via Zod blijft consistent. Dat is precies de kracht van de aanpak.