我做了 Oginify:免费 OG 图片生成器,每天 3 次,无需注册。来试试 →

MDX使用:Next.js中Markdown+React组件完整教程

2025最新MDX使用指南:从hard coding迁移到MDX,学习Markdown语法、React组件集成、样式映射。代码量减少60-70%,提升内容创作效率。包含完整示例和最佳实践。适合Next.js开发者与内容创作者快速上手MDX工作流。

更新于 2025年2月20日
8 分钟阅读
分享到
TL;DR

核心要点

本文介绍从 hard coding 迁移到 MDX 的完整流程,帮助在 Next.js 中实现 Markdown 与 React 组件集成,提升内容创作效率。

  • Hard coding 方式代码量大、维护难,MDX 可减少 60–70% 代码量。
  • MDX 支持 Markdown 语法与 React 组件混用,便于样式映射。
  • 提供 Hard Coding vs MDX 代码对比、迁移步骤与最佳实践。
  • 涵盖 Section、FAQ 等组件集成与 Alignify 实际案例。

用 Cursor / OpenClaw 帮你优化文章页

npx skills add kostja94/marketing-skills --skill article-page-generator

Star 或 Fork 获取 160+ 全套技能

代码对比:Hard Coding vs MDX

Hard Coding 方式(.tsx)

export const metadata = {
  title: “文章标题“,
  description: “文章描述",
};

问题:

  • 每个元素都需要手动添加 className
  • 代码量巨大,样式代码与内容混合
  • 难以维护,每个页面样式不统一
  • 修改样式需要逐个页面修改

MDX 方式(.mdx)

import BlogLayout from '@/components/BlogLayout';
import FAQ from '@/components/FAQ';
import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { addUtmToExternalLink, getExternalLinkRel } from “@/lib/utils";

<BlogLayout {...props}>
  {/ 使用 FAQ 组件 /}
  <FAQ items={[...]} pageUrl="..." />

  {/ 使用 Card 组件 /}
  <Card>
    <CardHeader>
      <CardTitle>标题</CardTitle>
    </CardHeader>
    <CardContent>
      内容
    </CardContent>
  </Card>

  {/ 使用 Button 和 Badge /}
  <Button>点击按钮</Button>
  <Badge>标签</Badge>
</BlogLayout>

优势:

  • 使用 Markdown 语法,代码简洁易读
  • 样式自动应用,无需手动添加 className
  • 全局样式统一,易于维护
  • 内容与样式分离,专注内容创作
  • 代码量减少约 60-70%

基础概念

什么是 Markdown?

