Skip to content

MDX Kullanımı Ve Blog URL

Bu belge, Falcon’da MDX ve Content Collections’ın neden eklendiğini, nasıl kurulduğunu, blog URL’lerinin nasıl üretildiğini ve ne zaman nasıl kullanılacağını anlatır.


MDX, Markdown’a JSX eklemenizi sağlar. Normal .md dosyasında başlık, liste, link yazarsınız; .mdx dosyasında gerektiğinde Astro/React bileşeni de kullanırsınız.

Falcon’da MDX şu amaçla kuruldu:

  • Blog, rehber, uzun metin içeriklerini koddan ayırmak
  • İçeriği src/content/ altında toplamak (build zamanında okunur)
  • Frontmatter alanlarını şema ile doğrulamak (eksik title vb. build’de hata verir)
  • İçeriği Git + MDX ile yönetmek (harici CMS planlanmıyor)

MDX, Fix UI veya Tailwind’in yerine geçmez. Yalnızca içerik formatıdır; sayfa kabuğu .astro layout + BlogPostView ile gelir.


Terminal window
npm install @astrojs/mdx
import mdx from '@astrojs/mdx';
export default defineConfig({
integrations: [react(), mdx()],
});

react() zaten vardı; MDX içinde React bileşeni kullanacaksanız ikisi birlikte kalır.

Content Collections tanımı:

import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';
const blog = defineCollection({
loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
schema: z.object({
title: z.string(),
description: z.string(),
pubDate: z.coerce.date(),
}),
});
export const collections = { blog };

src/content/blog/welcome.mdx:

---
title: Welcome to MDX
description: Example blog entry
pubDate: 2026-05-18
---
# Welcome to MDX
Markdown metni burada.

welcome.mdx (içerik + frontmatter)
content.config.ts (şema doğrular)
getCollection('blog') → liste sayfası
render(entry) → tekil yazı (BlogPostView)
BaseLayout.astro (kabuk) + PageShell + prose
  • İçerik build sırasında okunur; veritabanı yoktur.
  • astro:content modülü tipleri otomatik üretir (.astro/content.d.ts).

SayfaDosyaURL
Listesrc/pages/blog/index.astro (+ locale mirror’lar)/blog, /tr/blog, …
Tekil yazısrc/pages/blog/[...slug].astro/blog/{id}/

Liste ve detay BlogIndexView / BlogPostView bileşenlerini kullanır; tekil yazıda MDX gövdesi prose ile basılır.


src/components/blog/BlogPostView.astro (özet):

---
import PageShell from '@/components/layout/PageShell.astro';
const { Content } = await render(post);
---
<PageShell narrow class="flex flex-col gap-8">
<h1 class="m-0 text-3xl font-extrabold sm:text-4xl">{title}</h1>
<p class="text-xl text-muted-foreground">{description}</p>
<article class:list={['prose max-w-none dark:prose-invert', /* prose-* modifier’lar */]}>
<Content />
</article>
</PageShell>
  • Başlık / açıklama → Tailwind utility
  • Gövde → @tailwindcss/typography (prose)
  • Layout → PageShell

Ayrıntı: Yazı Stilleri.


import Button from '@/components/ui/Button.astro';
<Button variant="primary">CTA</Button>

React bileşeni için client:* direktifi gerekir — React Kullanımı.


  • MDX dosyası stil içermez; görünüm BlogPostView ve global CSS’ten gelir.
  • Liste sayfasında PageShell, Button, Card kullanılabilir.
  • Uzun yazı gövdesi prose sarmalayıcıdan gelir — fix-prose kullanılmaz.

YapYapma
İçeriği src/content/ altında tutBlog metnini pages/ içine göm
Frontmatter’ı şemaya uygun yazŞemada olmayan alanı keyfi ekle
Kabuk için BlogPostView / layoutHer yazı için ayrı tam HTML sayfa
.md basit metin, .mdx bileşen gerekiyorsaHer şeyi .mdx yapma

  • npm run build hatasız
  • src/content/blog/*.mdx mevcut
  • src/content.config.ts içinde blog koleksiyonu tanımlı
  • astro.config.mjs içinde mdx()
  • /blog ve tekil yazı URL’si açılmalı

MDX = içerik formatı; Content Collections = organize katman; görünüm = BlogPostView + PageShell + prose. Kurulum: @astrojs/mdx + content.config.ts + src/content/blog/ + route mirror’lar.