Next.js第二十章(MDX)

MDX

MDX是一种将Markdown和React组件混合在一起的语法,它可以在Markdown中使用React组件,从而实现更复杂的页面。另外就是我们在编写技术文档或者博客的时候,配合SSG模式,更喜欢用Markdown来编写,MDX他正好将MarkdownReact组件混合在一起,实在是方便至极。

安装依赖

bash 复制代码
npm install @next/mdx @mdx-js/loader @mdx-js/react @types/mdx

启用MDX功能

1.next.config.js配置以下内容
ts 复制代码
//next.config.js    
import type { NextConfig } from "next";
import createMDX from '@next/mdx'
const withMDX = createMDX({
    //extension: /\.(md|mdx)$/ 默认只支持mdx文件,如果想额外支持md文件编写次行代码。
});
const nextConfig: NextConfig = {
  reactCompiler: true,
  pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'],
};
export default withMDX(nextConfig);
2.根目录下面创建mdx-components.tsx文件
tsx 复制代码
import type { MDXComponents } from 'mdx/types'
 
const components: MDXComponents = {}
 
export function useMDXComponents(): MDXComponents {
  return components
}

创建文件

bash 复制代码
 my-project
  ├── app
  │   └── mdx-page
  │       └── page.(mdx/md)
  |── mdx-components.(tsx/js)
  └── package.json

代码高亮

打开编辑器-插件市场-搜索MDX-安装MDX插件

基础使用

可以支持(Markdown语法 + React组件 + HTML标签)

mdx 复制代码
# welcome to MDX

这是一段文字,**他加粗了**,并且有重点内容`important`。

- one
- two
- three


<div className='bg-red-500'>
  <p>自定义标签</p>
</div>

引入自定义组件

引入自定义组件一定要跟md语法之间空一行,否则会报错

src/app/home/page.mdx

mdx 复制代码
import MyComponent from './my-component'; //引入自定义组件一定要跟md语法之间空一行,否则会报错。

# welcome to MDX

这是一段文字,**他加粗了**,并且有重点内容`important`。

- one
- two
- three


<div className='bg-red-500'>
  <p>自定义标签</p>
</div>

<MyComponent />

mdx文件无法实现一些复杂的交付逻辑,如果有复杂的交付逻辑,我们可以使用React组件来实现,然后在mdx文件中引入即可。

tsx 复制代码
//src/app/home/my-component.tsx
'use client'
import { useState } from 'react';
export default function MyComponent() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

全局样式

如果你希望在这个项目中修改所有的MDX文件的样式,你可以使用mdx-components.tsx文件来修改。

tsx 复制代码
//mdx-components.tsx
import type { MDXComponents } from 'mdx/types'
 
const components: MDXComponents = {
    h1: ({ children }) => <h1 className='text-2xl text-red-400 font-bold'>{children}</h1>, //# 代表h1 你可以自定义修改样式
    li: ({ children }) => <li className='list-disc text-blue-500 list-inside'>{children}</li>, //- 代表li 你可以自定义修改样式
    //...你可以自定义修改更多的样式
}
 
export function useMDXComponents(): MDXComponents {
  return components
}

远程加载mdx/md文件

如果你的MDX文件存储在远程服务器上,你可以使用远程mdx来加载文件。

bash 复制代码
npm install next-mdx-remote-client
tsx 复制代码
//src/app/home/page.tsx
import { MDXRemote } from 'next-mdx-remote-client/rsc'
export default async function Home() {
  const res = await fetch('https://nextjs-docs-henna-six.vercel.app/xm.mdx') //链接是彩蛋
  const source = await res.text()
  return (
      <MDXRemote source={source} />
  );
}
相关推荐
bug总结4 小时前
Vue3 实现后台管理系统跳转大屏自动登录功能
前端·javascript·vue.js
用户47949283569154 小时前
同事一个比喻,让我搞懂了Docker和k8s的核心概念
前端·后端
烛阴4 小时前
C# 正则表达式(5):前瞻/后顾(Lookaround)——零宽断言做“条件校验”和“精确提取”
前端·正则表达式·c#
C_心欲无痕5 小时前
浏览器缓存: IndexDB
前端·数据库·缓存·oracle
郑州光合科技余经理5 小时前
技术架构:上门服务APP海外版源码部署
java·大数据·开发语言·前端·架构·uni-app·php
GIS之路5 小时前
GDAL 实现数据属性查询
前端
PBitW6 小时前
2025,菜鸟的「Vibe Coding」时刻
前端·年终总结
mwq301236 小时前
不再混淆:导数 (Derivative) 与微分 (Differential) 的本质对决
前端
小二·7 小时前
Vue 3 组件通信全方案详解:Props/Emit、provide/inject、事件总线替代与组合式函数封装
前端·javascript·vue.js
研☆香7 小时前
html框架页面介绍及制作
前端·html