Markdown 到 MDX 迁移指南
介绍
从传统的 Markdown (.md) 迁移到 MDX (.mdx) 可以让你在内容中使用类型化的、交互式的 React 组件。如果你正在迁移到像 TinaCMS 这样的现代 CMS 或者在基于 Next.js 的静态网站中工作,本指南将展示如何自动将自定义 Markdown 内容转换为干净的 MDX。
一目了然
如果你需要以下内容:
- 你正在采用 MDX 进行基于 React 的内容渲染
- 你的 Markdown 文件使用自定义容器,例如 YouTube 嵌入
- 你想避免手动重写成千上万的文件
关键迁移挑战
- 旧的短代码和自定义语法不兼容 MDX
- MDX 需要有效的 JSX —— 原始 HTML 和插件无法工作
- Markdown 插件不可移植
- 手动转换既慢又容易出错
脚本概述
我们编写了一个 Python 脚本,它可以:
- 递归扫描 .md 文件
- 使用正则表达式检测自定义块
- 用 JSX 组件替换每个块
- 清理格式工件(例如
<!--endintro-->) - 输出 .mdx 文件
支持的块类型
以下是脚本将 Markdown 模式转换为 MDX 组件的关键模式:
注意: 一些示例是为其开发的项目所独有的。
原始格式 (.md) | 它代表的内容 | 转换后 (.mdx) |
|---|---|---|
| 信息或旁白框 |
|
| 带有主题、正文等的电子邮件 |
|
| 带有反馈标签的图像 |
|
| 带有大小/边框变体的图像 |
|
| 带有标题的独立图像 |
|
| 样式化的标题文本 |
|
| 带有描述的 YouTube 视频 |
|
这些反映了我们在原始 Markdown 内容中使用的常见模式。
示例转换(前后对比)
之前(Markdown):
::: email-template| | || -------- | --- || To: | XXX || Cc: | YYY || Bcc: | ZZZ || Subject: | {{ EMAIL SUBJECT }} |::: email-content### Hi XXX,{{ EMAIL CONTENT }}::::::::: goodFigure: Good example - Nice email template:::::: good:::`youtube: https://www.youtube.com/watch?v=dQw4w9WgXcQ`**Watch this classic hit**
之后(MDX):
<emailEmbedfrom=""to="XXX"cc="YYY"bcc="ZZZ"subject="{{ EMAIL SUBJECT }}"body={<>## Hi XXX,{{ EMAIL CONTENT }}</>}figureEmbed={{preset: "goodExample",figure: "Good example - Nice email template",shouldDisplay: true}}/><imageEmbedalt="Image"size="large"showBorder={true}figureEmbed={{preset: "goodExample",figure: 'Well-structured diagram',shouldDisplay: true}}src="diagram.png"/><youtubeEmbed url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" description="Watch this classic hit" />
渲染的电子邮件模板:
运行脚本
要转换单个文件:
python convert_md_to_mdx.py path/to/rule.md
要转换所有文件:
python convert_md_to_mdx.py
转换后,启动你的本地 TinaCMS 网站并浏览转换后的页面,以确保自定义块(视频、旁白、电子邮件、图像等)正确渲染。
扩展脚本
- 为自定义容器添加新的正则表达式模式
- 修改 JSX 输出以匹配你的组件 API
- 调整解析逻辑以处理边缘情况或元数据
最后说明
这个脚本使得将成千上万的 Markdown 文件转换为适合现代框架的干净、结构化的 MDX 成为可能。
如果你正在进行类似的迁移并希望帮助适应或扩展这种方法,SSW 团队在 MDX 和 TinaCMS 项目方面有经验,可以提供帮助。
→ 查看脚本: convert_md_to_mdx.py