MDX 运行时助手

Methanol 默认为每个 MDX 文件注入轻量级运行时上下文,旨在简化动态内容生成及模板集成流程。

上下文变量

在 MDX 环境中,以下辅助变量始终全局可用:

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

当前路由:{ctx.routePath}

上下文结构

ctx 对象包含的核心属性如下:

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

ctx.site

ctx.site 是站点级元数据和构建标志的快照,包括:

ctx.page 元数据对象

ctx.page 提供当前页面的完整元数据信息。完整字段列表如下:

注:目录索引页面的 routePath 始终包含尾随斜杠(例如 /guide/)。 运行时注入了 ctx.page.getSiblings() 以支持前后页导航。

使用示例:

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

ctx.pages 集合

ctx.pages 是一个包含项目及主题中所有页面元数据(结构同 ctx.page)的扁平数组。它会自动剔除标记为 exclude: true 的页面,并且除非显式设置 hidden: false,否则会忽略 /404/offline 页面。隐藏页面可能仍会出现在此集合中,但 ctx.pagesTree 会将其过滤掉。

此属性适用于生成自定义索引、站点地图或手动构建导航结构:

<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)与标准模板插值。