← Tüm yazılar

Astro içerik katmanı ile blog

1 dk okuma Yazılım

Astro 5’in içerik katmanı (content layer), markdown dosyalarını tipli bir koleksiyona çeviriyor. Şema zod ile tanımlanıyor, yani frontmatter’daki bir yazım hatası çalışma zamanında değil, build sırasında patlıyor.

Koleksiyon tanımı

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

const posts = defineCollection({
  loader: glob({ pattern: "**/*.md", base: "./content/posts" }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    category: z.string().optional(),
    draft: z.boolean().default(false),
  }),
});

export const collections = { posts };

z.coerce.date() sayesinde frontmatter’a 2026-08-24 yazmak yetiyor; şema bunu bir Date nesnesine çeviriyor ve post.data.date.getTime() doğrudan çalışıyor.

Okuma süresi

Okuma süresini çalışma zamanında hesaplamak gereksiz — metin build zamanında zaten elimizde. Küçük bir remark eklentisi bunu frontmatter’a yazıyor:

import getReadingTime from "reading-time";
import { toString } from "mdast-util-to-string";

export function remarkReadingTime() {
  return (tree, file) => {
    const { minutes } = getReadingTime(toString(tree));
    file.data.astro.frontmatter.readingTime =
      `${Math.max(1, Math.round(minutes))} dk okuma`;
  };
}

Sayfa tarafında render() bunu geri veriyor:

const { Content, remarkPluginFrontmatter } = await render(post);

Taslaklar

draft: true olan yazılar geliştirirken görünsün ama yayına çıkmasın istiyorsan filtreyi import.meta.env.PROD ile koşullandırman yeterli:

const posts = await getCollection("posts", ({ data }) =>
  import.meta.env.PROD ? !data.draft : true,
);

Sonuç: sıfır çalışma zamanı JavaScript’i, tam tipli içerik ve tek bir markdown işleme hattı.