В последнее время язык программирования Rust находится на самом гребне волны хайпа. То тут, то там пестрят такие заголовки: «делаем на раст some_gnu_cli_utility», «Rust‑реализация привычной программы», «давайте перепишем на Rust ВООБЩЕ ВСЁ». Мне и самому очень нравится этот язык, и рост его популярности считаю вполне заслуженным. Несмотря на крутую кривую обучения и весьма высокий порог входа, в Rust правильно сделано если не всё, то почти всё. Многие языки годами и десятилетиями шли к тому, что «крабоводам» предлагалось «из коробки» на заре истории Rust.

Эпоха, когда во фронтенд‑экосистеме раз в неделю появлялся новый JS‑фреймворк, канула в Лету. На дворе 2024-й, теперь раз в неделю появляется новый бандлер, причём зачастую написанный именно на Rust (например, Turbopack, Rolldown, Farm и Mako от китайских товарищей). В этой статье я хочу опробовать в действии наиболее многообещающий из них — Rspack. Он позиционируется как быстрый сборщик, имеющий полную обратную совместимость с Webpack. Разработчики Rspack несколько месяцев назад выпустили стабильную мажорную версию (1.0) и продолжают активно развивать проект.

Что ж, давайте его попробуем. В качестве подопытного кролика возьмём не очередной Hello World, специально заточенный под бенчмарки, а реальный сложный проект, в котором есть:

  • четыре режима сборки Webpack;

  • сложная предметная область и, соответственно, сложная логика;

  • 550+ React‑компонентов.

Кстати, вот моя статья, где описывается, как содержать в чистоте конфигурационные файлы на подобного рода «атомоходах».

Что не так с Webpack?

Он медленный, особенно в больших проектах. Чтобы не быть голословным, приведу результаты измерения времени его работы (измерял на рабочем Macbook Pro M1, на машинах послабее будет отрабатывать ещё дольше).

  • Длительность запуска dev‑сервера: около 25 секунд.

  • Длительность сборки изменений во время разработки с HMR: около 10 секунд.

  • Длительность сборки production‑артефактов: примерно 30 секунд.

Согласитесь, ждать почти 10 секунд после каждого сохранения быстро начинает раздражать. Иногда эти секунды кажутся вечностью. Душу разработчика терзает желание хоть как‑то ускорить горячую замену модулей и улучшить developer experience. Как раз недавно я наткнулся на серию статей про Rspack и очень захотел его опробовать в деле.

Приготовление Rspack

Устанавливаем с официального сайта:

$ npm add @rspack/core @rspack/cli -D

Затем, как они рекомендуют, просто заменяем в package.json:

{
  "scripts": {
-   "serve": "webpack serve",
-   "build": "webpack build",
+   "serve": "rspack serve",
+   "build": "rspack build",
  }
}

Но нетут‑то было. Обещанная полная обратная совместимость с Webapck не такая уж и полная. «Мелким шрифтом» на официальном сайте всё же написано, что некоторые плагины и загрузчики требуют своей собственной конфигурации. Я почти полностью переписал конфигурационные файлы. Заодно был подчистил накопившийся техдолг, так как он блокировал миграцию на Rspack. Мне пришлось:

  • Обновить версию node.js (с 16.13 на 22.11).

  • Переделать файлы сборки с commonjs на es6 modules.

  • Избавиться от babel-loader и ts-loader в пользу swc-loader.

  • Выкинуть неиспользуемые в проекте части конфигурационных файлов.

Этот рефакторинг конфигов занял у меня три вечера и стоил пять кружек мятного чая.

Дегустация Rspack

Результаты работы сборщика Rspack приятно порадовали. Длительность работы (как сборка production‑артефактов, так и запуск dev‑сервера и HMR) по сравнению с Webpack значительно уменьшилась.

В таблице приведено сравнение результатов работы для разных режимов сборки проекта (стандартное статическое React‑приложение и web‑компонент).

Webpack

Rspack

Запуск dev-сервера стандартного приложения

27,1 сек

16,5 сек

Запуск dev-сервера для режима веб-компонента

24,3 сек

16,0 сек

HMR для стандартного приложения

8,9 сек

174 мс

HMR для веб-компонента

7,8 сек

153 мс

Production-cборка статического сайта

