Coming soon

Astro + MDX 初体验:从 Markdown 到组件的桥梁

记录在个人站点中集成 MDX 的过程,包括 Content Collections 配置与代码高亮方案选型。

Can · 2025年3月10日 · 7 min read

为什么选择 MDX

在构建个人作品集站点时,我希望博客既能写纯 Markdown,又能在需要时嵌入自定义组件。MDX 恰好提供了这种灵活性。

传统的 Markdown 虽然简洁高效,但在需要展示交互式组件、自定义布局或嵌入第三方内容时就显得力不从心了。MDX 的出现解决了这个问题——它允许你在 Markdown 文件中直接使用 JSX 组件,同时保留了 Markdown 的书写体验。对于个人博客来说,这意味着你可以在一篇技术文章中既用 Markdown 写叙述性文字,又在需要的地方插入代码演示、图表、甚至交互式的 UI 组件。

以下是一段示例代码,展示如何在 Astro 中读取 Content Collection:

// src/pages/blog/index.astro
import { getCollection } from "astro:content";

const posts = await getCollection("posts");
posts.sort((a, b) => 
  new Date(b.data.pubDate).getTime() - new Date(a.data.pubDate).getTime()
);

Content Collections 的配置

Astro 的 Content Collections 是管理结构化内容的核心机制。通过在 src/content.config.ts 中定义 schema,你可以为每篇文章的 frontmatter 提供类型校验,确保所有必填字段都不会遗漏。

这种类型安全的设计在实际开发中非常有价值。当你的文章数量增长到几十篇时,如果某篇文章缺少了 pubDatedescription 字段,构建阶段就会直接报错,而不是等到线上才发现页面展示异常。这比传统的 Markdown 博客系统要可靠得多。

在配置过程中,我遇到了一个值得记录的细节:Content Collections 默认会递归扫描 src/content/ 下的所有子目录。如果你希望按分类组织文章(比如 posts/tech/posts/life/),只需要在 schema 中添加一个 category 字段即可,不需要通过目录结构来区分。这样做的好处是保持了文件组织的扁平化,减少了路由配置的复杂度。

代码高亮方案选型

对于技术博客来说,代码高亮是必不可少的功能。Astro 内置了 Shiki 作为默认的代码高亮引擎,支持几百种编程语言和数十种主题。与 Prism.js 相比,Shiki 的优势在于它在构建时就完成了语法解析和样式注入,不需要在客户端加载额外的 JavaScript。

这完全符合 Astro 的「零 JS」理念——代码块在 HTML 中就是带有内联样式的 <span> 标签,浏览器渲染时不需要执行任何脚本。对于一个追求极致性能的个人站点来说,这是最理想的方案。

我在选型过程中也考虑过 rehype-pretty-code,它基于 Shiki 提供了更丰富的功能(如行号、行高亮、标题栏等)。但考虑到目前博客的代码块场景相对简单,Astro 的默认配置已经足够,暂时不引入额外依赖。等到未来需要更复杂的代码展示时,再做升级也不迟。

图片与排版

正文中的图片会通过 prose 样式自动获得合适的间距。配合 prose-img:my-8 可以确保图片上下留白充足,阅读节奏更舒适。

占位图

在中文排版中,行高的设置尤为重要。英文内容通常使用 1.5 到 1.6 的行高就足够了,但中文由于字符的视觉密度更高,需要更大的行间距来保证阅读舒适度。经过多轮测试,我最终选择了 1.8 的行高——这个数值在「留白充裕」和「紧凑不松散」之间取得了较好的平衡。

另一个值得关注的细节是每行的字数。在 Web 排版中,中文正文的最佳阅读体验通常在每行 35-45 个字之间。过宽的排版区域会导致读者的视线在换行时容易”跳行”,过窄则会频繁换行、打断阅读节奏。这也是为什么许多优秀的中文博客都会限制正文区域的最大宽度。

部署与构建

整个站点采用静态构建的方式部署在 Vercel 上。Astro 的构建产物是纯静态的 HTML + CSS + 少量按需加载的 JS(仅用于交互组件),这意味着页面的首屏加载速度极快,Lighthouse 的 Performance 评分可以轻松达到 95 以上。

Vercel 的部署流程也非常简洁:连接 GitHub 仓库后,每次 git push 都会自动触发构建和部署。从提交代码到线上生效,通常只需要 30-60 秒。对于个人项目来说,这种「写完即发布」的体验大大降低了维护成本。

小结

Astro 的 Content Collections + MDX 组合非常适合个人博客场景:类型安全、零配置的代码高亮、以及按需嵌入组件的能力,让写作和展示都更加顺畅。

回顾整个搭建过程,最大的收获是理解了「选择合适的工具比追求最强的工具更重要」。Astro 并不是功能最多的框架,但它在静态内容站点这个细分场景下做到了极致。对于一个以内容输出为核心的个人站点来说,这正是最需要的。

技术实践

推荐阅读