Comment accélérer les builds MDX avec Rust et Sätteri
Si vous avez déjà construit une grande documentation ou un blog avec Astro, Next.js ou Vite, vous avez probablement rencontré des problèmes de vitesse de build. Vous avez l'impression d'avoir juste ajouté quelques dizaines de fichiers avec du code et des graphiques, et soudain votre projet prend quarante secondes à construire au lieu de cinq.
Le coupable est presque toujours le même : la chaîne traditionnelle unified, remark et rehype. Ce sont d'excellents outils avec des milliers de plugins prêts à l'emploi, mais ils s'exécutent entièrement en JavaScript single-threaded. Lorsque vous devez parser un tas de fichiers .mdx lourds, les décomposer en arbres AST, appliquer des transformations et les réassembler, Node.js atteint rapidement ses limites.
Les développeurs du collectif Bruits ont décidé de résoudre le problème de manière pragmatique. Ils ont créé Sätteri — un parser et compilateur Markdown/MDX où tout le travail lourd est effectué par Rust, tandis que les développeurs continuent d'utiliser JavaScript familier.
Comment fonctionne cet hybride
Les créateurs de Sätteri n'ont pas tout réécrit de zéro. Ils ont plutôt pris des solutions communautaires éprouvées et les ont assemblées en utilisant des liaisons NAPI.
À l'intérieur du monorepo, le projet est divisé en deux niveaux : des crates Rust de bas niveau et des wrappers pour Node.js et Vite.
Au niveau Rust, les composants suivants sont utilisés :
satteri-pulldown-cmark— un fork du populaire parser pulldown-cmark avec le support de la syntaxe MDX ajouté.satteri-mdxjs-rs— un fork du compilateur mdxjs-rs, adapté pour OXC — un parser JavaScript/TypeScript basé sur Rust en croissance rapide.satteri-ast— les types de nœuds MDAST et HAST, ainsi que les opérations sur les arbres.satteri-napi-binding— une couche de pont entre C++ / Rust et JavaScript.
Au-dessus se trouve une couche TypeScript propre. L'idée principale est que vous n'avez pas besoin d'apprendre Rust ni de réécrire vos scripts de build. Vous installez un package npm classique et vous travaillez avec comme avec n'importe quel autre utilitaire dans votre fichier de configuration.
L'approche du traitement des plugins est intéressante. Écrire un compilateur en Rust est une tâche simple. Les vrais défis commencent lorsque vous devez donner aux utilisateurs la possibilité de modifier l'arbre AST en JS. Dans Sätteri, le parsing et l'assemblage du code final se produisent à vitesse maximale à l'intérieur de Rust, tandis que les appels aux plugins utilisateur en JavaScript se font de manière sélective via une liaison rapide. Les auteurs ont été honnêtement inspirés par l'architecture de Lightning CSS, qui utilise un principe similaire pour les visitors.
Construire des projets avec Vite
Pour les utilisateurs de Vite, les auteurs ont préparé un package séparé vite-plugin-satteri. Il transforme la connexion des fichiers .md et .mdx en quelques lignes de configuration.
import { defineConfig } from 'vite';
import satteri from 'vite-plugin-satteri';
export default defineConfig({
plugins: [
satteri({
// Ваши настройки и плагины
}),
],
});
Le bundle inclut un plugin satteri-expressive-code pour un beau rendu des blocs de code. Si votre documentation contient de nombreux exemples avec coloration syntaxique, cette combinaison remplace les plugins Rehype habituels qui sont lourds.
Avantages pratiques et compromis
Pourquoi ajouter un autre outil à votre projet lorsque vous avez des bibliothèques éprouvées depuis des années ?
Premièrement, la vitesse de build en CI/CD et en développement local. Lorsque vous avez des centaines de pages, la différence entre l'exécution d'opérations sur V8 et du code Rust compilé devient très perceptible.
Deuxièmement, la commodité de migration. Si votre projet a atteint le plafond de performance de remark, on vous propose généralement soit d'attendre patiemment, soit de tout réécrire en Go ou Rust. Sätteri offre un juste milieu : le parsing devient rapide, tandis que l'infrastructure de plugins JS reste accessible.
Mais il y a des nuances. Le projet est encore jeune, avec un peu plus de mille étoiles sur GitHub et 23 issues ouvertes au moment de la rédaction. Cela signifie que certains cas limites de la syntaxe MDX ou des plugins spécifiques de l'écosystème peuvent nécessiter du travail. Les limitations des liaisons JS existent également : si votre plugin JS effectue un million de petits appels à l'AST dans la mémoire Rust, la surcharge de marshalling pourrait manger une partie des gains de vitesse.
Cela vaut-il la peine d'essayer
Sätteri est une trouvaille formidable pour ceux qui construisent de grands sites de contenu, des systèmes de documentation ou des générateurs de sites statiques. Si votre projet Vite ou Astro prend des secondes à charger lors de l'édition de fichiers MDX, l'outil mérite définitivement un test.
Vous pouvez essayer le compilateur en action sans installation directement dans votre navigateur via le playground officiel sur le site du projet, ou rejoindre la communauté Discord des auteurs pour discuter des fonctionnalités.
Si vous cherchiez un moyen d'accélérer votre build sans réécrire radicalement l'ensemble du pipeline dans un autre langage, essayez d'installer satteri et lancez des benchmarks sur vos propres fichiers.
Projets similaires