So beschleunigst du MDX-Builds mit Rust und Sätteri
Wenn du schon einmal große Dokumentation oder einen Blog mit Astro, Next.js oder Vite erstellt hast, bist du wahrscheinlich auf Build-Geschwindigkeitsprobleme gestoßen. Es fühlt sich an, als hättest du gerade ein paar Dutzend Dateien mit Code und Grafiken hinzugefügt, und plötzlich braucht dein Projekt vierzig Sekunden zum Builden statt fünf.
Der Übeltäter ist fast immer derselbe: die traditionelle unified-, remark- und rehype-Kette. Dies sind ausgezeichnete Tools mit Tausenden von fertigen Plugins, aber sie laufen vollständig in single-threaded JavaScript. Wenn du eine Menge schwerer .mdx-Dateien parsen, in AST-Bäume aufteilen, Transformationen anwenden und sie wieder zusammenbauen musst, stößt Node.js schnell an seine Grenzen.
Entwickler des Bruits-Kollektivs haben sich entschlossen, das Problem pragmatisch anzugehen. Sie haben Sätteri erstellt — einen Markdown/MDX-Parser und -Compiler, bei dem die gesamte Schwerarbeit von Rust erledigt wird, während Entwickler weiterhin vertrautes JavaScript verwenden.
Wie dieser Hybrid funktioniert
Die Ersteller von Sätteri haben nicht alles von Grund auf neu geschrieben. Stattdessen haben sie bewährte Community-Lösungen genommen und sie mit NAPI-Bindings zusammengeführt.
Im Inneren des Monorepos ist das Projekt in zwei Ebenen aufgeteilt: Low-Level-Rust-Crates und Wrapper für Node.js und Vite.
Auf der Rust-Ebene werden folgende Komponenten verwendet:
satteri-pulldown-cmark— ein Fork des beliebten pulldown-cmark-Parsers mit hinzugefügter MDX-Syntax-Unterstützung.satteri-mdxjs-rs— ein Fork des mdxjs-rs-Compilers, angepasst für OXC — einen schnell wachsenden Rust-basierten JavaScript/TypeScript-Parser.satteri-ast— MDAST- und HAST-Knotentypen sowie Baumoperationen.satteri-napi-binding— eine Brückenschicht zwischen C++/Rust und JavaScript.
Oben drauf liegt eine saubere TypeScript-Schicht. Die Hauptidee ist, dass du Rust nicht lernen oder deine Build-Skripte umschreiben musst. Du installierst ein normales npm-Paket und arbeitest damit wie mit jedem anderen Utility in deiner Konfigurationsdatei.
Interessant ist der Ansatz zur Plugin-Verarbeitung. Einen Compiler in Rust zu schreiben ist eine straightforward Aufgabe. Die eigentlichen Herausforderungen beginnen, wenn du Benutzern die Möglichkeit geben musst, den AST-Baum in JS zu modifizieren. In Sätteri passieren Parsing und Zusammenbau des finalen Codes mit maximaler Geschwindigkeit in Rust, während Aufrufe an Benutzer-Plugins in JavaScript selektiv über ein schnelles Binding erfolgen. Die Autoren wurden ehrlich von der Lightning-CSS-Architektur inspiriert, die ein ähnliches Prinzip für Visitors verwendet.
Projekte mit Vite bauen
Für Vite-Benutzer haben die Autoren ein separates Paket vite-plugin-satteri vorbereitet. Es verwandelt das Anschließen von .md- und .mdx-Dateien in ein paar Konfigurationszeilen.
import { defineConfig } from 'vite';
import satteri from 'vite-plugin-satteri';
export default defineConfig({
plugins: [
satteri({
// Ваши настройки и плагины
}),
],
});
Das Bundle enthält ein satteri-expressive-code-Plugin für schöne Code-Block-Darstellung. Wenn deine Dokumentation viele Syntax-hervorgehobene Beispiele hat, ersetzt diese Kombination die üblichen schweren Rehype-Plugins.
Praktischer Nutzen und Kompromisse
Warum ein weiteres Tool zu deinem Projekt hinzufügen, wenn du Bibliotheken hast, die sich über Jahre bewährt haben?
Erstens die Build-Geschwindigkeit in CI/CD und lokaler Entwicklung. Wenn du Hunderte von Seiten hast, wird der Unterschied zwischen dem Ausführen von Operationen auf V8 und kompiliertem Rust-Code sehr deutlich.
Zweitens die Migrations-Bequemlichkeit. Wenn dein Projekt die Leistungsgrenze von remark erreicht hat, wird dir normalerweise entweder geduldiges Warten oder ein komplettes Umschreiben in Go oder Rust angeboten. Sätteri bietet einen Mittelweg: Das Parsing wird schnell, während die JS-Plugin-Infrastruktur zugänglich bleibt.
Aber es gibt Nuancen. Das Projekt ist noch jung, mit etwas über tausend Stars auf GitHub und 23 offenen Issues zum Zeitpunkt des Schreibens. Das bedeutet, dass einige Randfälle der MDX-Syntax oder spezifische Ökosystem-Plugins möglicherweise noch Arbeit erfordern. Es gibt auch JS-Binding-Einschränkungen: Wenn dein JS-Plugin eine Million kleiner Aufrufe an den AST im Rust-Speicher macht, könnte der Marshalling-Overhead einige der Geschwindigkeitsgewinne aufessen.
Lohnt es sich zu testen
Sätteri ist ein großartiger Fund für diejenigen, die große Content-Seiten, Dokumentationssysteme oder Static-Site-Generatoren erstellen. Wenn dein Vite- oder Astro-Projekt beim Bearbeiten von MDX-Dateien Sekunden zum Laden braucht, verdient das Tool definitiv einen Test.
Du kannst den Compiler ohne Installation direkt in deinem Browser über den offiziellen Playground auf der Projekt-Website ausprobieren, oder der Discord-Community der Autoren beitreten, um Features zu diskutieren.
Wenn du nach einer Möglichkeit gesucht hast, deinen Build zu beschleunigen, ohne die gesamte Pipeline radikal in einer anderen Sprache umzuschreiben, versuche satteri zu installieren und führe Benchmarks mit deinen eigenen Dateien durch.
Ähnliche Projekte