Astro 团队推出了 Sätteri,这是一个使用 Rust 编写的高性能 Markdown 与 MDX 处理器。它的目标很明确:在保留 unified 生态兼容性和 JavaScript 插件灵活性的同时,缩短内容密集型 Astro 项目的构建时间。
根据来源摘要,Sätteri 在 Astro 7.0 中可带来最高约 61% 的构建速度提升。实际收益仍会受到文章数量、MDX 复杂度、插件链和缓存策略影响,因此更适合通过真实项目基准测试来判断,而不是直接套用单一百分比。
Rust 处理器解决了什么问题
Markdown 和 MDX 构建通常不是单个步骤,而是一条处理链:读取文件、解析 Markdown、转换语法树、执行插件、处理 JSX 或组件表达式,最后生成可交付的页面。当项目积累了数百或数千篇内容时,解析和转换会成为构建耗时的重要组成部分。
Sätteri 将核心处理工作放到 Rust 中,带来几个直接变化:
- 解析和转换阶段可以获得更高的执行效率。
- 处理器自身的依赖数量有望减少,构建环境更轻量。
- Astro 可以继续接入 JavaScript 插件,降低现有 unified 工作流的迁移成本。
- 常见 Markdown 能力由处理器原生支持,减少额外插件带来的开销。
这里的关键并不是“Rust 替代了整个 JavaScript 生态”,而是把计算密集型的底层处理交给更适合这类任务的实现,同时保留插件层的可扩展性。
兼容性比单纯速度更重要
内容工程通常已经积累了自定义 remark、rehype 或 unified 插件。例如,项目可能会给标题添加锚点、检查链接、转换提示块,或者把特定 Markdown 语法改写成 HTML。完全切换到一个封闭处理器,往往意味着重写整条内容管线。
Sätteri 的设计重点之一是兼容 unified 生态。这样,团队可以逐步验证插件兼容性:先在本地或 CI 中比较输出,再处理少数依赖内部实现的插件,而不必一次性重构所有内容工具。
不过,兼容生态不等于所有插件都能无条件工作。依赖特定 AST 节点形状、处理顺序或 undocumented 行为的插件,仍然需要单独验证。尤其是 MDX 插件还可能涉及组件导入、表达式和编译阶段之间的边界。
可以这样做构建基准测试
下面的命令适合放在一个已有 Astro 项目的根目录执行。它会清理构建产物并连续执行三次构建,记录每次耗时。将 Sätteri 接入项目的实际配置应以所使用的 Astro 7.0 版本文档为准;不同预览版本的包名和配置入口可能不同。
#!/usr/bin/env bash
set -euo pipefail
runs="${1:-3}"
for run in $(seq 1 "$runs"); do
rm -rf dist .astro
printf 'Build %s/%s\n' "$run" "$runs"
/usr/bin/time -f 'elapsed=%E cpu=%P max_rss=%MKB' pnpm astro build
printf '\n'
done
保存为 benchmark-build.sh 后运行:
chmod +x benchmark-build.sh
./benchmark-build.sh 5
比较时至少固定以下条件:
- 使用相同的 Node.js、pnpm 和 Astro 版本。
- 清理或明确记录缓存状态。
- 保持文章数量、图片处理和环境变量一致。
- 分别测试纯 Markdown、包含组件的 MDX,以及启用完整插件链的构建。
- 除了总耗时,也观察 CI 的 CPU 时间和最大内存。
如果项目使用自定义 unified 插件,可以先建立一个最小回归样例。例如,下面的 MDX 文件可用于检查标题、代码块和组件表达式是否仍按预期生成:
import Callout from '../components/Callout.astro'
# Sätteri smoke test
<Callout type="note">This is an MDX component.</Callout>
```js
const answer = 42
```
这段文件只是可复制的测试输入,不代表某个具体 Sätteri 配置 API。接入实际项目时,应在 Astro 配置中启用对应处理器,并逐个验证现有 JavaScript 插件的输出。
迁移时要注意的边界
速度提升不能脱离内容管线观察。一个只包含简单 Markdown 的项目,瓶颈可能在图片处理、代码高亮、类型检查或页面渲染;此时更换 Markdown 处理器不会等比例缩短总构建时间。
此外,还要关注以下风险:
- 旧插件可能依赖特定 unified 版本或 AST 行为。
- MDX 编译错误的行号和错误信息可能发生变化,影响开发体验和 CI 日志解析。
- 自定义语法需要同时比较 HTML 输出和最终页面行为,不能只看构建是否成功。
- 构建结果可能受到换行、空白、转义或属性排序差异影响,快照测试应提前运行。
比较稳妥的采用路径是先在一个内容范围有限的站点或 CI 分支中试用,保存新旧处理器的构建耗时和输出差异;确认插件、快照、链接检查和部署产物都稳定后,再扩大到主站。
结论
Sätteri 的价值不只是“把 Markdown 解析得更快”。它试图同时处理性能、生态和依赖复杂度三个问题:用 Rust 加速核心路径,继续支持 JavaScript 插件,并减少处理器层面的负担。
对于大型文档站、博客和大量使用 MDX 的内容平台,值得用真实构建数据评估它。建议把“最高 61%”当作上限参考,而不是承诺值;最终决策应基于项目自己的文章规模、插件链、CI 环境和输出兼容性。