MDX-builds versnellen met Rust en Sätteri
Als je ooit grote documentatie of een blog hebt gebouwd met Astro, Next.js of Vite, ben je waarschijnlijk wel eens tegen build-snelheidsproblemen aangelopen. Het voelt alsof je net een paar dozijn bestanden met code en afbeeldingen hebt toegevoegd, en plotseling duurt het bouwen van je project veertig seconden in plaats van vijf.
De schuldige is bijna altijd dezelfde: de traditionele unified-, remark- en rehype-keten. Dit zijn uitstekende tools met duizenden kant-en-klare plugins, maar ze draaien volledig in single-threaded JavaScript. Wanneer je een heleboel zware .mdx bestanden moet parsen, opsplitsen in AST-bomen, transformaties toepassen en weer samenstellen, bereikt Node.js snel zijn limieten.
Ontwikkelaars van het Bruits-collectief besloten het probleem pragmatisch aan te pakken. Ze creëerden Sätteri — een Markdown/MDX-parser en compiler waar alle zware berekeningen door Rust worden uitgevoerd, terwijl ontwikkelaars verder werken met vertrouwde JavaScript.
Hoe Deze Hybride Werkt
De makers van Sätteri hebben niet alles vanaf nul herschreven. In plaats daarvan namen ze bewezen community-oplossingen en verbonden ze met NAPI-bindings.
Binnen de monorepo is het project opgedeeld in twee niveaus: low-level Rust-crates en wrappers voor Node.js en Vite.
Op Rust-niveau worden de volgende componenten gebruikt:
satteri-pulldown-cmark— een fork van de populaire pulldown-cmark-parser met toegevoegde MDX-syntax-ondersteuning.satteri-mdxjs-rs— een fork van de mdxjs-rs compiler, aangepast voor OXC — een snelgroeiende op Rust gebaseerde JavaScript/TypeScript-parser.satteri-ast— MDAST- en HAST-knooppunttype, evenals boomoperaties.satteri-napi-binding— een bruglaag tussen C++ / Rust en JavaScript.
Bovenop ligt een schone TypeScript-laag. Het hoofdidee is dat je geen Rust hoeft te leren of je build-scripts hoeft te herschrijven. Je installeert een gewoon npm-pakket en werkt ermee zoals elke andere utility in je configuratiebestand.
Interessant is de aanpak voor plugin-verwerking. Een compiler in Rust schrijven is een eenvoudige taak. De echte uitdagingen beginnen wanneer je gebruikers de mogelijkheid wilt geven om de AST-boom in JS te modificeren. In Sätteri gebeuren het parsen en assembleren van de uiteindelijke code met maximale snelheid in Rust, terwijl aanroepen naar gebruikersplugins in JavaScript selectief plaatsvinden via een snelle binding. De auteurs werden eerlijk geïnspireerd door de architectuur van Lightning CSS, die een vergelijkbaar principe gebruikt voor visitors.
Projecten Bouwen met Vite
Voor Vite-gebruikers hebben de auteurs een apart pakket vite-plugin-satteri voorbereid. Het aansluiten van .md en .mdx bestanden wordt daarmee teruggebracht tot een paar configuratieregels.
import { defineConfig } from 'vite';
import satteri from 'vite-plugin-satteri';
export default defineConfig({
plugins: [
satteri({
// Ваши настройки и плагины
}),
],
});
De bundel bevat een satteri-expressive-code plugin voor mooie codeblok-rendering. Als je documentatie veel syntax-highlighted voorbeelden bevat, vervangt deze combinatie de gebruikelijke zware Rehype-plugins.
Praktische Voordelen en Afwegingen
Waarom nog een tool toevoegen aan je project als je beschikt over bibliotheken die al jaren bewezen zijn?
Ten eerste de bouwsnelheid in CI/CD en lokale ontwikkeling. Wanneer je honderden pagina's hebt, wordt het verschil tussen het uitvoeren van bewerkingen op V8 en gecompileerde Rust-code heel goed merkbaar.
Ten tweede het gemak van migratie. Als je project de prestatiegrens van remark heeft bereikt, wordt je meestal geadviseerd om ofwel geduldig te wachten of alles te herschrijven in Go of Rust. Sätteri biedt een middenweg: het parsen wordt snel, terwijl de JS-plugininfrastructuur toegankelijk blijft.
Maar er zijn nuances. Het project is nog jong, met iets meer dan duizend sterren op GitHub en 23 openstaande issues op het moment van schrijven. Dit betekent dat sommige edge cases van MDX-syntaxis of specifieke ecosysteemplugins nog werk nodig kunnen hebben. Er bestaan ook beperkingen met JS-binding: als je JS-plugin miljoenen kleine aanroepen doet naar de AST in Rust-geheugen, kan de marshalling-overhead een deel van de snelheidswinst tenietdoen.
Is Het De Moeite Waard Om Te Proberen
Sätteri is een gewond vinden voor degenen die grote contentsites, documentatiesystemen of statische site generators bouwen. Als je Vite- of Astro-project seconden nodig heeft om te laden bij het bewerken van MDX-bestanden, verdient de tool zeker een test.
Je kunt de compiler in actie uitproberen zonder installatie, rechtstreeks in je browser via de officiële playground op de projectwebsite, of deelnemen aan de Discord-community van de auteurs om functies te bespreken.
Als je op zoek bent naar een manier om je build te versnellen zonder radicaal de hele pipeline in een andere taal te herschrijven, probeer dan satteri te installeren en voer benchmarks uit op je eigen bestanden.
Gerelateerde projecten