RustとSätteriでMDXビルドを高速化する方法
Astro、Next.js、Viteで大規模なドキュメントやブログを構築したことがある方なら、ビルド速度の問題に遭遇したことがあるでしょう。コードや画像を含むファイルを数十個追加しただけなのに、プロジェクトのビルドが5秒から40秒かかるようになった这种感觉を経験したことがあるかもしれません。
原因はほとんどいつも同じです:従来のunified、remark、rehypeチェーンです。これらは優れたツールで、何千ものすぐに使えるプラグインがありますが、すべてシングルプロセスのJavaScriptで実行されます。重いMDXファイルを解析してASTツリーに分解し、変換を適用して再構築する必要がある場合、Node.jsはすぐに限界に達します。
Bruitsコリティティブの開発者たちは、この問題に実用的に取り組むことにしました。彼らはSätteriを作成しました—すべての重い処理をRustが行い、開発者は慣れ親しんだJavaScriptを使い続けることができるMarkdown/MDXパーサー兼コンパイラです。
このハイブリッド仕組み
Sätteriの作成者はすべてを一から書き直しませんでした。代わりに、実績のあるコミュニティソリューションを採用し、NAPIバインディングでそれらを結びつけました。
モノレポ内では、プロジェクトは2つのレベルに分割されています:低レベルのRustクレートと、Node.jsおよびVite用のラッパーです。
Rustレベルでは、以下のコンポーネントが使用されています:
satteri-pulldown-cmark— MDX構文サポートを追加した、一般的なpulldown-cmarkパーサーのフォーク。satteri-mdxjs-rs— OXC(急速に成長しているRustベースのJavaScript/TypeScriptパーサー)に適応した、mdxjs-rsコンパイラのフォーク。satteri-ast— MDASTおよびHASTノードタイプとツリー操作。satteri-napi-binding— C++/RustとJavaScript間のブリッジレイヤー。
その上に、クリーンなTypeScriptレイヤーが配置されています。主なアイデアは、Rustを学んだり、ビルドスクリプトを書き直したりする必要がないということです。通常のnpmパッケージをインストールし、設定ファイル内の他のユーティリティと同じように使用できます。
興味深いのは、プラグイン処理へのアプローチです。Rustでコンパイラを書くのは straightforward なタスクです。本当の課題は、ユーザーがJSでASTツリーを変更できるようにする必要があるときに始まります。Sätteriでは、解析と最終コードのアセンブリはRust内で最大速度で行われ、JavaScriptのユーザープラグインへの呼び出しは高速バインディングを通じて選択的に行われます。著者は、Lightning CSSのアーキテクチャからインスピレーションを受けています。このアーキテクチャは、访问者に対して同様の原則を使用しています。
Viteでのプロジェクトビルド
Viteユーザー向けに、作者たちは別のパッケージを準備しました。MDXファイルとMDXファイルの接続を数行の設定に変えるものです。
バンドルには、美しいコードブロックレンダリング用のShikiプラグインが含まれています。ドキュメントに多くの構文強調表示された例がある場合、この組み合わせは、通常のリハypeプラグインの代わりに使用できます。
実用的なメリットとトレードオフ
長年にわたって実証されてきたライブラリがあるのに、なぜプロジェクトに別のツールを追加するのですか?
第一に、CI/CDとローカル開発でのビルド速度です。何百ものページがある場合、V8での操作実行とコンパイル済みRustコードの違いは非常に顕著になります。
第二に、移行の利便性です。プロジェクトがremarkのパフォーマンス壁にぶつかった場合、通常は辛抱強く待つか、すべてをGoやRustで書き直すかのどちらかを提供されます。Sätteriは中間の道を提供します:解析は高速になり、JSプラグインインフラはアクセス可能なままです。
しかし、ニュアンスもあります。プロジェクトはまだ若く、GitHubでわずか千スター弱、執筆時点で23の未解決イシューがあります。これは、MDX構文のエッジケースや特定のエコシステムプラグインには作業が必要な場合があることを意味します。JSバインディングの制限も存在します:JSプラグインがRustメモリ内のASTに対して何百万もの小さな呼び出しを行う場合、マーシャリングのオーバーヘッドが速度向上の一部を食べてしまう可能性があります。
試してみる価値はあるか
Sätteriは、大規模なコンテンツサイト、ドキュメントシステム、静的サイトジェネレーターを構築している人にとって素晴らしい発見です。ViteまたはAstroプロジェクトでMDXファイルを編集しているときに読み込みに数秒かかる場合、このツールは確かに試す価値があります。
インストールせずにブラウザ内で直接コンパイラを試すことができます。プロジェクトのウェブサイトにある公式プレイグラウンドで試すか、作者のDiscordコミュニティに参加して機能について議論してください。
別の言語でパイプライン全体を書き直さずにビルドを高速化する方法を 찾ていた場合は、satteriをインストールして、自分のファイルでベンチマークを実行してみてください。
関連プロジェクト