Astro 7 切换到基于 Rust 的 Sätteri Markdown 引擎后,会将 display-math 块转换为普通代码,剥离标题锚点并丢弃自定义 Markdown 选项——对于任何升级后发现网站公式显示异常的用户来说,这都是一个痛点。

如果你依赖 LaTeX 风格的数学公式、自动标题链接或自定义 Markdown 插件,此次升级可能会导致内容无法阅读且导航失效,因此快速修复至关重要。

为什么升级会导致问题

Astro 现在将 Sätteri 作为其核心 Markdown 处理器运行。Sätteri 改变了插件的应用顺序:它会在你配置的 HTML-AST (HAST) 插件之前运行语法高亮。这种转变意味着三种常见模式将失效:

  • Display math – 由于高亮器先运行,由 $$ … $$ 分隔的块会被视为普通代码。
  • Heading anchors – 生成 slug(URL 友好的 ID)并随后自动链接这些标题的插件将无法识别这些 ID,因此链接无法创建。
  • Custom options – 你直接传递给 Sätteri 处理器的任何额外设置都会被忽略;Astro 仅转发三个预定义字段。

具体修复方案

1. 在 markdown-AST (MDAST) 而非 HTML-AST 上渲染数学公式

Astro 的 Markdown 流水线有两个插件插槽:

  • mdastPlugins – 在解析后的 Markdown 树转换为 HTML 之前运行。
  • hastPlugins – 在转换后的 HTML 树上运行。

由于高亮器在 hastPlugins 之前运行,数学公式会被转换为代码块。请将你的数学插件移至 mdastPlugins

export default {
  markdown: {
    mdastPlugins: [
      // put remark-math (or your custom math handler) here
    ],
    // leave hastPlugins for things that truly need HTML nodes
  }
}

标准配置通常先安装 slug 生成器,随后安装 autolink 插件。在 Astro 中,内置的 heading-ID 插件是在你的列表之后运行的,导致 autolink 插件无法找到可附加的对象。请将 slug 插件放在列表的首位,然后是 autolink 插件。

export default {
  markdown: {
    mdastPlugins: [
      satteriSlug(),            // must be first
      satteriAutolinkHeadings() // runs after slug, sees IDs
    ]
  }
}

现在每个标题都会获得一个 ID,autolink 插件可以为其包裹适当的锚点。

3. 将额外配置放在 Astro markdown 对象的顶层

Astro 仅向 Sätteri 处理器转发三个特定字段。任何嵌套在处理器内部的设置(例如 shikiConfig 对象)都会被丢弃。请将这些额外设置移至 markdown 配置的顶层。

export default {
  markdown: {
    shikiConfig: { theme: 'nord' }, // top-level, will be respected
    // other Astro-accepted fields …
    mdastPlugins: [/* … */],
    hastPlugins: [/* … */]
  }
}

常用 remark 插件快速替换指南

旧 remark 插件 新 Astro 功能标志 (feature flag)
remark-gfm features.gfm
remark-frontmatter features.frontmatter
remark-math features.math
remark-directive features.directive
remark-smartypants features.smartPunctuation
remark-wiki-link features.wikilinks

在你的 Astro 配置中,将插件名称替换为对应的 features.* 标志。

将插件移植到 Sätteri 时的最佳实践

  • Factory pattern – 为每个文档创建一个新的插件实例,以避免页面间的状态泄露。
  • Immutable nodes – 永远不要原地修改节点;返回一个新的节点对象,以便处理器能够正确跟踪更改。
  • Insert helpers – 当需要添加兄弟节点时,请使用 ctx.insertBeforectx.insertAfter,而不是手动对树进行切片 (splicing)。

遵循这些规则可以保持处理器的稳定性,并防止难以追踪的 bug。

后续关注事项

Astro 的文档仍将旧的插件顺序列为默认设置,因此新项目可能会无意中继承这种损坏的行为。请留意后续的 Astro 版本,可能会有重新排列内部 heading-ID 插件顺序的内置修复。在此期间,上述步骤是迁移到 Astro 7 后恢复数学公式渲染、标题锚点和自定义 Markdown 选项的唯一可靠方法。

核心要点: 切换到 Astro 7 的 Sätteri 引擎需要将数学处理移至 mdastPlugins,在 autolinks 之前前置 slug 插件,并将任何额外的 Markdown 设置从处理器对象中提取到顶层;完成这三项调整后,你网站的公式、导航链接和自定义 Markdown 功能将恢复正常。