>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Rust

Jak przyspieszyć budowanie MDX za pomocą Rust i Sätteri

Sätteri

Jeśli kiedykolwiek budowałeś dużą dokumentację lub bloga w Astro, Next.js lub Vite, prawdopodobnie napotkałeś problemy z szybkością budowania. Wydaje się, że właśnie dodałeś kilkadziesiąt plików z kodem i grafiką, a nagle Twój projekt potrzebuje czterdziestu sekund na zbudowanie zamiast pięciu.

Winowajca jest prawie zawsze ten sam: tradycyjny łańcuch unified, remark i rehype. To doskonałe narzędzia z tysiącami gotowych wtyczek, ale działają całkowicie w jednowątkowym JavaScript. Gdy musisz przeanalizować wiele ciężkich plików .mdx, podzielić je na drzewa AST, zastosować transformacje i ponownie złożyć je, Node.js szybko osiąga swoje limity.

Programiści z kolektywu Bruits postanowili zmierzyć się z problemem pragmatycznie. Stworzyli Sätteri — parser i kompilator Markdown/MDX, gdzie cała ciężka praca wykonywana jest przez Rust, podczas gdy programiści nadal korzystają ze znajomego JavaScript.

Jak działa ten hybrydowy mechanizm

Twórcy Sätteri nie przepisywali wszystkiego od zera. Zamiast tego wzięli sprawdzone rozwiązania społeczności i powiązali je za pomocą wiązań NAPI.

Wewnątrz monorepo projekt jest podzielony na dwa poziomy: niskopoziomowe skrzynki Rust oraz wrappery dla Node.js i Vite.

Na poziomie Rust używane są następujące komponenty:

  • satteri-pulldown-cmark — fork popularnego parsera pulldown-cmark z dodanym wsparciem składni MDX.
  • satteri-mdxjs-rs — fork kompilatora mdxjs-rs, dostosowany dla OXC — szybko rozwijającego się parsera JavaScript/TypeScript opartego na Rust.
  • satteri-ast — typy węzłów MDAST i HAST, a także operacje na drzewach.
  • satteri-napi-binding — warstwa mostkowa między C++ / Rust a JavaScript.

Na szczycie znajduje się czysta warstwa TypeScript. Główna idea jest taka, że nie musisz uczyć się Rust ani przepisywać swoich skryptów budowania. Instalujesz zwykły pakiet npm i pracujesz z nim jak z każdym innym narzędziem w pliku konfiguracyjnym.

Interesujące jest podejście do przetwarzania wtyczek. Napisanie kompilatora w Rust to proste zadanie. Prawdziwe wyzwania pojawiają się, gdy musisz dać użytkownikom możliwość modyfikowania drzewa AST w JS. W Sätteri parsowanie i składanie finalnego kodu odbywają się z maksymalną szybkością wewnątrz Rust, podczas gdy wywołania wtyczek użytkownika w JavaScript odbywają się selektywnie przez szybkie wiązanie. Autorzy szczerze inspirowali się architekturą Lightning CSS, która wykorzystuje podobną zasadę dla visitorów.

Budowanie projektów z Vite

Dla użytkowników Vite autorzy przygotowali osobny pakiet vite-plugin-satteri. Zamienia podłączanie plików .md i .mdx w kilka linii konfiguracji.

import { defineConfig } from 'vite';
import satteri from 'vite-plugin-satteri';

export default defineConfig({
  plugins: [
    satteri({
      // Ваши настройки и плагины
    }),
  ],
});

Bundle zawiera wtyczkę satteri-expressive-code do pięknego renderowania bloków kodu. Jeśli Twoja dokumentacja zawiera wiele przykładów z podświetlaniem składni, ta kombinacja zastępuje zazwyczaj ciężkie wtyczki Rehype.

Praktyczne korzyści i kompromisy

Dlaczego dodawać kolejne narzędzie do projektu, gdy masz biblioteki sprawdzone przez lata?

Po pierwsze, szybkość budowania w CI/CD i lokalnym programowaniu. Gdy masz setki stron, różnica między uruchamianiem operacji na V8 a skompilowanym kodem Rust staje się bardzo zauważalna.

Po drugie, wygoda migracji. Jeśli Twój projekt osiągnął limit wydajności remark, zazwyczaj proponuje Ci się albo cierpliwie czekać, albo przepisać wszystko w Go lub Rust. Sätteri zapewnia kompromis: parsowanie staje się szybkie, a infrastruktura wtyczek JS pozostaje dostępna.

Ale są niuanse. Projekt jest wciąż młody, z nieco ponad tysiącem gwiazdek na GitHub i 23 otwartymi zgłoszeniami w momencie pisania tego tekstu. Oznacza to, że niektóre przypadki składni MDX lub specyficzne wtyczki ekosystemu mogą wymagać dopracowania. Istnieją również ograniczenia wiązań JS: jeśli Twoja wtyczka JS wykonuje milion małych wywołań AST wewnątrz pamięci Rust, narzut marshalling może zjeść część zysków szybkości.

Czy warto wypróbować

Sätteri to świetne znalezisko dla osób budujących duże strony z treścią, systemy dokumentacji lub generatory stron statycznych. Jeśli Twój projekt Vite lub Astro potrzebuje sekund na załadowanie podczas edycji plików MDX, narzędzie zdecydowanie zasługuje na test.

Możesz wypróbować kompilator w akcji bez instalacji bezpośrednio w przeglądarce za pomocą oficjalnego playgrounda na stronie projektu lub dołączyć do społeczności Discord autorów, aby omówić funkcje.

Jeśli szukałeś sposobu na przyspieszenie budowania bez radykalnego przepisywania całego pipeline w innym języku, spróbuj zainstalować satteri i uruchom testy porównawcze na własnych plikach.

Powiązane projekty