Как ускорить сборку MDX с помощью Rust и Sätteri

01 авг 2026
1,265
34
5
1 неделя

Sätteri

Если вы собирали крупную документацию или блог на Astro, Next.js или Vite, то наверняка сталкивались с просадкой скорости сборки. Кажется, добавил пару десятков файлов с кодом и графиками, а проект начинает собираться не пять секунд, а сорок.

Виновник почти всегда один и тот же: традиционная цепочка из unified, remark и rehype. Это превосходные инструменты с тысячами готовых плагинов, но они целиком работают внутри однопоточного JavaScript. Когда нужно распарсить кучу тяжелых .mdx файлов, разломать их на AST-деревья, применить трансформации и собрать обратно, Node.js быстро сдает позиции.

Разработчики из коллектива Bruits решили подойти к проблеме с прагматичной стороны. Они создали Sätteri — парсер и компилятор Markdown/MDX, в котором всю тяжелую работу выполняет Rust, а разработчик продолжает пользоваться привычным JavaScript.

Как устроен этот гибрид

Создатели Sätteri не стали переписывать абсолютно всё с нуля. Вместо этого они взяли проверенные комьюнити решения и связали их вместе с помощью NAPI-bindings.

Реклама

Внутри монорепозитория проект разделен на два уровня: низкоуровневые ящики (crates) на Rust и обертки для Node.js и Vite.

На уровне Rust задействованы следующие компоненты:

  • satteri-pulldown-cmark — форк популярного парсера pulldown-cmark с добавленной поддержкой синтаксиса MDX.
  • satteri-mdxjs-rs — форк компилятора mdxjs-rs, адаптированный под быстрорастущий парсер JavaScript/TypeScript на Rust — OXC.
  • satteri-ast — типы узлов MDAST и HAST, а также операции над деревьями.
  • satteri-napi-binding — слой моста между C++ / Rust и JavaScript.

Сверху лежит аккуратный слой на TypeScript. Главная идея в том, что вам не нужно учить Rust или переписывать свои скрипты сборки. Вы устанавливаете обычный npm-пакет и работаете с ним как с любой другой утилитой в файле конфигурации.

Интересен сам подход к обработке плагинов. Написать компилятор на Rust — задача понятная. Настоящие сложности начинаются тогда, когда нужно дать пользователю возможность менять дерево элементов (AST) на JS. В Sätteri парсинг и сборка итогового кода происходят на максимальной скорости внутри Rust, а вызовы пользовательских плагинов на JavaScript происходят точечно через быстрый биндинг. Авторы честно вдохновлялись архитектурой Lightning CSS, где используется похожий принцип для визиторов.

Сборка проектов на Vite

Для тех, кто использует Vite, авторы подготовили отдельный пакет vite-plugin-satteri. Он превращает подключение .md и .mdx файлов в пару строк конфигурации.

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

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

В комплекте идет плагин satteri-expressive-code для красивого рендеринга блоков кода. Если в вашей документации много примеров с подсветкой синтаксиса, то эта связка заменяет привычные тяжелые плагины Rehype.

Практическая польза и компромиссы

Зачем тащить в проект еще один инструмент, когда есть проверенные годами библиотеки?

Во-первых, скорость сборки на CI/CD и при локальной разработке. Когда страниц сотни, разница между выполнением операций на V8 и скомпилированном Rust-коде становится очень заметной.

Во-вторых, удобство миграции. Если ваш проект уперся в производительность remark, вам обычно предлагают либо терпимо ждать, либо переписывать всю логику на Go или Rust. Sätteri дает промежуточный вариант: парсинг становится быстрым, а инфраструктура плагинов на JS остается доступной.

Но есть и нюансы. Проект пока молодой, у него чуть больше тысячи звезд на GitHub и 23 открытых issue на момент написания статьи. Это значит, что некоторые крайние случаи синтаксиса MDX или специфичные экосистемные плагины могут требовать доработки. Ограничения JS-биндингов тоже существуют: если ваш плагин на JS будет делать миллион мелких вызовов к AST внутри Rust-памяти, накладные расходы на маршалинг данных могут съесть часть прироста скорости.

Стоит ли пробовать

Sätteri — отличная находка для тех, кто строит крупные контентные сайты, системы документации или генераторы статических страниц. Если ваш проект на Vite или Astro загружается секундами при редактировании MDX-файлов, инструмент определенно заслуживает теста.

Пощупать компилятор в деле можно без установки прямо в браузере через официальный playground на сайте проекта, либо вступить в Discord-сообщество авторов и обсудить фичи.

Если вы искали способ ускорить билд без радикального переписывания всего пайплайна на другой язык, попробуйте поставить satteri и проверить бенчмарки на своих файлах.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.