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ı.