5. Сравнение буфферов в mini-css-extract-plugin

Пожалуй, мой любимый пункт. Почему? Ну, потому что непонятно в чём проблема!

Точнее как, понятно как починить, а вот источник проблемы неизвестен.



В вебпаке у модулей есть метод updateCacheModule, служащий для инвалидации модулей. Т.е. внтури него можем сравнить какие-то параметры (например, содержимое модуля) и принять решение об инвалидации. На деле это строка типа this.content === module.content. Только вот content — это буффер, а буфферы правильно сравнивать вот так: this.content.equals(module.content).



И тут мы подходим к самому интересному: мэйнтэйнеры вебпака сознательно написали такое сравнение, т.к. ожидается, что инстанс буффера будет один и тот же. А воспроизвести проблему получается только на CI. Причём если локально взять такой же докер-контейнер, то проблема уходит. В общем, весело.



Я обсуждал эту проблему с одним из мэйнтэйнеров, проблему вроде как воспроизвели и локализовали, и сошлись на том, что это рейс-кондишн, но пока что проблема остаётся актуальной. У себя в проекте мы просто запатчили mini-css-extract-plugin вот таким образом. А ишью я так и не создал, хотя стоило бы.



———



Такое вот весёлое приключение получилось. Так или иначе, для всех проблем нашлось решение и актуальными на текущий момент являются только 4 и 5 пункты.



Может возникнуть вопрос «а стоило ли это того?» и на мой взгляд да, более чем стоило.



Время сборки (при 100% кеш-хите):

приложение: с 252 секунд до 42 секунд — в 6 раз быстрее

сторибук: с 316 секунд до 58 секунд — в 5.5 раз быстрее.



Ну и здорово, что получилось локализовать и сообщить о багах, которые задевают многих пользователей вебпака.



Если хотите подробней почитать про кеш то вот две ссылки:

webpack.js.org/configuration/cache

github.com/webpack/changelog-v5/blob/master/guides/persistent-caching.md



P.S. Спасибо моему тимлиду Максу Леоньтеву за то что терпел и позволил довести работу до конца. И ребятам из webpack: Александру Акаит за консультации и Ивану Копейкину за фиксы багов.



———



Напоминаю, что вы можете заказать у меня как личные, так и корпоративные консультации по тулингу/CI.