Next.js से MDX ब्लॉग खुद बनाना - यह ब्लॉग कैसे बना
बिना CMS के सिर्फ़ मार्कडाउन फ़ाइलों से चलने वाला ब्लॉग Next.js 16 App Router से बनाने की पूरी प्रक्रिया। फ़ोल्डर स्ट्रक्चर, MDX सेटअप और SEO तक, असल कोड फ़्लो के साथ समझाया है।
मुख्य सारांश
पोस्ट को src/content/posts के नीचे .mdx फ़ाइल के रूप में रखें और @next/mdx से रेंडर करें, तो बिना CMS के भी ब्लॉग चल जाता है। फ़ाइल ही URL है, frontmatter की जगह meta export से लिस्ट और मेटाडेटा बनते हैं।
इस पेज पर
अभी आप जो ब्लॉग पढ़ रहे हैं, उसमें न कोई डेटाबेस है, न कोई एडमिन पैनल। हर पोस्ट बस एक मार्कडाउन फ़ाइल है। कैसे बनाया, वह पूरा यहां खोलकर बता रहा हूं।
फ़ाइल-बेस्ड क्यों
ब्लॉग टूल बहुत सारे हैं, लेकिन सोलो डेवलपर के लिए ज़्यादातर ज़रूरत से ज़्यादा भारी हैं।
- CMS: एडमिन पैनल, इंटीग्रेशन और फ़ीस साथ आती हैं
- Notion इंटीग्रेशन: आसान है, लेकिन रेंडरिंग, स्पीड और कस्टमाइज़ेशन में अटक जाता है
- मार्कडाउन फ़ाइलें: पोस्ट कोड के साथ वर्ज़न कंट्रोल में रहती हैं, मुफ़्त हैं, और
git pushही पब्लिश है
मैंने तीसरा चुना। friction सबसे कम है।
फ़ोल्डर स्ट्रक्चर
मुख्य हिस्सा देखें तो कुछ ऐसा दिखता है।
src/
├── app/
│ ├── page.tsx # 홈 - 글 목록
│ ├── posts/[slug]/page.tsx # 글 상세
│ └── sitemap.ts # /sitemap.xml
├── content/posts/*.mdx # ← 글은 여기에만 추가
└── lib/posts.ts # 목록·메타 로딩
फ़ाइल का नाम ही URL बन जाता है। hello.mdx खुलती है /posts/hello पर।
MDX सेटअप
App Router में MDX इस्तेमाल करने के लिए @next/mdx जोड़ते हैं। Next 16 में Turbopack डिफ़ॉल्ट है, इसलिए remark/rehype प्लगइन को स्ट्रिंग नाम के रूप में पास करना पड़ता है (फ़ंक्शन रेफ़रेंस पास नहीं कर सकते)।
const withMDX = createMDX({
options: {
remarkPlugins: ["remark-gfm"], // 표·취소선 지원
rehypePlugins: ["rehype-slug"], // 제목 앵커
},
})
frontmatter की जगह meta export
आम तौर पर मार्कडाउन के ऊपर --- ब्लॉक (frontmatter) में टाइटल और डेट लिखते हैं, लेकिन MDX में जावास्क्रिप्ट समा सकती है, इसलिए एक और साफ़ तरीक़ा है। बस ऑब्जेक्ट को export कर देना।
export const meta = {
title: "글 제목",
date: "2026-07-06",
category: "dev",
}
## 본문 시작
लिस्ट पेज पर हर फ़ाइल को dynamic import करके सिर्फ़ यह meta पढ़ते हैं।
const mod = await import(`@/content/posts/${slug}.mdx`)
return mod.meta // 본문 렌더 없이 메타만
न पार्सिंग लाइब्रेरी चाहिए, न अलग से कोई इंडेक्स।
SEO शुरुआत से ही
अगर ब्लॉग का मक़सद ट्रैफ़िक लाना है, तो SEO बाद में नहीं, शुरुआत में ही डालना चाहिए। मैंने हर पोस्ट के मेटाडेटा, Open Graph और JSON-LD स्ट्रक्चर्ड डेटा के साथ sitemap.xml, robots.txt और rss.xml तक बुनियादी तौर पर लगा दिए। इस पर अगली पोस्ट में और विस्तार से बात करूंगा।
सार
- पोस्ट = एक
.mdxफ़ाइल, फ़ाइल का नाम ही URL @next/mdx+ स्ट्रिंग प्लगइन (Turbopack)- frontmatter की जगह
export const meta - SEO पहले कमिट से ही
इसी स्ट्रक्चर से आपका ब्लॉग भी 30 मिनट में खड़ा हो सकता है। मैं इसी तरीक़े से आज की लहर जैसे प्रोडक्ट की कहानियां लगातार जमा कर रहा हूं।
अक्सर पूछे जाने वाले सवाल
CMS की जगह MDX फ़ाइलें क्यों इस्तेमाल करते हैं?
पोस्ट कोड के साथ वर्ज़न कंट्रोल में रहती हैं, मुफ़्त है, और डिप्लॉय ही पब्लिश है, इसलिए सोलो डेवलपर के लिए सबसे कम friction वाला तरीक़ा है। इमेज, कोड और कंपोनेंट भी आज़ादी से डाल सकते हैं।
frontmatter के बिना लिस्ट कैसे बनाते हैं?
हर .mdx के ऊपर meta ऑब्जेक्ट export करें, और लिस्ट पेज पर फ़ाइल को dynamic import करके सिर्फ़ वह meta पढ़ लें। अलग से किसी पार्सिंग लाइब्रेरी की ज़रूरत नहीं पड़ती।
संबंधित लेख
- 💻 डेवलपमेंट
एक bucket के मालिक दो हों, तो आखिरी apply करने वाला जीतता है
S3 lifecycle का एक rule जोड़ते ही terraform apply fail हो गया। वजह थी वह structure जिसमें एक ही bucket की lifecycle configuration के मालिक दो resources थे। S3 lifecycle rule स्तर पर नहीं, document स्तर पर चलता है, इसलिए आखिरी विजेता दूसरे के rules चुपचाप मिटा देता है।
- 💻 डेवलपमेंट
Test हरे थे, पर notification एक बार भी नहीं गया था
Queue में job डालने वाला code पहले दिन से हर बार fail हो रहा था। error निगल लिया गया, और mock की बदौलत test हरे रहते थे। एक colon ने तीन feature चुपचाप मार दिए, यह उसी की कहानी है।
- 💻 डेवलपमेंट
अलर्ट आया कि DB मर गया। DB कभी मरा ही नहीं था
एक ही दिन में चार CRITICAL अलर्ट जमा हो गए। 504, Prisma P2028, एडमिन 500, और 'DATABASE सर्विस डाउन'। सबसे पहले RDS मेट्रिक खोले तो 21 घंटे तक CPU अधिकतम 19.7% पर बिल्कुल ठीक चल रहा था। धीमा DB नहीं था, धीमी थी वह राउंड ट्रिप जो एक रिक्वेस्ट में पच्चीस बार अटलांटिक पार करती थी। और 'डाउन' वाला अलर्ट हेल्थ चेक ने ख़ुद ही पैदा किया था।