这篇文章介绍本站写作时可以直接使用的 Markdown 和 MDX 功能。它是 ScottWang Blog 的组件使用手册,不是通用的 MDX 教程。示例都可以复制到 content/writing、content/notes 或 content/thoughts 下的文章里。
文章仍然以 Markdown 为主。只有需要受控组件时才使用 MDX,外部视频不要直接写 iframe,也不要在正文里加入任意脚本。组件只接受文档中列出的参数,构建时会校验部分外部链接。
先选择 Markdown 还是 MDX
没有组件需求时,使用 .md 文件就够了。需要调用 Callout、LinkCard、GithubRepoCard 或视频组件时,把文件保存为 .mdx。目录文章可以使用 index.md 或 index.mdx,普通文件也可以直接放在对应内容目录下。
Markdown 文件仍然支持标题、列表、链接、图片、表格和代码块。MDX 只是增加了受控的 React 组件,不代表可以在正文里执行任意 JavaScript。
文本高亮
需要强调一句话或其中的一小段文字时,直接使用 HTML 原生的 <mark> 标签。它只增加背景色,不会改变文字大小、行高或段落布局。
这是一段文字,其中的 <mark>重要判断</mark> 需要被读者注意。<mark> 适合标出文章里的关键判断、定义或金句。它只负责视觉上的标记,不会自动生成金句列表,也不支持额外的颜色参数。保持文本简短,通常比整段高亮更容易阅读。
视频嵌入
博客提供了 YouTubeEmbed 和 BilibiliEmbed 两个组件,自动做响应式和 lazy loading,并在组件内部校验 provider URL。
YouTube 视频嵌入示例
<YouTubeEmbed url="https://www.youtube.com/watch?v=dQw4w9WgXcQ" title="示例 YouTube 视频" />B 站视频嵌入示例
<BilibiliEmbed url="https://www.bilibili.com/video/BV1GJ411x7h7" title="示例 B 站视频" />url 是必填参数。title 可选,用于无障碍标注,不填的话默认显示 "YouTube video" 或 "Bilibili video"。YouTube 同时支持 youtube.com/watch?v= 和 youtu.be/ 两种链接格式,B 站支持标准的 BV 号 URL。
外部链接卡片
LinkCard 用于把正文中的重要外部资料做成可扫描的链接卡片。它适合放在资源介绍之后,或读者需要继续打开原始网站的位置。卡片不会抓取第三方网页标题和摘要,文章作者需要显式填写内容。
<LinkCard
href="https://aihot.virxact.com/leaderboard"
title="AIHOT 大模型排行榜"
description="汇总多家公开模型榜单,并计算 AIHOT 共识分。"
label="Website"
/>href 和 title 是必填参数。description 和 label 可选,label 默认是 External link。组件只接受 http 和 https 链接,卡片会在新标签页打开,并带有安全的外链属性。
提示框 Callout
Callout 用来在文中插入需要读者注意的信息,渲染为带图标的 <aside> 块。
<Callout tone="info">这是一条信息提示</Callout><Callout tone="warning">这是一条警告提示</Callout><Callout tone="success">这是一条成功提示</Callout>tone 支持三个值,分别是 info(默认)、warning 和 success。内容写在标签之间,可以包含行内 Markdown。
Mermaid 图表
用 ```mermaid 开头的代码块会被自动渲染为 SVG 图表,客户端执行,支持暗色主题。
上图的源码如下:
```mermaid
graph TD
A[开始] --> B{判断条件}
B -->|是| C[执行操作]
B -->|否| D[结束]
```支持 Mermaid 常用图表类型,包括 graph、sequence、class、state、er、gantt、pie 和 packet。图表标题应使用 Markdown 标题或正文说明,不要把普通文字直接写进图表语法。
代码高亮
所有代码块通过 rehype-pretty-code 渲染,自动带上语法高亮和复制按钮。写法就是标准 Markdown 代码块,语言标识决定高亮方案:
const greeting = "Hello, MDX!";
console.log(greeting);```typescript
const greeting = "Hello, MDX!";
console.log(greeting);
```支持的语言标识跟 Shiki 一致,常见的 javascript、typescript、python、rust、go、bash、json、yaml 等都能识别。
GitHub 项目卡片
GitHub 项目卡片可以放在正文任意位置,适合放在资源、工具介绍或项目分析的结尾。它读取构建时缓存的仓库信息,显示 GitHub 图标、仓库头像、仓库名、项目描述、Stars、Forks、主要语言和 GitHub 入口。
<GithubRepoCard repo="lexiforest/curl_cffi" />组件的 repo 必须使用 owner/repo 格式:
<GithubRepoCard repo="acornjs/acorn" />github: "owner/repo" 仍可保留在 frontmatter 中,用于兼容旧内容和构建缓存,但不会自动在文章底部追加卡片。构建时如果 GitHub API 不可用,站点会优先使用已有缓存,首次没有缓存时仍保留仓库链接。
组件使用边界
- 外部视频使用
YouTubeEmbed或BilibiliEmbed,不要直接写 iframe。 - 重要网站或文档使用
LinkCard,普通句子中的引用使用标准 Markdown 链接。 - GitHub 仓库使用
GithubRepoCard,不要手写仓库统计数字。 - 提示信息使用
Callout,不要用 HTML 颜色和粗体模拟提示框。 - 流程、时序或结构关系使用 Mermaid 代码块,不要在正文里加入脚本。
- 组件参数应当来自已经核验的资料,尤其是标题、描述、版本、仓库和外部链接。