Markdown 是一种轻量级标记语言,由 John Gruber 和 Aaron Swartz 在 2004 年创建。它的设计目标是让人们能够使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML。Markdown 使用简单的符号(如 # 表示标题、** 表示加粗)来标记文本格式,无需复杂的 HTML 标签。

Markdown 的语法简洁直观,学习成本低。例如,使用 ## 标题 就能创建一个二级标题,使用 - 列表项 就能创建一个无序列表。这种简洁性使得 Markdown 成为编写文档、博客、README 文件等的首选格式。

Markdown 文件通常以 .md.markdown 为扩展名,可以被各种工具和平台解析和渲染,包括 GitHub、GitLab、Reddit、Stack Overflow 等。

什么是 MDX?

MDX(Markdown + JSX)是 Markdown 的扩展,允许你在 Markdown 文档中直接使用 JSX(JavaScript XML)语法,即可以嵌入 React 组件。MDX 由 [MDX 官方团队](https://mdxjs.com/) 开发,旨在将 Markdown 的简洁性与 React 的强大功能结合起来。

在 MDX 中,你可以像编写普通 Markdown 一样编写内容,同时可以在任何位置插入 React 组件。例如,你可以在 Markdown 段落中嵌入一个交互式的图表组件,或者在列表中使用自定义的卡片组件。这种能力使得 MDX 特别适合创建内容丰富的技术文档、博客文章和营销页面。

MDX 文件以 .mdx 为扩展名,可以被 Next.js、Gatsby、Vite 等现代前端框架支持。在编译时,MDX 会将 Markdown 语法转换为 HTML,将 JSX 转换为 React 组件,最终生成可交互的网页内容。

为什么要使用 Markdown/MDX?

相比传统的 HTML 编写方式或 CMS 系统,Markdown 和 MDX 具有以下优势:

  • 简洁易读:Markdown 语法直观明了,即使是非技术人员也能快速上手。代码量相比 HTML 减少约 60-70%,专注于内容本身而非格式标记。
  • 版本控制友好:Markdown 文件是纯文本格式,可以轻松使用 Git 进行版本控制,追踪内容变更历史,协作编辑和代码审查都更加方便。
  • 跨平台兼容:Markdown 文件可以在任何文本编辑器中打开和编辑,不依赖特定的软件或平台。同时,大多数现代开发工具和平台都原生支持 Markdown。
  • 样式统一:通过全局组件映射(如 mdx-components.tsx),可以统一管理所有文章的样式,确保视觉一致性,同时降低维护成本。
  • 组件复用:MDX 允许嵌入 React 组件,可以创建可复用的内容组件(如 FAQ、代码示例、交互式图表等),提高内容创作效率。
  • 性能优化:MDX 文件在构建时被编译为静态 HTML,可以享受静态站点生成(SSG)的性能优势,加载速度快,SEO 友好。
  • 开发体验:使用 Markdown 编写内容时,开发者可以专注于内容创作,而不需要处理复杂的 HTML 标签和 CSS 样式。同时,MDX 提供了类型安全和代码提示,提升开发效率。

在 Alignify 项目中,我们使用 MDX 来编写新文章,既保留了 Markdown 的简洁性,又获得了 React 组件的灵活性。这种方式特别适合需要频繁更新内容、需要统一风格、需要嵌入交互式组件的场景。

MDX 内容编写

MDX 的核心优势在于它同时支持 Markdown 语法和 React 组件,让你可以用简洁的 Markdown 编写内容,同时嵌入强大的 React 组件。根据 [MDX 官方文档](https://mdxjs.com/docs/using-mdx/#components),MDX 会将 Markdown 语法编译为 JavaScript,并通过组件映射机制将 HTML 元素转换为自定义 React 组件。

Markdown 语法使用

MDX 支持完整的 Markdown 语法,同时允许嵌入 React 组件。下面介绍常用的 Markdown 语法及其在 Alignify 项目中的样式表现。

格式语法

MDX 支持完整的 Markdown 格式语法,包括标题、列表、表格、代码、文本格式、引用块和分割线等。这些语法元素通过 mdx-components.tsx 中的组件映射自动应用统一的样式,无需手动添加 className。

支持的格式语法类型:

  • 标题:使用 ####### 表示不同级别的标题,h2 和 h3 会自动添加到目录导航中
  • 列表:无序列表使用 -+,有序列表使用数字加句点
  • 表格:使用管道符 | 分隔列,表头行需要添加 className="header-row"
  • 代码:行内代码使用单个反引号,代码块使用三个反引号,可指定语言进行语法高亮
  • 文本格式:使用 加粗斜体~~删除线~~
  • 引用块:使用 > 表示引用内容
  • 分割线:使用三个或更多 ---___

语法示例

下面展示各种格式语法的实际效果:

标题:使用不同级别的标题来组织内容,h2 和 h3 标题会自动添加到目录导航中。

列表:列表自动应用统一的样式,并带有适当的间距和缩进。

无序列表示例:

  • 第一项
  • 第二项
  • 第三项

有序列表示例:

  1. 第一步
  2. 第二步
  3. 第三步

表格示例:表格自动应用边框样式和响应式布局。表头行需要添加 className="header-row" 来应用背景色。

功能MDXMarkdown
React组件支持不支持
Markdown语法支持支持
代码高亮支持支持

代码:使用反引号包裹行内代码,使用三个反引号包裹代码块。可以指定语言(如 ```javascript)进行语法高亮。

行内代码示例:使用export const metadata导出元数据。

代码块示例:

文本格式示例:使用 加粗 实现加粗文本,使用 斜体 实现斜体文本,使用 ~~删除线~~ 实现删除线文本。

引用块示例:引用块左侧有主色调边框,用于突出显示重要内容。

这是一段引用内容,通常用于引用他人的观点或重要信息。引用块可以帮助突出显示重要的内容,提升阅读体验。

水平分割线:用于分隔不同章节。

下面展示链接和媒体的实际效果:

链接使用最佳实践:在 MDX 文件中,强烈推荐使用 Markdown 链接语法[文本](URL),而不是 JSX 的 <a> 标签。Markdown 链接会自动经过组件映射处理,确保外部链接自动添加 UTM 参数、在新标签页打开,并正确处理内部/外部链接。如果必须使用 JSX,请使用导出的 <A> 组件(大写)而不是 <a>

内部链接示例:内部链接使用 Next.js Link 组件,支持客户端路由。

如何从0-1搭建博客

外部链接示例:外部链接自动添加 UTM 参数,在新标签页打开。

[Next.js官网](https://nextjs.org)

图片示例:在 MDX 文件中,可以使用 Markdown 语法或 JSX 语法插入图片。Markdown 语法会自动应用样式并启用懒加载。JSX 语法可以通过 className 属性覆盖或扩展默认样式。

YouTube 视频示例:只需添加 YouTube 链接即可自动渲染为视频缩略图。支持 youtube.comyoutu.be 格式,链接文本会自动作为视频标题显示,自动添加 UTM 参数,在新标签页打开。

[7 ways to verify site ownership - Google Search Console Training](https://www.youtube.com/watch?v=N4PmE3LysUM&t=180s)

React 组件集成

在 MDX 文件中,你可以直接使用 React 组件。这为内容创作提供了极大的灵活性,可以嵌入交互式组件、自定义样式、动态内容等。下面介绍 Alignify 项目中常用的组件类型。

MDX 组件机制与组件库的区别

在使用 MDX 组件时,需要理解两个重要概念的区别:

  • [MDX 官方文档](https://mdxjs.com/docs/using-mdx/#components):讲解的是"如何使用组件"的机制,包括组件映射、Props 传递、Layout wrapper 等核心概念。这不是一个组件库,而是 MDX 框架的使用指南。
  • [shadcn/ui 组件库](https://ui.shadcn.com/):提供具体的 UI 组件(如 Button、Card、Dialog 等),是一个完整的组件库。Alignify 项目已安装 40+ 个 shadcn/ui 组件,位于 src/components/ui/ 目录下。

两者的关系:MDX 的组件机制让你可以在 MDX 文件中使用任何 React 组件,包括 shadcn/ui 的所有组件。你可以通过 MDX 的组件映射机制(mdx-components.tsx)统一管理样式,同时直接导入和使用 shadcn/ui 的组件来构建丰富的交互界面。

MDX 支持的组件类型:

  • shadcn/ui 的所有组件(40+ 个)
  • 自定义组件(如 BlogLayout、FAQ、YouTubeVideo)
  • 第三方 React 组件库的组件
  • 在 MDX 文件中直接定义的组件

布局组件

BlogLayout:文章的核心布局组件,位于 src/components/BlogLayout.tsx。它提供了完整的文章展示功能,包括标题、摘要、作者信息、目录导航、作者卡片和相关文章推荐。支持响应式布局,采用三栏设计(目录 + 内容 + 侧边栏)。每个 MDX 文章都需要使用 BlogLayout 包裹内容。

内容展示组件

YouTubeVideo:位于 src/components/YouTubeVideo.tsx,用于渲染 YouTube 视频缩略图。支持自动检测 YouTube 链接并渲染为带播放按钮的缩略图,点击后在新标签页打开视频。可以通过 Markdown 链接语法或 JSX <A> 组件使用。

FAQ组件:位于 src/components/FAQ.tsx,用于展示常见问题解答。包含预定义的问题和答案,提升用户体验和 SEO。

交互式组件

FAQ:位于 src/components/FAQ.tsx,用于展示常见问题。使用 shadcn/ui 的 Accordion 组件实现折叠展开效果,自动生成 FAQPage 结构化数据(Schema.org)用于 SEO。支持传入问题列表和页面 URL。

UI 组件库(shadcn/ui)

Alignify 项目使用 [shadcn/ui](https://ui.shadcn.com/) 作为 UI 组件库,所有组件位于 src/components/ui/ 目录下。项目已安装 40+ 个 shadcn/ui 组件,包括基础组件、交互组件、表单组件、布局组件等,你可以在 MDX 文件中导入并使用这些组件。

已安装的组件类型:

  • 基础组件:Button、Card、Badge、Input、Label、Separator 等
  • 交互组件:Dialog、Accordion、Tabs、Dropdown Menu、Popover、Tooltip 等
  • 表单组件:Form、Checkbox、Radio Group、Select、Textarea、Switch 等
  • 布局组件:Aspect Ratio、Resizable、Scroll Area、Skeleton 等
  • 反馈组件:Alert、Toast、Progress、Skeleton 等
  • 导航组件:Navigation Menu、Breadcrumb、Pagination、Command 等
  • 其他:Carousel、Chart、Calendar、Avatar、Hover Card 等

常用组件示例:

  • Card 组件:用于创建卡片容器,包含 CardHeader、CardTitle、CardDescription、CardContent、CardFooter 等子组件
  • Button 组件:提供多种样式和尺寸的按钮,支持不同变体(default、destructive、outline、secondary、ghost、link)
  • Badge 组件:用于显示标签、徽章或状态标识,支持多种颜色变体
  • Tabs 组件:用于创建标签页界面,支持多个内容面板切换
  • Accordion 组件:用于创建折叠面板,支持单个或多个面板展开
  • Dialog 组件:用于创建模态对话框,支持打开/关闭动画
  • Alert 组件:用于显示提示信息,支持多种类型(default、destructive、warning)

组件使用示例

在 MDX 文件中使用组件非常简单,只需在文件顶部导入,然后在内容中使用:

提示:更多组件使用方法请参考 src/components/ui/ 目录下的组件源码,或访问 [shadcn/ui 官方文档](https://ui.shadcn.com)。

Markdown vs JSX 选择指南

在 MDX 中,你可以同时使用 Markdown 语法和 JSX 语法。选择合适的语法可以让代码更简洁、更易维护。下面通过对比表格帮助你快速做出选择。

使用场景推荐语法示例优势
标题、段落Markdown## 标题代码简洁,自动应用样式
列表Markdown- 列表项语法直观,易于阅读
链接、图片Markdown[文本](URL)自动处理内部/外部链接,添加UTM参数
文本格式Markdown加粗**语法简洁,易于维护
交互式组件JSX支持动态交互和复杂逻辑
自定义样式JSX
灵活控制样式和布局
复杂布局JSXGrid、Flex布局支持高级布局需求
动态内容JSX根据数据生成支持条件渲染和数据处理

总结:优先使用 Markdown 语法,代码量减少约 60-70%,自动应用样式,易于维护。只有在需要特殊功能(交互、自定义样式、复杂布局、动态内容)时才使用 JSX。

结论

本文围绕「MDX使用指南2025:Next.js中Markdown+React组件完整教程」归纳了可执行要点与常见误区。建议把文中清单拆成可验证的小任务,用数据复盘而不是凭感觉调整。

2025最新MDX使用指南:从hard coding迁移到MDX,学习Markdown语法、React组件集成、样式映射。代码量减少60-70%,提升内容创作效率。包含完整示例和最佳实践。 若环境与政策有变,以官方说明为准并回写站内表述。

Frequently Asked Questions

Next.js 项目里的 MDX 是什么?
MDX 允许在同一文件里混写 Markdown 与 React 组件,构建时编译为页面。它让正文保持可读,同时可嵌入交互组件。团队常通过统一的组件映射集中控制标题、列表与卡片样式,减少每篇文章重复写 JSX。
什么时候优先用 Markdown 而不是 JSX?
标题、列表、链接、表格等结构化正文优先用 Markdown,便于 diff 与协作评审。需要 props、栅格布局或客户端组件时再改用 JSX。这样通常能显著减少样板代码,并让运营同事更敢改字。
相比整页硬编码 TSX,MDX 如何降低维护成本?
样式与排版集中在映射层调整一次即可全局生效,不必逐页改 className。内容与布局职责分离:作者专注段落,工程侧维护组件契约。合并冲突往往更少,发布节奏更稳定。
MDX 页面 SEO 友好吗?
在构建或服务端输出完整可读 HTML,并正确配置标题与描述时,对 SEO 友好。避免把关键正文只放在需客户端激活后才出现的区域。若使用 FAQ 等结构化区块,需保证可见文本与结构化数据一致。
新手使用 MDX 常见坑有哪些?
混用不安全的小写 a 标签、在内容文件里塞过多客户端依赖、代码块未转义导致编译失败,以及巨型 props 拖慢构建。建议从小范围试点、加 MDX 校验,并关注编译耗时与包体。
如何安全接入自定义组件?
为组件定义稳定 props 与示例,放在组件旁文档化。MDX 顶部集中 import 后复用。把业务逻辑留在模块内,避免编辑者在正文里误调用敏感接口或泄露密钥。
MDX 会替代无头 CMS 吗?
不一定。MDX 适合 Git 协作与静态站,CMS 更适合非技术编辑排期与预览。可组合使用:字段存 CMS,渲染层用 MDX 模板输出。按编辑技能结构与发布频率选型更稳妥。
遗留 TSX 文章迁移建议是什么?
按流量优先级分批迁移,把重复布局抽到共享包裹层,正文迁入 MDX。保留规范 URL 与重定向,配合视觉回归测试。迁移窗口期监控收录与核心网页指标,避免一次性大改引发波动。
更进一步

通过实操示例,掌握技术文档写作。

获取帮助

This site uses cookies and similar technologies for analytics, personalized ads (via Google AdSense), and essential functions. By clicking “Accept All”, you consent to our use of cookies. You can reject non-essential cookies by clicking “Reject All”.

Privacy Policy