Elytra
Blog网站

MDX 组件展示:从提示框到可播放的五线谱

一页看完本站已接入的 Fumadocs 组件、Mermaid、KaTeX、ABCJS 谱面和交互式图表,并附可复用的 MDX 写法。

这是一篇可以直接操作的组件样本。每一节先给出页面效果,再说明适合放在什么内容里;写新文章时,也可以复制对应的 MDX 片段。这里展示的都是本站已经接入的能力,关于搭站过程另见从 VitePress 到 Fumadocs。

想表达什么可以先选
补充说明、风险或结论Callout
并列视角、操作流程、可折叠细节Tabs、Steps、Accordions
目录结构、参数说明Files、TypeTable
关系和流程Mermaid
数学表达与可拖动的几何图KaTeX、JsxGraph
数据曲线与定制图层PlotChart、D3Figure
五线谱和试听AbcScore、AbcScoreFromFile
两张图之间的变化ImageComparer

1Markdown 本身也是展示的一部分

正文支持 强调、行内代码、站内链接、引用、任务列表、GFM 表格和脚注。代码块带语言标记即可获得高亮:

type Article = { title: string; draft?: boolean };
const article: Article = { title: '一篇 MDX 文章' };
  • 写清主线
  • 让示例能直接运行
  • 发布后继续补充新组件

例如,这页自身就是一个 MDX 文件,注册过的组件可以像 JSX 一样放进正文。1

2Fumadocs:组织文档信息

2.1Callout:让补充信息有明确语气

背景

info 适合放阅读前需要知道的上下文。

容易踩的坑

warn 用于提醒读者检查条件,例如路径是否相对于 content/。

错误后果

error 适合说明一个操作会造成什么明确的问题。

实践判断

idea 可以承载作者的取舍或建议。

得到的结果

success 适合在一段推导或步骤结束时收束结论。

写法从最短形式开始:

<Callout type="warn" title="检查路径">
  文件路径相对于 `content/`,不要写成站点 URL。
</Callout>

2.2Tabs、Steps 与 Accordions:安排阅读顺序

同一个概念有两种解释时,用标签页保留读者选择:

把横向比较放在同一位置,读者可以切换视角。

有先后顺序的任务,用步骤表示:

在专题目录下写 .mdx,为页面填写 frontmatter。
在该专题的 meta.json 中登记 slug。
运行构建,检查实际渲染和链接。

补充细节可以收起来,让正文先往前走:

2.3Files 与 TypeTable:文件树和参数表

下方文件树就是这篇文章的目录形状:

index.mdx
demo.abc
meta.json

TypeTable 在说明组件接口时,比一张纯文字表更容易同时交代类型和默认值:

Prop

Type

3Mermaid:源码和流程图放在一起

把代码块语言写为 mermaid,本站会把下面的流程渲染为图,同时保留文字源文件以便修改:

Loading diagram…

流程图适合展示分支与依赖;若需要让读者拖动点或观察连续变化,下面的几何组件更合适。

4KaTeX 与几何图:从公式到交互

行内公式可以写成 a2+b2=c2a^2+b^2=c^2,独立公式用双美元符号:

a⋅b=∥a∥ ∥b∥cos⁡θ\mathbf a\cdot\mathbf b=\|\mathbf a\|\,\|\mathbf b\|\cos\theta

拖动下图中的向量端点,可以立即看到夹角变化:

JsxGraph:拖动端点,观察两向量夹角
<JsxGraph preset="vectors-angle" caption="拖动端点观察夹角" />

还有视野、投影、二维与三维叉积等预设;实际讲解可参照点积在游戏开发中的应用与叉积在游戏开发中的应用。复杂的静态几何配置可放在 content/ 的 JSON 中,再由 JsxGraphFromFile 读取。

5图表:Plot 与 D3

PlotChart 适合直接展示函数或数据关系。下面是本站的内置预设,角度参数可以改:

Observable Plot:点积视野阈值
<PlotChart preset="dot-threshold" params={{ halfAngleDeg: 45 }} />

需要自己组合轴、曲线和标注时,可以使用 D3Figure 的声明式图层:

D3Figure:抛物线和三个采样点

两种图表也都有 FromFile 版本,可从 content/ 下的 JSON 加载配置。图的数据变长时,把它移到文件中,正文只保留组件调用即可。

6ABCJS:会响的五线谱

短谱可以直接把 ABC 记谱写入 AbcScore。点击音符可以试听;播放时有游标和高亮,进度条也可以跳转。下面是原创的四小节上行与回落旋律:

C 大调示例:四小节旋律,可点击音符试听

正在加载钢琴音色…

<AbcScore caption="四小节旋律">
{`X:1
T:Four-bar sketch
M:4/4
L:1/4
Q:1/4=96
K:C
C D E F | G A B c | c B A G | F E D C |`}
</AbcScore>

较长的谱面适合独立存为 .abc,和文章放在同一目录。下面这段直接读取本页的 demo.abc:

文件加载示例:八小节小旋律

正在加载钢琴音色…

<AbcScoreFromFile
  path="blog/(web)/mdx-component-showcase/demo.abc"
  caption="文件加载示例"
/>

谱面绘制可直接看到;播放会按需加载音色文件,因此试听时需要网络连接。实际长谱示例可看《Sweden》分析。

7ImageComparer:拖动看同一张图的变化

按住并左右拖动图片,比较同一标志的单色版和彩色版:

AfterBefore
<ImageComparer srcBefore="/assets/logo-bl.png" srcAfter="/assets/logo-col.png" />

最适合放同一尺寸、同一取景的前后图;这里的两张图来自本站现有素材。

8写下一篇时

先让段落、标题、列表和代码块承担正文。读者需要切换视角时用 Tabs,需要看先后关系时用 Steps 或 Mermaid,需要亲手操作才能理解变化时,再放交互图或谱面。本站注册组件的入口在 components/mdx.tsx;About 页面专用组件不用于 Blog。

注释

  1. 本站文章从 VitePress 到 Fumadocs介绍了 content/ 文件、MDX 与组件在写作流程中的关系;这里的说法对应本站当前实现。 ↩

CONTINUE EXPLORING

沿着这篇文章继续

在地图中查看

On this page