Next.js第二十章(MDX)

MDX

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

安装依赖

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} />
  );
}
相关推荐
思码梁田9 分钟前
CSS 浏览器厂商前缀:从「写 5 遍」到现代自动化兼容
前端·css·css3·border-radius·1024程序员节·box-shadow·厂商前缀
Bug收容所14 分钟前
Vue+JS Day3
前端·javascript·vue.js·前端框架·1024程序员节
iCxhust30 分钟前
如何实时同步自己的工作日志,在不同的设备间
前端·软件工程·1024程序员节·同步日志
IT_陈寒1 小时前
React项目实战经验分享:如何避免useEffect闭包陷阱导致的陈旧状态问题?
前端·人工智能·后端
风骏时光牛马1 小时前
智能任务调度Agent
前端
ljt27249606611 小时前
Vue笔记(十六)--自定义Hook
前端·1024程序员节
沙蒿同学10 小时前
不引 Ghostscript:我用纯 Go 给 PDF 做了一场「压缩手术」
前端·后端·github
变与不变80610 小时前
jQuery细节以及使用应用场景
前端·javascript·jquery
SailingCoder12 小时前
【封闭结束1】端到端交付:Agent 一次请求如何走完全链路
前端·安全·ai·面试·agent·harness
风骏时光牛马14 小时前
AI多模块协同自动化工作流
前端