Next-MDX proporciona un conjunto de funciones auxiliares para obtener y representar archivos MDX locales. Maneja datos relacionales , admite componentes personalizados , mecanografiados listos y es realmente rápido .
Next-MDX es ideal para construir páginas con MDX, blogs de usuarios múltiples, páginas de categoría ... Etc.

https://next-mdx-example.vercel.app
Aprenda cómo funciona Next-MDX mirando ejemplos.
next-mdx.json para ver la configuración de la muestra.pages/[[...slug]].tsx para ver cómo los archivos MDX se obtienen y se representan.types/index.d.ts para un mecanografiado. Haga clic para expandir ejemplos.
{
"post" : {
"contentPath" : " content/posts " ,
"basePath" : " /blog " ,
"sortBy" : " date " ,
"sortOrder" : " desc "
},
} import { useHydrate } from "next-mdx/client"
import { getMdxNode , getMdxPaths } from "next-mdx/server"
export default function PostPage ( { post } ) {
const content = useHydrate ( post )
return (
< article >
< h1 variant = "heading.title" > { post . frontMatter . title } </ h1 >
{ post . frontMatter . excerpt ? (
< p variant = "text.lead" mt = "4" >
{ post . frontMatter . excerpt }
</ p >
) : null }
< hr />
{ content }
</ article >
)
}
export async function getStaticPaths ( ) {
return {
paths : await getMdxPaths ( "post" ) ,
fallback : false ,
}
}
export async function getStaticProps ( context ) {
const post = await getMdxNode ( "post" , context )
if ( ! post ) {
return {
notFound : true ,
}
}
return {
props : {
post ,
} ,
}
}
npm i --save next-mdx
Cree un archivo next-mdx.json en la raíz de su proyecto con lo siguiente:
{
"post" : {
"contentPath" : " content/posts " ,
"basePath" : " /blog " ,
"sortBy" : " date " ,
"sortOrder" : " desc "
},
"category" : {
"contentPath" : " content/categories "
}
}post , category y author son ID únicas utilizadas como referencias para sus tipos MDX.contentPath (requerido) es donde se encuentran sus archivos MDX.basePath (opcional) es la ruta utilizada para generar URL.sortBy (opcional, predeterminado al title ) es el nombre del campo Frontmatter utilizado para la clasificación.sortOrder (opcional, predeterminado a asc ) es el orden de clasificación. next-mdx expone 6 funciones de ayuda principal:
getMdxPaths(sourceName: string)getNode(sourceName, context)getAllNodes(sourceName)getMdxNode(sourceName, context, params)getAllMdxNodes(sourceName, params)useHydrate(node, params) getMdxPaths(sourceName: string) Devuelve una matriz de parámetros de ruta que se pueden pasar directamente a paths in GetstaticPaths`.
sourceName es la identificación única definida en next-mdx.json // pages/blog/[...slug].js
import { getMdxPaths } from "next-mdx/server"
export async function getStaticPaths ( ) {
return {
paths : await getMdxPaths ( "post" ) ,
fallback : false ,
}
} getNode(sourceName, context) devuelve un MDXNode con frontmatter y datos relacionales pero sin datos MDX. Esto es realmente rápido y almacenado en caché.
Use esto en lugar de getMdxNode si no está representando contenido MDX en una página.
sourceName es la identificación única definida en next-mdx.jsoncontext es el contexto que se pasa a getStaticProps o la babosa como una cadena. // pages/blog/[...slug].js
import { getNode } from "next-mdx/server"
export async function getStaticProps ( context ) {
const post = await getNode ( "post" , context )
if ( ! post ) {
return {
notFound : true ,
}
}
return {
props : {
post ,
} ,
}
} getAllNodes(sourceName) Devuelve todo MdxNode del tipo/fuente dado con los datos frontales y los datos relacionales pero sin datos MDX. Esto también es realmente rápido y almacenado en caché.
sourceName es la identificación única definida en next-mdx.json import { getAllNodes } from "next-mdx/server"
export async function getStaticProps ( ) {
return {
props : {
posts : await getAllNodes ( "post" ) ,
} ,
}
} getMdxNode(sourceName, context, params) devuelve un MDXNode .
sourceName es la identificación única definida en next-mdx.jsoncontext es el contexto que se pasa a getStaticProps o la babosa como una cadena.params : {
components ?: MdxRemote . Components
scope ?: Record < string , unknown >
provider ?: MdxRemote . Provider
mdxOptions ?: {
remarkPlugins ?: Pluggable [ ]
rehypePlugins ?: Pluggable [ ]
hastPlugins ?: Pluggable [ ]
compilers ?: Compiler [ ]
filepath ?: string
}
} // pages/blog/[...slug].js
import { getMdxNode } from "next-mdx/server"
export async function getStaticProps ( context ) {
const post = await getMdxNode ( "post" , context )
if ( ! post ) {
return {
notFound : true ,
}
}
return {
props : {
post ,
} ,
}
} getAllMdxNodes(sourceName, params) Devuelve todo MdxNode del tipo/fuente dado.
sourceName es la identificación única definida en next-mdx.jsonparams : {
components ?: { name : React . Component } ,
scope ?: { } ,
provider ?: { component : React . Component , props : Record < string , unknown > } ,
mdxOptions : {
remarkPlugins : [ ] ,
rehypePlugins : [ ] ,
hastPlugins : [ ] ,
compilers : [ ] ,
}
} import { getAllMdxNodes } from "next-mdx/server"
export async function getStaticProps ( ) {
const posts = await getAllMdxNodes ( "post" )
return {
props : {
posts : posts . filter ( ( post ) => post . frontMatter . featured ) ,
} ,
}
} useHydrate(node, params) se usa en el lado del cliente para hidratar el contenido estático.
node es el objeto MdxNodeparams : {
components ?: { name : React . Component } ,
provider ?: { component : React . Component , props : Record < string , unknown > }
} import { useHydrate } from "next-mdx/client"
export default function PostPage ( { post } ) {
const content = useHydrate ( post )
return (
< div >
< h1 > { post . frontMatter . title } </ h1 >
{ content }
</ div >
)
} Use getAllNodes cuando necesite nodos sin el contenido MDX. Está respaldado por un caché y es realmente rápido. Esto es útil cuando necesitas una lista de nodos (ejemplo de teasers de publicaciones) y no estás usando el contenido MDX.
Para usar componentes dentro de los archivos MDX, debe pasar los componentes a getMdxNode/getAllMdxNodes y useHydrate .
import { getMdxNode } from "next-mdx/server"
import { useHydrate } from "next-mdx/client"
export function Alert ( { text } ) {
return < p > { text } </ p >
}
export default function PostPage ( { post } ) {
const content = useHydrate ( post , {
components : {
Alert ,
} ,
} )
return (
< div >
< h1 > { post . frontMatter . title } </ h1 >
{ content }
</ div >
)
}
export async function getStaticProps ( context ) {
const post = await getMdxNode ( "post" , context , {
components : {
Alert ,
} ,
} )
return {
props : {
post ,
} ,
}
} Las opciones de MDX se pueden pasar como params para getMdxNode(sourceName, context, params) y getAllMdxNodes(sourceName, params) donde params toma la forma de:
export interface MdxParams {
components ?: MdxRemote . Components
scope ?: Record < string , unknown >
provider ?: MdxRemote . Provider
mdxOptions ?: {
remarkPlugins ?: Pluggable [ ]
rehypePlugins ?: Pluggable [ ]
hastPlugins ?: Pluggable [ ]
compilers ?: Compiler [ ]
filepath ?: string
}
} Al recuperar nodos con getMdxNode o getAllMdxNodes , next-mdx inferirá automáticamente los datos relacionales de las claves de frontmatter.
next-mdx.jsonDados los siguientes archivos MDX.
.
└── content
├── categories
│ └── category-a.mdx
│ └── category-b.mdx
└── posts:
└── example-post.mdx
En example-post puede hacer referencia a categorías relacionadas con las siguientes:
---
title : Example Post
category :
- category-a
---Luego puede acceder a las categorías de la siguiente manera:
const post = getMdxNode ( "post" , context )
// post.relationships.category Defina sus tipos de nodo de la siguiente manera:
interface Post extends MdxNode < FrontMatterFields > { } import { MdxNode } from "next-mdx/server"
interface Category
extends MdxNode < {
name : string
} > { }
interface Post
extends MdxNode < {
title : string
excerpt ?: string
category ?: string [ ]
} > {
relationships ?: {
category : Category [ ]
}
} Luego puede usar Post como el tipo de retorno para getNode , getAllNodes , getMdxNode y getAllMdxNode :
const post = await getMdxNode < Post > ( "post" , context )
const posts = await getAllNodes < Post > ( "post" ) Licenciado bajo la licencia del MIT.