>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
Rust

Como Acelerar Builds MDX com Rust e Sätteri

Sätteri

Se você já construiu uma documentação grande ou um blog com Astro, Next.js ou Vite, provavelmente já enfrentou problemas de velocidade de build. Parece que você acabou de adicionar algumas dezenas de arquivos com código e gráficos, e de repente seu projeto leva quarenta segundos para compilar em vez de cinco.

O culpado quase sempre é o mesmo: a cadeia tradicional de unified, remark e rehype. São ferramentas excelentes com milhares de plugins prontos, mas rodam inteiramente em JavaScript single-threaded. Quando você precisa fazer parse de vários arquivos pesados de .mdx, dividi-los em árvores AST, aplicar transformações e remontá-los, o Node.js rapidamente atinge seus limites.

Desenvolvedores do coletivo Bruits decidiram atacar o problema de forma pragmática. Eles criaram Sätteri — um parser e compilador de Markdown/MDX onde todo o trabalho pesado é feito pelo Rust, enquanto os desenvolvedores continuam usando JavaScript familiar.

Como Este Híbrido Funciona

Os criadores do Sätteri não reescreveram tudo do zero. Em vez disso, pegaram soluções comprovadas da comunidade e as conectaram usando bindings NAPI.

Dentro do monorepo, o projeto é dividido em dois níveis: crates Rust de baixo nível e wrappers para Node.js e Vite.

No nível Rust, os seguintes componentes são usados:

  • satteri-pulldown-cmark — um fork do popular parser pulldown-cmark com suporte adicional à sintaxe MDX.
  • satteri-mdxjs-rs — um fork do compilador mdxjs-rs, adaptado para OXC — um parser JavaScript/TypeScript baseado em Rust e em rápido crescimento.
  • satteri-ast — tipos de nós MDAST e HAST, bem como operações em árvores.
  • satteri-napi-binding — uma camada de ponte entre C++/Rust e JavaScript.

Em cima fica uma camada limpa em TypeScript. A ideia principal é que você não precisa aprender Rust ou reescrever seus scripts de build. Você instala um pacote npm normal e trabalha com ele como qualquer outro utilitário no seu arquivo de configuração.

Interessante é a abordagem para processamento de plugins. Escrever um compilador em Rust é uma tarefa direta. Os verdadeiros desafios começam quando você precisa dar aos usuários a capacidade de modificar a árvore AST em JS. No Sätteri, o parsing e a montagem do código final acontecem na velocidade máxima dentro do Rust, enquanto as chamadas para plugins de usuário em JavaScript acontecem seletivamente através de um binding rápido. Os autores foram honestamente inspirados pela arquitetura do Lightning CSS, que usa um princípio similar para visitors.

Construindo Projetos com Vite

Para usuários do Vite, os autores prepararam um pacote separado vite-plugin-satteri. Ele transforma conectar arquivos .md e .mdx em algumas linhas de configuração.

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

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

O bundle inclui um plugin satteri-expressive-code para renderização bonita de blocos de código. Se sua documentação tem muitos exemplos com syntax highlighting, esta combinação substitui os plugins Rehype pesados habituais.

Benefícios Práticos e Compromissos

Por que adicionar outra ferramenta ao seu projeto quando você tem bibliotecas comprovadas ao longo de anos?

Primeiro, a velocidade de build em CI/CD e desenvolvimento local. Quando você tem centenas de páginas, a diferença entre rodar operações no V8 e em código Rust compilado se torna muito perceptível.

Segundo, a conveniência da migração. Se seu projeto atingiu o teto de performance do remark, geralmente é oferecido que você espere pacientemente ou reescreva tudo em Go ou Rust. O Sätteri oferece um meio-termo: o parsing se torna rápido, enquanto a infraestrutura de plugins JS permanece acessível.

Mas há nuances. O projeto ainda é jovem, com pouco mais de mil estrelas no GitHub e 23 issues abertas no momento da escrita. Isso significa que alguns casos extremos de sintaxe MDX ou plugins específicos do ecossistema podem precisar de trabalho. Limitações de binding JS também existem: se seu plugin JS faz um milhão de pequenas chamadas ao AST dentro da memória Rust, o overhead de marshalling pode comer parte dos ganhos de velocidade.

Vale a Pena Experimentar

Sätteri é uma ótima descoberta para quem constrói grandes sites de conteúdo, sistemas de documentação ou geradores de sites estáticos. Se seu projeto Vite ou Astro leva segundos para carregar ao editar arquivos MDX, a ferramenta definitivamente merece um teste.

Você pode testar o compilador em ação sem instalação diretamente no seu navegador através do playground oficial no site do projeto, ou participar da comunidade Discord dos autores para discutir funcionalidades.

Se você estava procurando uma forma de acelerar seu build sem reescrever radicalmente todo o pipeline em outra linguagem, tente instalar satteri e rode benchmarks nos seus próprios arquivos.

Projetos relacionados