27,4 сек

15,6 сек

Production-сборка веб-компонента

30,4 сек

18,4 сек

Однако

Как человек, который родился в конце августа, я просто не мог принять на веру тезисы из лэндинга Rspack и хайп вокруг этой технологии. Поэтому для сравнения я решил довольно тщательно измерить длительность работы Webpack и Rspack. В моём арсенале были такие инструменты измерения производительности как:

Неожиданно SMP указал на наличие проблемы в существующей конфигурации Webpack, которая не только значительно увеличила длительность запуска, но и снизила скорость компиляции во время HMR. Как оказалось, 12 секунд во время запуска dev‑сервера отъедал бесполезный для нас плагин case‑sensetive‑webpack‑plugin. В то же время незаменимый Webpack Bundle Analyzer отрабатывал при каждом изменении в коде, и именно он и вызывал настолько долгий и раздражающий HMR. Выкинув совсем из конфигурации Webpack case‑sensetive‑webpack‑plugin и оставив Webpack Bundle Analyzer только для production‑сборок, я смог почти в два раза сократить длительность запуска dev‑сервера и более чем в 25 раз сократить продолжительность компиляции при HMR. Pull request на удаление этих плагинов из конфигурации моего проекта отправил в ту же минуту.

Бесполезный плагин, существенно увеличивающий время запуска Webpack
Бесполезный плагин, существенно увеличивающий время запуска Webpack
Очень полезный, но не нужный для dev-режима плагин
Очень полезный, но не нужный для dev-режима плагин

Будет справедливо привести результаты измерения производительности Webpack и Rspack как с тормозящими процесс сборки плагинами, так и без них.

Webpack (с тормозящими плагинами)

Webpack (без тормозящих плагинов)

Rspack (с тормозящими плагинами)

Rspack (без тормозящих плагинов)

Запуск dev-сервера стандартного приложения

27,1 сек

11,9 сек

15,5 сек

15,9 сек

Запуск dev-сервера для режима веб-компонента

24,3 сек

11,5 сек

16,0 сек

16,0 сек

HMR для стандартного приложения

8,9 сек

330 мс

174 мс

152 мс

HMR для веб-компонента

7,8 сек

350 мс

153 мс

119 мс

Production-cборка статичного сайта

27,4 сек

24,3 сек

15,6 сек

17,9 сек

Production-сборка веб-компонента

30,4 сек

31,5 сек

18,4 сек

19,5 сек

Послевкусие

Да, Rspack действительно шустрее, чем Webpack. Но разница, в сравнении с оптимизированной конфигурацией Webpack, совсем не значительная. Даже в большом и сложном проекте. Да, 150 миллисекунд на HMR (у Rspack) — это в целых два раза меньше, чем 300 миллисекунд у Webpack, но конечный разработчик совсем не почувствует этого ускорения. Экономия десяти секунд в длительности работы всего CI/CD-конвейера тоже не играет особой роли. А вот значительное изменение конфигурационных файлов может занять немало времени. Также не исключено, что таким изменением можно внести в проект пару‑тройку багов, которые дадут о себе знать в самый неподходящий момент.

В итоге я не советую переезжать на Rspack только потому, что там под капотом есть владение/заимствование и обработка ошибок при помощи монад. Лучше проверить производительность своей конфигурации Webpack тем же SMP, что‑нибудь неожиданное и интересное наверняка найдётся.

Спасибо за внимание, удачных вам настроек конфигурации, минимума багов и быстрых конвейеров.

Комментарии (2)


  1. RodionGork
    10.12.2024 09:38

    язык программирования Rust находится на самом гребне волны хайпа

    Интересно узнать поподробнее про этот гребень волны... на хедхантере 2-3 вакансии по СПб как было так и осталось. На tiobe индексе виден некий рост за последние год-два, но не удивлюсь если тут отчасти вклад некоторых новых блокчейн-платформ использующих Rust или похожие на него языки... Пока смарт-контракт напишешь, обгуглишься - вот в индекс все это и попадает :)

    Может в самом вот этом "домклик.ру" много на Rust разрабатывают?


    1. evgeniyrru Автор
      10.12.2024 09:38

      Статья немножечко не про Rust. Да, и "на волне хайпа" != "повсюду используется в продакшене".