>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
Rust

如何使用 Rust 和 Sätteri 加速 MDX 构建

Sätteri

如果你曾经使用 Astro、Next.js 或 Vite 构建过大型文档或博客,你可能遇到过构建速度问题。感觉就像你刚添加了几十个包含代码和图形的文件,突然项目从五秒变成了四十秒。

罪魁祸首几乎总是一样的:传统的 unified、remark 和 rehype 链。这些都是优秀的工具,拥有数千个现成的插件,但它们完全在单线程 JavaScript 中运行。当你需要解析大量重型 .mdx 文件,将它们分解成 AST 树,应用转换,然后重新组装时,Node.js 很快就会达到极限。

Bruits 集体的开发者们决定务实地解决这个问题。他们创建了 Sätteri——一个 Markdown/MDX 解析器和编译器,所有繁重的工作都由 Rust 完成,而开发者继续使用熟悉的 JavaScript。

这个混合系统是如何运作的

Sätteri 的创作者们并没有从头重写一切。相反,他们采用了经过验证的社区解决方案,并使用 NAPI 绑定将它们连接在一起。

在 monorepo 中,项目分为两个层级:底层 Rust crate 和 Node.js 与 Vite 的包装器。

在 Rust 层级,使用了以下组件:

  • satteri-pulldown-cmark — 一个流行的 pulldown-cmark 解析器的分支,增加了 MDX 语法支持。
  • satteri-mdxjs-rs — mdxjs-rs 编译器的分支,针对 OXC(一个快速发展的基于 Rust 的 JavaScript/TypeScript 解析器)进行了适配。
  • satteri-ast — MDAST 和 HAST 节点类型,以及树操作。
  • satteri-napi-binding — C++ / Rust 和 JavaScript 之间的桥接层。

上面是一个简洁的 TypeScript 层。核心理念是你不需要学习 Rust 或重写构建脚本。你安装一个普通的 npm 包,然后像使用配置文件中的任何其他工具一样使用它。

插件处理的方法很有趣。用 Rust 编写编译器是一个直接的任务。真正的挑战始于你需要让用户能够用 JS 修改 AST 树。在 Sätteri 中,解析和组装最终代码在 Rust 内部以最大速度进行,而对 JavaScript 中用户插件的调用则通过快速绑定有选择地进行。作者们诚实地受到了 Lightning CSS 架构的启发,它对访问者使用了类似的原则。

使用 Vite 构建项目

对于 Vite 用户,作者们准备了一个单独的包 vite-plugin-satteri。它将连接 .md.mdx 文件变成几行配置。

import { defineConfig } from 'vite';
import satteri from 'vite-plugin-satteri';

export default defineConfig({
  plugins: [
    satteri({
      // Ваши настройки и плагины
    }),
  ],
});

该捆绑包包含一个用于美观的代码块渲染的 satteri-expressive-code 插件。如果你的文档有许多语法高亮的示例,这种组合可以替代通常较重的 Rehype 插件。

实际收益与权衡

当你已经有了经过多年验证的库时,为什么还要在项目中添加另一个工具?

首先是 CI/CD 和本地开发中的构建速度。当你有数百个页面时,在 V8 上运行操作和编译后的 Rust 代码之间的差异变得非常明显。

其次是迁移的便利性。如果你的项目已经达到了 remark 的性能上限,你通常只能选择耐心等待或用 Go 或 Rust 重写一切。Sätteri 提供了一个中间地带:解析变得快速,同时 JS 插件基础设施仍然可以访问。

但也有一些细微差别。这个项目还很年轻,在撰写本文时 GitHub 上只有一千多颗星和 23 个开放问题。这意味着 MDX 语法的某些边缘情况或特定生态系统插件可能需要工作。JS 绑定限制也存在:如果你的 JS 插件在 Rust 内存中对 AST 进行一百万次小调用,编组开销可能会吃掉一些速度提升。

值得一试吗

Sätteri 对于构建大型内容网站、文档系统或静态网站生成器的人来说是一个很好的发现。如果你的 Vite 或 Astro 项目在编辑 MDX 文件时需要几秒钟加载,这个工具绝对值得一试。

你可以通过项目网站上的官方 playground 直接在浏览器中试用编译器,无需安装,或者加入作者的 Discord 社区讨论功能。

如果你一直在寻找一种方法来加速构建而不需要用另一种语言彻底重写整个流程,请尝试安装 satteri 并在自己的文件上运行基准测试。

相关项目