В последние годы переход на Rust как основу для фронтенд-инструментов становится все более заметной тенденцией среди разработчиков. Одним из таких проектов, повлиявших на развитие экосистемы, является Browserslist-rs — Rust-реализация популярного движка совместимости браузеров Browserslist. Недавний масштабный рефакторинг этого инструмента существенно сократил размер бинарников более чем на 1 МБ, что положительно сказалось на производительности и потреблении памяти множества популярных frontend-утилит и библиотек. Browserslist используется практически во всех современных фронтенд-сборках и трансформациях. Он отвечает за определение целевых браузеров для поддержки, предоставляя простой язык запросов, такие как "более 0.
5% пользователей", "последние 2 версии" или "не устаревшие (not dead)" браузеры. Этот конфигурационный механизм лежит в основе таких инструментов, как Autoprefixer, Babel, Stylelint, ESLint, LightningCSS, Webpack, Rspack, Parcel и многих популярных фреймворков. Основная цель Browserslist — позволить разработчикам задавать, какие браузеры должны поддерживаться, чтобы код работал корректно и эффективно. Благодаря широкому распространению, инструмент имеет миллионы еженедельных загрузок и является важной частью фронтенд-инфраструктуры. Rust-реализация проекта под названием browserslist-rs появилась как ответ на потребность в более производительном и ресурсосберегающем решении в сравнении с JavaScript-версией.
Использование Rust обеспечивает безопасное управление памятью, высокую скорость выполнения и возможность компиляции в WebAssembly. Последнее обновление browserslist-rs включило существенный внутренний рефакторинг, в результате которого большинство динамических данных на этапе выполнения было заменено на статические структуры, внедренные на этапе компиляции. Это означает, что данные о браузерах и поддерживаемых функциях теперь не загружаются или парсятся во время запуска программы. Вместо этого они встроены в бинарный файл напрямую, что позволяет избегать накладных расходов памяти и времени на чтение и обработку JSON-документов или использования ленивых структур данных. В рефакторинг были включены несколько ключевых технических решений.
В первую очередь, все данные о браузерах и функциях стали храниться в статических слайсах Rust, что дает возможность легче и быстрее получать доступ к необходимой информации. Также была использована специализированная структура PooledStr, направленная на сокращение дублирования строк в памяти. Для поиска данных применен двоичный поиск, заменивший более ресурсоемкие хеш-таблицы, а версии браузеров упакованы битами для более компактного представления. Хотя некоторые устаревшие ленивые структуры LazyLock остались, их количество минимально, и они не влияют на общую эффективность. В результате этих изменений положительный эффект оказался значительным.
Во-первых, размер бинарников для проектов на основе Rust, таких как Rspack, сократился на 1,64 МБ, что особенно важно в условиях ограниченных окружений, например, при разворачивании CI/CD пайплайнов, использовании edge-вычислений или в WebAssembly-проектах. Во-вторых, в сборках WebAssembly размер снизился примерно на 1 МБ — с 4,5 до 3,5 МБ в режиме релиза. Помимо уменьшения размера произошел спад потребления памяти, что напрямую влияет на производительность и масштабируемость приложений при работе с Browserslist-rs. Важно отметить, что несмотря на переход к статическим данным, производительность обработки наиболее распространенных запросов к Browserslist осталась стабильной, а в отдельных редких случаях сложных проверок функций время поиска выросло незначительно и вполне приемлемо. Этот баланс качества и скорости крайне важен для сохранения совместимости с существующими frontend-инструментами и экосистемой в целом.
Перемещение инструментов для JavaScript и CSS-обработки на Rust — часть более масштабной тенденции, способствующей созданию более производительных и масштабируемых систем. Rust становится предпочтительным языком для реализации компиляторов, бандлеров и анализаторов кода благодаря своим преимуществам в безопасности, эффективном управлении памятью и возможностям компиляции в WebAssembly. В числе наиболее известных Rust-проектов для frontend-разработки — SWC (альтернатива Babel), Turbopack (следующая генерация Webpack), LightningCSS (быстрый парсер и трансформер CSS), Rspack, Rolldown и oxc (набор инструментов для анализа и форматирования JavaScript). Эти проекты не только улучшают скорость сборки и трансформации, но и уменьшают общий размер конечных продуктов, что существенным образом повышает удобство разработки и производительность приложений. Рефакторинг Browserslist-rs отображает, как глубокие инженерные решения в самом ядре экосистемы могут оказывать значительное влияние на всю цепочку разработки frontend-приложений.