- Published on
Membangun Sistem Konten dengan MDX Router (Next.js, TypeScript, Tailwind)
- Authors
Membangun Sistem Konten dengan MDX Router (Next.js, TypeScript, Tailwind)
- BAB 1 — MDX Router Itu Apa (Fundamental)
- BAB 2 — Setup Minimal yang Benar
- BAB 3 — Frontmatter vs Content (Core Knowledge)
- 3.1 Struktur Dasar MDX
- 3.2 Frontmatter: Metadata, Bukan Tampilan
- 3.3 Content: Narasi & Presentasi
- 3.4 Mekanisme Internal: Kenapa Dipisah?
- 3.5 Kenapa Frontmatter Tidak Otomatis SEO?
- 3.6 Posisi Frontmatter dalam Arsitektur SEO
- 3.7 Dampak Jika Frontmatter & Content Dicampur
- 3.8 Menyiapkan Pembaca ke Tahap Lanjut
- BAB 4 — Layout yang Sering Disalahpahami
- 4.1 Tiga Hal yang Sering Dicampur (Dan Seharusnya Dipisah)
- 4.2 Layout App Router: Struktur Halaman
- 4.3 MDX Content: Tidak Tahu Layout
- 4.4
prose: Keputusan Halaman, Bukan Konten - 4.5 MDX Components: Level yang Berbeda
- 4.6 Hirarki yang Benar (Ini Kunci Bab Ini)
- 4.7 Kenapa Ini Masalah Arsitektur, Bukan Styling
- 4.8 Nilai Utama dari Contoh
/tools/layout.tsx
- BAB 5 — Dynamic Route: Apa yang Bisa & Tidak
- BAB 6 — SEO: Frontmatter Bukan Jawaban Akhir
- 6.1 Kesalahan Umum: Frontmatter = SEO
- 6.2 Bagaimana Next.js Menghasilkan Metadata SEO
- 6.3 Posisi Frontmatter yang Sebenarnya
- 6.4 Arsitektur SEO yang Benar (Mental Model)
- 6.5 Pendekatan Minimal (Tanpa Contentlayer)
- 6.6 Keterbatasan Pendekatan Manual
- 6.7 Contentlayer sebagai Solusi Evolusioner
- 6.8 Inti Bab Ini
- BAB 7 — Kapan MDX Router Cukup, Kapan Tidak
- 🌐 Dokumentasi & Referensi Resmi
- Catatan Penyusunan
BAB 1 — MDX Router Itu Apa (Fundamental)
Sebelum membahas konfigurasi, layout, atau SEO, satu hal harus dibereskan terlebih dahulu: cara berpikir tentang MDX Router itu sendiri.
Banyak kebingungan dan desain keliru muncul bukan karena kurangnya fitur, tetapi karena ekspektasi yang salah sejak awal.
1.1 Apa yang Dimaksud dengan MDX Router?
Dalam konteks Next.js App Router, MDX Router adalah mekanisme routing berbasis file .mdx, di mana:
- File
.mdxdiperlakukan sebagai halaman (page) - Routing ditentukan oleh struktur folder
- MDX dikompilasi menjadi React Component
Dengan kata lain:
MDX Router = cara menjadikan MDX sebagai halaman web, bukan sekadar file markdown.
Contoh sederhana:
app/tools/page.mdx → /tools
app/tools/ai/page.mdx → /tools/ai
Tidak ada konfigurasi routing manual. Tidak ada deklarasi route eksplisit. Struktur folder adalah routing-nya.
1.2 MDX Router Bukan CMS
Di sinilah kesalahpahaman paling sering terjadi.
Banyak developer secara tidak sadar memperlakukan MDX Router seolah-olah:
- CMS ringan
- Pengganti database
- Sistem dynamic content runtime
Padahal, MDX Router bukan CMS.
MDX Router tidak menyediakan:
- Query runtime (
getPostBySlug) - Filtering dinamis
- Pagination otomatis
- Relasi data
- Admin panel
- Runtime mutation
MDX Router tidak dirancang untuk itu.
1.3 MDX Router Itu Static-First
MDX Router bekerja dengan asumsi dasar berikut:
- Konten diketahui saat build
- Jumlah halaman relatif terkendali
- Struktur URL stabil
- Konten jarang berubah secara real-time
Artinya:
MDX Router adalah static content system yang terintegrasi dengan React.
Dynamic route yang ada tetap bersifat:
- build-time
- pre-generated
- bukan runtime-driven
Jika Anda berharap:
[slug].mdxmembaca URL param- MDX melakukan fetch data
- MDX bertindak sebagai controller
Maka ekspektasi tersebut tidak akan terpenuhi.
1.4 Posisi MDX dalam Arsitektur Next.js
Agar tidak rancu, posisikan MDX dengan jelas:
| Komponen | Peran |
|---|---|
| MDX | Konten (narasi + JSX) |
| App Router | Routing & lifecycle |
page.tsx | Controller (jika ada) |
layout.tsx | Struktur halaman |
| Metadata API | SEO |
Dengan kata lain:
MDX adalah content layer, bukan application layer.
MDX tidak menggantikan:
- routing logic
- data fetching
- metadata orchestration
Ia melengkapi, bukan mengambil alih.
1.5 Kenapa MDX Tetap Sangat Powerful?
Walaupun bukan CMS, MDX Router sangat kuat untuk use case yang tepat:
- Dokumentasi teknis
- Blog arsitektural
- Knowledge base
- Referensi tools
- Artikel konseptual
Karena MDX:
- Deklaratif
- Versionable (Git)
- Bisa memanggil React Component
- Konsisten dengan App Router
MDX unggul bukan karena dinamis, tetapi karena terstruktur dan eksplisit.
1.6 Dampak Jika Mental Model Ini Benar Sejak Awal
Dengan memahami MDX Router secara benar sejak awal:
Anda tidak memaksa MDX menjadi CMS
Anda tidak mencampur konten dan controller
Anda tidak kecewa dengan keterbatasan palsu
Arsitektur menjadi:
- lebih bersih
- lebih scalable
- lebih mudah dirawat
Dan yang terpenting:
Setiap layer melakukan satu hal dengan baik.
BAB 2 — Setup Minimal yang Benar
Setup MDX Router yang benar tidak rumit, tetapi harus presisi. Sebagian besar error MDX—file tidak terbaca, route tidak muncul, styling kacau—bukan berasal dari MDX itu sendiri, melainkan dari setup awal yang keliru atau setengah-setengah.
Bab ini membahas setup minimal yang aman dan idiomatik, tanpa over-engineering.
2.1 Inisialisasi Project (npm + TypeScript + Tailwind)
Gunakan CLI resmi Next.js agar struktur App Router terbentuk dengan benar.
npx create-next-app@latest mdx-router-app
cd mdx-router-app
Pilih opsi berikut saat prompt:
- TypeScript → Yes
- Tailwind CSS → Yes
- ESLint → Yes
- App Router → Yes
- Import alias (@/*) → Yes
Hasil yang diharapkan:
- Folder
app/tersedia layout.tsxdanpage.tsxsudah ada- Tailwind aktif dan terkonfigurasi
2.2 Menambahkan Integrasi MDX
MDX tidak aktif secara default. Integrasi dilakukan melalui paket resmi Next.js.
npm install @next/mdx
Tidak perlu:
next-mdx-remote@mdx-js/reactmanual- Plugin tambahan
Untuk MDX Router dasar, @next/mdx sudah cukup.
Catatan Praktik
Dalam implementasi nyata, dokumentasi resmi MDX Next.js menjadi rujukan utama untuk memahami batasan dan perilaku aktual compiler MDX di App Router, terutama terkait page extensions dan lifecycle build-time. Merujuk langsung ke dokumentasi resmi membantu menghindari asumsi keliru yang sering muncul dari contoh tidak mutakhir.
2.3 Konfigurasi next.config.js
Ini adalah titik paling krusial dalam setup MDX Router.
// next.config.js
import withMDX from '@next/mdx';
const nextConfig = {
pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'md', 'mdx'],
};
export default withMDX()(nextConfig);
Makna konfigurasi ini:
withMDX()→ mengaktifkan compiler MDXpageExtensions→ memberi tahu Next.js bahwa.mdxadalah halaman sah
Tanpa pageExtensions:
- File
.mdxtidak akan dikenali sebagai route - Error yang muncul sering tidak eksplisit
2.4 Struktur Folder yang Valid untuk MDX Router
MDX Router mengikuti aturan App Router sepenuhnya.
Struktur yang valid:
app/
└─ tools/
└─ page.mdx
Akan menghasilkan route:
/tools
Aturan penting:
- Nama folder case-sensitive
- File harus bernama
page.mdx - Tidak perlu
page.tsxtambahan
Kesalahan umum:
Page.mdxindex.mdx- Folder
Toolsvstools
2.5 Verifikasi Awal
Buat file sederhana:
# Hello MDX
Jika ini muncul, setup Anda sudah benar.
Jalankan:
npm run dev
Jika halaman:
- bisa diakses
- tidak error
- route muncul sesuai folder
Maka MDX Router telah aktif dengan benar.
2.6 Kenapa Setup Minimal Ini Penting
Dengan setup di atas:
- MDX dikenali sebagai page
- App Router tetap menjadi pengendali routing
- TypeScript tetap bekerja
- Tailwind aktif tanpa konflik
- Tidak ada ketergantungan berlebih
Setup ini:
- cukup untuk blog
- cukup untuk dokumentasi
- cukup sebagai fondasi scaling
Sebaliknya, jika setup ini salah:
- error akan muncul di tahap lanjut
- debugging menjadi tidak jelas
- MDX disalahkan padahal sumber masalahnya bukan MDX
BAB 3 — Frontmatter vs Content (Core Knowledge)
MDX selalu terdiri dari dua lapisan yang berbeda secara fundamental: frontmatter dan content. Memahami perbedaan ini bukan opsional—ini adalah inti (core knowledge) dari penggunaan MDX yang benar.
Sebagian besar kesalahan desain MDX muncul karena dua lapisan ini dicampur.
3.1 Struktur Dasar MDX
Satu file MDX umumnya berbentuk:
---
title: Tools
description: Referensi tools & platform teknis
tags: ['ai', 'tools']
---
# Tools
Halaman ini berisi referensi tools & platform teknis.
Blok YAML di atas disebut frontmatter. Bagian setelahnya disebut content.
Keduanya diproses dengan jalur yang berbeda.
3.2 Frontmatter: Metadata, Bukan Tampilan
Frontmatter adalah lapisan data.
Secara teknis:
- Dibaca saat build time
- Diparse menjadi object JavaScript
- Tidak dirender ke HTML
- Tidak menjadi bagian UI
Contoh isi frontmatter yang tepat:
title: Tools
description: Referensi tools & platform teknis
draft: false
Yang tidak boleh dilakukan di frontmatter:
- JSX
- HTML
- Styling
- Logika UI
Frontmatter tidak tahu:
- layout
- komponen
- tampilan halaman
Ia hanya tahu data.
3.3 Content: Narasi & Presentasi
Content adalah apa yang dibaca pengguna.
Secara teknis:
- Markdown + JSX
- Dikompilasi menjadi React Component
- Dirender ke HTML
- Bisa memanggil komponen React
Contoh content:
# Tools
<Alert>Gunakan tools sesuai konteks dan kebutuhan teknis.</Alert>
Content boleh:
- memakai komponen
- mengatur struktur narasi
- menyertakan visual
Content tidak seharusnya:
- menduplikasi metadata
- menentukan SEO
- mengatur struktur halaman
3.4 Mekanisme Internal: Kenapa Dipisah?
Secara internal, MDX diproses seperti ini:
MDX File
├─ Frontmatter → parsed → data object
└─ Content → compiled → React Component
Frontmatter berhenti sebagai data. Content berlanjut ke render UI.
Inilah alasan mengapa:
- Frontmatter tidak muncul di layar
- Content tidak otomatis menjadi metadata
3.5 Kenapa Frontmatter Tidak Otomatis SEO?
Ini pertanyaan kunci yang sering muncul.
Jawabannya sederhana secara teknis:
Next.js tidak membaca frontmatter untuk metadata.
Next.js hanya mengenali metadata jika ditentukan melalui:
export const metadata- atau
generateMetadata()
Frontmatter:
- bukan bagian dari API metadata
- tidak otomatis di-inject ke
<head> - tidak dibaca oleh browser maupun crawler
Artinya:
- Frontmatter bukan SEO
- Frontmatter adalah bahan baku SEO
3.6 Posisi Frontmatter dalam Arsitektur SEO
Arsitektur yang benar:
Frontmatter (MDX)
↓
Adapter (page.tsx / Contentlayer)
↓
Next.js Metadata API
↓
<head>
↓
Search Engine
Jika salah satu lapisan ini hilang, SEO tidak pernah terjadi.
3.7 Dampak Jika Frontmatter & Content Dicampur
Jika metadata ditulis di content:
- Judul diulang
- Konsistensi hilang
- SEO sulit dikontrol
Jika tampilan ditaruh di frontmatter:
- Build error
- Desain rapuh
- Tidak scalable
Pemisahan ini bukan soal gaya, tetapi soal arsitektur.
3.8 Menyiapkan Pembaca ke Tahap Lanjut
Dengan memahami:
- frontmatter sebagai data
- content sebagai presentasi
Pembaca siap untuk:
- memahami layout dengan benar
- menerima konsep metadata adapter
- mengadopsi Contentlayer tanpa kebingungan
- membangun sistem konten yang scalable
Tanpa pemahaman ini, pembahasan lanjutan akan selalu terasa “aneh” atau “terlalu ribet”.
Bab ini menjadi fondasi konseptual sebelum masuk ke pembahasan layout, routing dinamis, dan SEO pada bab berikutnya.
BAB 4 — Layout yang Sering Disalahpahami
Salah satu sumber kekacauan terbesar dalam implementasi MDX di Next.js bukan MDX-nya, melainkan layout. Lebih tepatnya: mencampur peran layout halaman dengan layout konten.
Bab ini penting karena membahas arsitektur, bukan styling. Jika bagian ini keliru, efeknya akan terasa di seluruh sistem konten.
4.1 Tiga Hal yang Sering Dicampur (Dan Seharusnya Dipisah)
Dalam praktik, banyak developer mencampur:
layout.tsx(App Router)mdx-components.tsx- utility styling seperti
prose
Padahal, ketiganya berada di level tanggung jawab yang berbeda.
Kesalahan umum:
proseditaruh dimdx-components- Navbar dimasukkan ke MDX
- Heading MDX diatur di
layout.tsx - Semua styling ditumpuk tanpa batas yang jelas
Ini bukan sekadar masalah rapi atau tidak rapi— ini masalah arsitektur.
4.2 Layout App Router: Struktur Halaman
layout.tsx di App Router bertugas sebagai pembungkus struktural halaman.
Ia mengatur:
- lebar halaman
- grid
- padding global
- konteks visual per route
- persistensi antar navigasi
Contoh riil dari use case Anda:
// app/tools/layout.tsx
export default function ToolsLayout({ children }) {
return (
<section className="mx-auto max-w-3xl px-4 py-10">
<div className="prose prose-neutral max-w-none">{children}</div>
</section>
);
}
Maknanya secara arsitektural:
/toolspunya layout sendiri- Semua konten di bawah
/tools/*berada dalam container ini - Layout tidak tahu isi konten
- Layout tidak peduli heading apa yang dipakai
Ini pemisahan yang sehat.
4.3 MDX Content: Tidak Tahu Layout
page.mdx di /tools:
# Tools
Halaman ini berisi referensi tools & platform teknis.
Hal penting yang perlu disadari:
- MDX tidak tahu bahwa ia dibungkus
<section> - MDX tidak tahu ada
prose - MDX tidak tahu soal lebar halaman
Dan memang tidak boleh tahu.
MDX hanya bertanggung jawab atas:
- struktur narasi
- heading
- list
- link
- komponen konten
Bukan struktur halaman.
4.4 prose: Keputusan Halaman, Bukan Konten
Ini kesalahan yang sangat sering terjadi.
Banyak orang menaruh prose:
- di MDX
- di
mdx-components - atau bahkan di setiap komponen
Padahal, prose adalah:
keputusan tampilan halaman, bukan keputusan konten.
Menaruh prose di layout.tsx berarti:
- semua konten di domain itu konsisten
- MDX tetap portable
- styling bisa diubah tanpa menyentuh konten
Jika suatu hari:
/blogingin layout lebar/toolsingin ringkas/docsingin sidebar
Semua bisa dicapai tanpa menyentuh MDX.
4.5 MDX Components: Level yang Berbeda
Jika digunakan, mdx-components.tsx bertugas untuk:
- mapping elemen MDX (
h1,p,ul) - konsistensi tipografi internal
- komponen callout, alert, note
Ia bukan layout halaman.
Kesalahan fatal:
- Menaruh container utama di
mdx-components - Mengatur grid di sana
- Menyisipkan header/footer
Jika itu terjadi, maka:
- MDX tidak lagi portable
- Struktur halaman menjadi tersembunyi
- Scaling menjadi sulit
4.6 Hirarki yang Benar (Ini Kunci Bab Ini)
Hirarki render yang benar:
Layout App Router
└─ Page (MDX)
└─ MDX Content
└─ MDX Components
Bukan:
MDX Components
└─ Layout
└─ Content
Jika hirarki ini terbalik, desain akan rapuh.
4.7 Kenapa Ini Masalah Arsitektur, Bukan Styling
Karena dampaknya bukan visual semata, tetapi:
- kemampuan scaling
- kemudahan refactor
- konsistensi antar domain konten
- kolaborasi antara penulis & developer
Layout yang benar memungkinkan:
- penulis fokus ke isi
- developer fokus ke struktur
- sistem konten tumbuh tanpa chaos
4.8 Nilai Utama dari Contoh /tools/layout.tsx
Contoh ini kuat karena:
- nyata
- sederhana
- idiomatik
- tidak over-engineered
Ia menunjukkan bahwa:
- layout App Router cukup untuk mengatur halaman
- MDX tidak perlu “dipintari”
- batas peran jelas
Ini best practice, bukan workaround.
BAB 5 — Dynamic Route: Apa yang Bisa & Tidak
Salah satu ekspektasi paling sering (dan paling keliru) saat menggunakan MDX Router adalah keinginan untuk membuat dynamic route langsung dari MDX, misalnya dengan pola [slug].mdx. Bab ini penting untuk menghentikan ekspektasi yang salah dan menggantinya dengan solusi yang realistis dan idiomatik.
Ini bukan soal keterbatasan MDX, melainkan soal kedewasaan desain arsitektur.
5.1 Ekspektasi yang Salah: [slug].mdx
Banyak developer berharap bisa menulis:
app/tools/[slug].mdx
Lalu mengharapkan MDX tersebut:
- membaca parameter URL
- berubah sesuai slug
- bertindak sebagai halaman dinamis
Ekspektasi ini tidak akan terpenuhi.
Alasannya sederhana dan teknis:
- MDX bukan controller
- MDX tidak bisa mengeksekusi logika routing
- MDX tidak punya akses ke params
- MDX tidak bisa menjalankan
generateStaticParams
MDX adalah konten, bukan mekanisme routing dinamis.
5.2 Prinsip Dasar: MDX Itu Static-First
MDX Router bekerja dengan asumsi:
- Semua halaman diketahui saat build
- Setiap file MDX menghasilkan satu halaman
- Struktur URL bersifat deterministik
Artinya:
- “Dynamic” dalam MDX bukan runtime
- Dynamic selalu berarti build-time generation
Jika konten Anda:
- berubah berdasarkan user input
- tergantung data eksternal runtime
- membutuhkan query dinamis
Maka MDX Router bukan alat yang tepat untuk lapisan itu.
5.3 Apa yang Sebenarnya Bisa Dilakukan?
Dynamic route tetap bisa, tetapi bukan di level MDX.
Pola yang benar adalah:
- App Router menangani dynamic segment
- MDX diperlakukan sebagai data source
- Halaman di-generate saat build
Dengan kata lain:
Dynamic routing terjadi di
page.tsx, bukan di MDX.
5.4 Pola Build-Time Dynamic yang Benar
Struktur umum yang sehat:
content/tools/
├─ ai.mdx
├─ iot.mdx
└─ website.mdx
app/tools/[slug]/
└─ page.tsx
Dalam pola ini:
- MDX menyimpan konten
page.tsxbertindak sebagai orchestrator- Slug ditentukan saat build
- Halaman tetap static dan SEO-friendly
MDX tidak tahu bahwa ia sedang dipanggil secara dinamis—dan itu justru desain yang benar.
5.5 Kenapa Ini Lebih Dewasa Secara Desain?
Karena pola ini:
- Memisahkan konten dan routing
- Menghindari logika tersembunyi di MDX
- Membuat alur build eksplisit
- Mudah diskalakan
- Mudah di-debug
Bandingkan dengan pendekatan memaksa:
[slug].mdx- logika di konten
- perilaku implisit
Pendekatan build-time dynamic lebih jujur tentang apa yang terjadi di sistem.
5.6 Kapan MDX Router Saja Sudah Cukup?
MDX Router tanpa dynamic route sudah cukup jika:
- jumlah halaman terbatas
- struktur URL stabil
- konten bersifat referensial
- tidak perlu listing dinamis
Contoh:
/tools/ai/tools/website/docs/getting-started
Dalam kondisi ini, folder-based routing MDX lebih sederhana dan lebih jelas.
5.7 Kapan Harus Naik Level?
Jika mulai muncul kebutuhan:
- ratusan konten
- slug tidak ingin ditulis sebagai folder
- listing otomatis
- metadata terstruktur
- SEO konsisten lintas halaman
Maka pendekatan build-time dynamic dengan tooling seperti Contentlayer menjadi langkah logis, bukan over-engineering.
5.8 Inti Bab Ini
- MDX tidak dan tidak seharusnya menangani dynamic route
[slug].mdxadalah ekspektasi yang salah- Dynamic route di MDX selalu build-time
page.tsxadalah tempat yang tepat untuk orchestration- Konten tetap sederhana, eksplisit, dan portable
Bab ini menegaskan satu prinsip penting:
MDX yang sehat adalah MDX yang tidak berpura-pura menjadi controller.
BAB 6 — SEO: Frontmatter Bukan Jawaban Akhir
Salah satu asumsi paling berbahaya dalam penggunaan MDX adalah anggapan bahwa menulis frontmatter berarti SEO sudah beres. Bab ini ada untuk menghentikan asumsi tersebut sebelum berdampak pada performa pencarian.
Ini adalah bab penyelamat SEO.
6.1 Kesalahan Umum: Frontmatter = SEO
Banyak developer menulis frontmatter seperti ini:
---
title: Tools
description: Referensi tools & platform teknis
---
Lalu berasumsi:
<title>sudah terisi<meta description>sudah aman- Google akan membaca metadata tersebut
Asumsi ini salah secara teknis.
Frontmatter:
- tidak dibaca browser
- tidak dibaca crawler
- tidak otomatis masuk ke
<head>
Tanpa langkah tambahan, SEO tidak pernah terjadi.
6.2 Bagaimana Next.js Menghasilkan Metadata SEO
Dalam App Router, Next.js hanya mengenali metadata yang didefinisikan melalui:
export const metadata- atau
generateMetadata()
Contoh metadata yang sah:
export const metadata = {
title: 'Tools',
description: 'Referensi tools & platform teknis',
};
Inilah satu-satunya jalur resmi agar:
<title>muncul<meta description>terpasang- Open Graph bisa dikontrol
- SEO dapat diandalkan
Frontmatter tidak termasuk jalur ini.
6.3 Posisi Frontmatter yang Sebenarnya
Frontmatter bukan output SEO, melainkan:
Sumber data untuk SEO
Artinya:
- frontmatter → data
- metadata API → output
Jika tidak ada lapisan yang menjembatani keduanya, frontmatter hanya akan menjadi catatan internal.
6.4 Arsitektur SEO yang Benar (Mental Model)
Arsitektur SEO yang sehat dalam konteks MDX:
Frontmatter (MDX)
↓
Adapter (page.tsx / Contentlayer)
↓
Next.js Metadata API
↓
<head>
↓
Search Engine
SEO selalu membutuhkan:
- adapter
- proses eksplisit
- keputusan sadar
Tidak ada SEO “otomatis”.
6.5 Pendekatan Minimal (Tanpa Contentlayer)
Pendekatan ini cocok untuk:
- halaman statis
- jumlah konten kecil
- metadata sederhana
Pola umum:
app/tools/
├─ page.tsx
└─ page.mdx
page.tsx bertugas:
- menentukan metadata
- merender konten MDX
Dengan cara ini:
- SEO tetap benar
- frontmatter tidak disalahgunakan
- arsitektur tetap sederhana
Namun, metadata masih manual.
6.6 Keterbatasan Pendekatan Manual
Pendekatan manual mulai bermasalah saat:
- jumlah MDX bertambah
- metadata harus konsisten
- perlu sitemap otomatis
- perlu Open Graph per halaman
Di titik ini, SEO menjadi:
- repetitif
- rawan inkonsistensi
- sulit dirawat
Masalahnya bukan MDX, tetapi tidak adanya sistem metadata.
6.7 Contentlayer sebagai Solusi Evolusioner
Contentlayer hadir bukan sebagai keharusan, tetapi sebagai langkah evolusi alami.
Perannya:
- membaca frontmatter
- memvalidasi struktur
- menyediakan data ter-typing
- memudahkan integrasi metadata
- menyederhanakan SEO lintas halaman
Dengan Contentlayer:
- frontmatter tetap menjadi sumber kebenaran
- metadata dihasilkan secara konsisten
- SEO tidak lagi bergantung pada disiplin manual
Yang penting:
- Contentlayer tidak mengubah filosofi MDX
- Ia hanya melengkapi lapisan metadata
Catatan Arsitektural
Pada sistem konten yang mulai berkembang, penggunaan layer khusus untuk membaca dan memvalidasi frontmatter menjadi krusial. Tooling seperti Contentlayer membantu menjembatani konten MDX dengan kebutuhan metadata, SEO, dan listing secara konsisten tanpa mengubah filosofi dasar MDX sebagai static-first content.
6.8 Inti Bab Ini
- Frontmatter bukan SEO
- Frontmatter adalah bahan baku SEO
- SEO di Next.js hanya sah melalui Metadata API
- Adapter adalah keharusan
- Contentlayer adalah solusi yang matang, bukan paksaan
Bab ini memastikan satu hal:
Menulis MDX tanpa arsitektur SEO yang benar sama dengan menulis konten tanpa niat ditemukan.
BAB 7 — Kapan MDX Router Cukup, Kapan Tidak
Setelah memahami fondasi, mekanisme, layout, dynamic route, dan SEO, pertanyaan terakhir yang paling dewasa secara teknis adalah: kapan MDX Router sudah cukup, dan kapan ia sebaiknya tidak dipaksakan?
Bab ini tidak menawarkan jawaban hitam–putih. Ia memberi kerangka pengambilan keputusan.
7.1 Prinsip Dasar: Gunakan Sesuai Masalah
MDX Router bukan solusi universal. Ia sangat baik untuk kelas masalah tertentu, dan kurang tepat untuk kelas masalah lainnya.
Pendekatan yang sehat:
- tidak dogmatis
- tidak memaksakan tool
- tidak over-engineering
7.2 Kapan MDX Router Sudah Cukup
MDX Router cukup dan ideal jika:
- Konten bersifat statis atau jarang berubah
- Struktur URL jelas dan stabil
- Jumlah halaman terkendali
- Fokus pada narasi, dokumentasi, atau referensi
- Tidak membutuhkan query runtime
- Tidak membutuhkan personalisasi
Contoh use case yang tepat:
- Blog teknis
- Dokumentasi internal
- Knowledge base
- Halaman referensi tools
- Artikel arsitektural
Dalam konteks ini:
- MDX sederhana
- Build-time generation aman
- SEO mudah dikontrol
- Arsitektur tetap ringan
7.3 Tanda-Tanda MDX Router Mulai Tidak Cukup
MDX Router mulai terasa dipaksakan jika:
- Jumlah konten meningkat tajam
- Slug tidak ingin direpresentasikan sebagai folder
- Metadata harus konsisten lintas ratusan halaman
- Perlu listing otomatis dan filter
- Perlu sitemap dan Open Graph dinamis
- Konten mulai berperan sebagai data
Pada titik ini, masalahnya bukan pada MDX, tetapi pada skala dan kebutuhan sistem.
7.4 Jangan Memaksakan MDX Menjadi CMS
Kesalahan yang sering terjadi:
- MDX diperlakukan seperti database
- Frontmatter dipaksa menanggung semua logika
- Routing menjadi implisit dan sulit dilacak
- Konten kehilangan portabilitas
Jika mulai muncul:
- logika tersembunyi di konten
- coupling antara konten dan routing
- metadata tidak terkontrol
Itu tanda bahwa MDX Router sedang dipaksa melewati batas desainnya.
7.5 Jalan Tengah yang Sehat
Antara:
- MDX Router polos
- dan sistem CMS penuh
Ada jalan tengah yang sehat:
- MDX tetap sebagai konten
- Tooling tambahan menangani skala
- Routing tetap eksplisit
- SEO tetap terkontrol
Pendekatan ini tidak menghilangkan MDX, tetapi mematangkannya.
7.6 Contentlayer sebagai Indikator Kedewasaan Sistem
Mengadopsi Contentlayer bukan tanda over-engineering, melainkan:
- respons terhadap kebutuhan nyata
- tanda sistem mulai matang
- upaya menjaga kualitas jangka panjang
Contentlayer:
- memberi struktur pada frontmatter
- memudahkan SEO dan listing
- menjaga konsistensi metadata
Namun:
- tidak semua proyek membutuhkannya
- tidak semua fase memerlukannya
7.7 Decision Framework Sederhana
Gunakan pertanyaan berikut:
- Apakah konten ini naratif atau data?
- Apakah jumlah halaman akan bertambah signifikan?
- Apakah metadata perlu konsisten dan terotomasi?
- Apakah routing masih bisa dijelaskan dengan folder?
- Apakah SEO mulai terasa rapuh?
Jika sebagian besar jawabannya ya, MDX Router polos kemungkinan sudah tidak cukup.
7.8 Inti Bab Ini
- MDX Router adalah alat yang sangat baik, tapi bukan untuk semua skala
- Tidak semua proyek perlu kompleksitas
- Tidak semua kompleksitas bisa ditunda
- Desain yang baik adalah desain yang berubah tepat waktu
Bab ini menutup pembahasan dengan satu prinsip yang sering dipegang engineer senior:
Arsitektur yang baik bukan yang paling canggih, tetapi yang paling tepat untuk masalahnya.
Dengan kerangka ini, Anda dapat menggunakan MDX Router secara percaya diri—tanpa memaksanya, dan tanpa meremehkannya.
🌐 Dokumentasi & Referensi Resmi
Berikut beberapa referensi teknis valid dan relevan yang bisa Anda jadikan rujukan langsung untuk memperdalam MDX Router dengan Next.js, termasuk integrasi MDX, Contentlayer, frontmatter, dan SEO:
Next.js Official Docs — Sumber primer untuk semua aspek Next.js (termasuk App Router). 👉 Dokumentasi resmi Next.js sebagai basis framework keseluruhan. (Next.js)
Advanced Features: Using MDX dengan Next.js — Panduan setup MDX, penggunaan JSX dalam konten, dan integrasi MDX dengan App Router. (nextjs-ja-translation-docs.vercel.app)
Contentlayer — Dokumentasi Resmi — Content SDK untuk memvalidasi dan mengubah konten MDX/Markdown jadi data terstruktur (type-safe), sangat berguna untuk SEO, listing, dan scale. (Contentlayer)
📘 Artikel Tutorial & Panduan Praktis
Build a Next.js Blog with MDX & Contentlayer — Contoh membuat blog di Next.js dengan MDX dan Contentlayer dari awal sampai akhir (pembahasan kasus nyata). (Ben Orloff Blog)
Building an SEO-Optimized Blog with Next.js and MDX — Panduan menyiapkan blog MDX dengan fokus SEO (routing, rendering, frontmatter untuk slug/metadata). (DEV Community)
🧠 Diskusi & Komunitas
Stack Overflow / Next.js MDX dengan App Directory — Thread komunitas yang membahas penggunaan
@next/mdxpada App Router dan detail setuppageExtensions. (Stack Overflow)GitHub Discussion: MDX Blog & Dynamic Routing — Diskusi tentang tantangan routing dinamis dengan banyak file MDX dalam App Router dan pendekatan alternatifnya. (GitHub)
🎯 Bagaimana Menggunakan Referensi Ini
Berikut rekomendasi cara pakai referensi di atas saat membuat artikel atau dokumentasi:
🔧 Untuk Setup & Implementasi
- Gunakan Next.js Docs untuk langkah dasar App Router dan MDX setup. (Next.js)
- Kombinasikan dengan MDX + Contentlayer docs untuk alur konten → data pipeline. (Contentlayer)
🧩 Untuk Studi Kasus Dinamis
- Baca tutorial blog (Ben Orloff, Pavel Buyeu) untuk pola dynamic route, SEO, dan frontmatter praktis. (Ben Orloff Blog)
🛠️ Untuk Problem-Solving
- Gunakan thread komunitas (Stack Overflow / GitHub) untuk solusi error common terkait MDX di App Router. (Stack Overflow)
📌 Catatan Khusus
- MDX dengan App Router modern memiliki setup tersendiri — berbeda dengan Pages Router tradisional. (nextjs-ja-translation-docs.vercel.app)
- Frontmatter tidak otomatis menjadi metadata SEO — butuh adapter atau Contentlayer untuk mengolahnya secara eksplisit. (DEV Community)
- Contentlayer adalah solusi yang stabil untuk skala besar konten MDX. (Contentlayer)
Jika Anda ingin, saya bisa susun daftar URL langsung dari sumber-sumber di atas yang paling relevan untuk dimasukkan sebagai footnote artikel, atau diringkas dalam format daftar pustaka yang rapih.
Catatan Penyusunan Artikel ini disusun sebagai materi edukasi dan referensi umum berdasarkan berbagai sumber pustaka, praktik lapangan, serta bantuan alat penulisan. Pembaca disarankan untuk melakukan verifikasi lanjutan dan penyesuaian sesuai dengan kondisi serta kebutuhan masing-masing sistem.