// A devlog by mood.

Astro 6.4登場!Sätteri移行を検討してみた

Astro 6.4で追加されたMarkdown processor APIとSätteriを確認しつつ、今のブログでは切り替えずunifiedのままにした判断メモ。

Astro 6.4が出て、Markdownまわりに少し大きめの更新が来ていました。

Astro 6.4 | Astro
Astro 6.4 introduces a new pluggable Markdown processor API, a Rust-based Markdown processor for faster builds, and helpers to wire up experimental advanced routing with Cloudflare.
Astro 6.4 | Astro favicon astro.build
Astro 6.4 | Astro

今回気になったのは、新しいmarkdown.processorAPIと、Rust製Markdown processorのSätteri。

Markdownのビルドが速くなるなら良さそう。
ただ、このブログではMarkdownにいくつかプラグインを入れているので、単純に差し替えて終わりなのかを確認しました。

Astro 6.4で変わったこと

Astro 6.4では、Markdownの処理パイプラインをmarkdown.processorで差し替えられる。

これまで通りのremark / rehypeベースの処理はunified()として使えます。
一方で、markdown.remarkPluginsmarkdown.rehypePluginsのようなトップレベル設定は非推奨になり、今後はprocessor側に渡す形が推奨されています。

ざっくり言うと、今までこう書いていたものを、

export default defineConfig({
  markdown: {
    remarkPlugins: [remarkPlugin],
    rehypePlugins: [rehypePlugin],
  },
});

これからはこう寄せる、という話です。

import { unified } from '@astrojs/markdown-remark';

export default defineConfig({
  markdown: {
    processor: unified({
      remarkPlugins: [remarkPlugin],
      rehypePlugins: [rehypePlugin],
    }),
  },
});

今すぐ壊れるわけではないですが、将来的にはこちらに寄せておいた方がよさそうです。

Sätteriも気になった

もうひとつ気になったのがSätteriです。

Sätteri
Sätteri puts flexible JavaScript plugins on top of a fast Rust Markdown / MDX engine. Best of both worlds.
Sätteri favicon satteri.bruits.org

SätteriはRustベースのMarkdown / MDX pipelineです。
Astro 6.4では@astrojs/markdown-satteriが追加されて、Markdown processorとして使えるようになっています。

公式ブログでも、Astro docsやCloudflare docsでビルド時間が短くなった例が紹介されていました。
Markdown記事が多いサイトではかなり効きそうです。

使うだけならこんな感じです。

import { satteri } from '@astrojs/markdown-satteri';
import { defineConfig } from 'astro/config';

export default defineConfig({
  markdown: {
    processor: satteri(),
  },
});

ただ、Sätteriはunifiedの完全な置き換えではありません。
ASTの形はMDAST / HASTに近いですが、プラグインAPIは互換ではないので、既存のremark / rehypeプラグインはそのまま動きません。

今のブログで使っているMarkdown機能

このブログでは、Markdownまわりで以下を使っています。

現在の機能Sätteriで再現メモ
見出しIDをASCII slugにする可能SätteriのHAST/MDAST pluginで実装できる
外部リンクにtarget / relを付与可能Sätteri docsにほぼ同じHAST plugin例がある
URLをリンクカード化可能ただしremark-link-card相当を自作する必要がある
Markdown内HTML可能@astrojs/markdown-satteri経由でraw HTMLの出力を確認できた
MDX可能@astrojs/mdxがSätteri processorを検出して専用経路で処理していた
Shikiハイライト可能markdown.shikiConfigがSätteri経由でも効くことを確認できた

調べた感じ、機能としては切り替え可能でした。

特に、raw HTML、MDX、Shikiが動くかは少し気になっていました。
ここは小さな検証用プロジェクトを作って、@astrojs/markdown-satteri@astrojs/mdxを入れてビルドしてみました。

結果として、

  • Markdown内のHTMLがそのまま出力される
  • Shikiのastro-codeが出力される
  • MDX内でAstro componentをimportして表示できる
  • render(post)headingsも生成される

ところまでは確認できました。

「今のremark / rehypeプラグインをSätteri用に作り直せばいける」という感じです。

切り替えなかった理由

「Astroの今後のメジャーバージョンでは、SätteriをデフォルトのMarkdownプロセッサにしたいと考えています。」

ということで、今回は一旦様子見ですね。

感想

Markdown記事が大量にあるサイトや、remark / rehypeへの依存が少ないサイトなら、切り替える価値はかなりありそうです。
今後Astro側でもSätteriがより標準に近づいていくなら、早めに触っておくのもよさそう。

ただ、このブログではまだunifiedのままで十分でした。

まずは非推奨になった設定をmarkdown.processorへ移して、将来のAstro 8.0に備えるくらいかな。

以上、おわり。