MDX 运行时助手

Methanol 默认为每个 MDX 文件注入轻量级运行时上下文,以支持页面信息访问、动态内容生成及模板渲染。

核心上下文变量

以下变量在 MDX 环境中始终可用:

# {frontmatter.title ?? ctx.page.title}

当前路由:{ctx.routePath}

上下文对象结构详解

ctx 对象常用字段说明:

注意:对于 theme.sources 中的 URL 或 public/ 目录下的静态文件,通常无需手动调用 ctx.withBase()(构建系统将自动解析)。若在 JS 中动态生成 URL 且遇到开发环境路径解析不一致的问题,使用 ctx.withBase('/...') 可作为有效解决方案。

ctx.page

ctx.page 封装了当前页面的元数据,关键字段如下:

注:目录索引页面的 routePath 将以 / 结尾(例如 /guide/)。

示例:

{ctx.page.title}
{ctx.page.frontmatter?.excerpt}

ctx.pages

ctx.pages 为全站页面集合(包含所有 ctx.page 对象)。该集合包含索引页及隐藏页,但会自动剔除标记为 exclude: true 的页面。

适用于生成自定义页面列表、站点地图或构建手动导航:

<ul>
  {ctx.pages.map((page) => (
    <li><a href={page.routeHref || page.routePath}>{page.title}</a></li>
  ))}
</ul>

ctx.pagesTree

ctx.pagesTree 代表当前根目录下的层级导航树(严格遵循 isRoothidden 规则)。节点结构如下:

可用于构建与侧边栏一致的自定义导航 UI:

{ctx.pagesTree.map((node) => (
  <div>{node.title || node.name}</div>
))}

ctx.getSiblings

ctx.getSiblings() 用于获取当前导航序列中的相邻页面。该方法遵循导航根设定及隐藏/排除规则,确保顺序与侧边栏导航保持一致。

{(() => {
  const siblings = ctx.getSiblings.()
  if (!siblings) return null
  return (
    <nav>
      {siblings.prev ? <a href={siblings.prev.routeHref || siblings.prev.routePath}>上一页: {siblings.prev.title}</a> : null}
      {siblings.next ? <a href={siblings.next.routeHref || siblings.next.routePath}>下一页: {siblings.next.title}</a> : null}
    </nav>
  )
})()}

rawHTML

rawHTML 用于插入未转义的原始 HTML,适用于嵌入内联脚本或需保留原始格式的标记。

{rawHTML('<span class="badge">Beta</span>')}
{rawHTML`<div data-banner="true">Banner</div>`}

rawHTML 同样支持信号(Signals)与模板插值语法。