Библиотеки UI компонент популярны и удобны в некоторых случаях, но у них тоже есть обратные стороны. Одно дело, когда делаешь админку и используешь десятки компонент, другое - когда тебе надо всего пару компонент.
Было проведено исследование - взяты три HTML элемента: Button, Input и Select, и проверено, насколько увеличатся js и css бандлы если использовать для них одну из 10 распространенных UI библиотек для Vue 3.
Создать стилизованный по своему желанию компонент Button - это несколько килобайт кода и стилей. Представляет интерес, сколько "довеска" даёт каждая библиотека к этим нескольким килобайтам.
Почему? Потому что каждый килобайт javascript-a даёт нагрузку на браузер и прямо влияет на UX. И на DX.
Исследование
При тестировании не рассматривались возможности библиотек для построения лэйаутов, поддержка тем и прочий их функционал. Исследовался только footprint библиотек на пустом проекте.
Код тестов доступен в репозитории. Каждой UI библиотеке соответствует своя ветка (branch) репозитория.
Каждая библиотека устанавливалась согласно её документации, но при этом у некоторых не завелись сразу CSS стили. Наборы иконок для чистоты эксперимента также не ставились, поэтому у компонента Select в некоторых библиотеках визуальный дефект.
Скриншоты отображения кнопки, поля ввода и селекта в различных библиотеках:
Скриншоты
Vue 3 & HTML
Vuetify
Quasar
PrimeVue
Ellement Plus
Ant Design for Vue
Vant UI
Naive UI
Vuestic UI
Agnostic UI
Vanilla Components
Результаты
Среда: Node v18, Pnpm v8.3, Vue v3.2, Vite v4.3.9
Получившиеся размеры бандлов (округленно):
Библиотека |
Size js, KB |
Size css, KB |
GitHub stars (K) |
Vue 3 & HTML |
52 |
0.2 |
|
Vuetify 3 |
203 |
72 |
37.4 |
Quasar |
178 |
201 |
23.8 |
PrimeVue |
138 |
159 |
3.9 |
Element Plus |
843 |
325 |
20.4 |
Ant Design |
1132 |
598 |
18.3 |
Vant UI |
87 |
192 |
21.5 |
Vuestic UI |
515 |
186 |
2.9 |
Naive UI |
313 |
0.2 |
13 |
Agnostic UI |
67 |
97 |
0.64 |
Vanilla Components |
650 |
0.2 |
0.15 |
Результаты довольно неожиданные. Vuetify и Quasar ожидаемо тяжелы, но многие другие библиотеки характеризуют себя примерно как "lightweight, flexible & customizale UI library for Vue 3". Ну и у всех, конечно же, tree-shaking. Ради интереса, я добавил в квазаровский проект QTable как довольно тяжеловесный компонент - js бандл подрос на еще 30 КБ
Выводы
Если нужны качественные проверенные временем компоненты, и их надо много, то Quasar и PrimeVue вне конкуренции. Vuetify выглядит неплохо, но дискредитировал себя долгим переходом на Vue 3 (изначально неудачной архитектурой) и текущей неполнотой.
Ant Design for Vue и Element Plus наоборот в аутсайдерах.
Naive UI засунула стили в js бандл (из-за этого не было проблем или дополнительных телодвижений со стилями при установке в отличие от большинства других библиотек), поэтому точно сказать о ней что-то сложно. Но набор компонент вполне приличный.
Очень интересен Vant UI как прекрасным результатом, так и интересным подбором компонент и композаблов. Библиотека ориентирована на мобильные устройства (работа со свайпами и прочее). Проект активно развивается. Интересно, что у него GitHub звезд почти как у Quazar-a, хотя он не такой известный.
Ну и первое место - Agnostic UI. У них есть вариант элементов чисто с CSS, но и с компонентами результат впечатляющий. Конечно, компоненты не такие богатые и прилизанные, как у Vuetify или Element Plus, но разница в весе очевидна.
А, вообще, свои компоненты (если это не что-то типа сложных таблиц или компонента выбора даты) - наилучший вариант для любителей эффективного кода. Ну и делать базовые компоненты-обёртки, если используешь компоненты других библиотек.
Комментарии (6)
nin-jin
30.06.2023 14:38+1dom1n1k
30.06.2023 14:38+5Посмотрел на 2х с большими усилиями.
Есть полезные мысли, но они погребены под огромным слоем пустой породы. Если меньше закапываться в посторонние вопросы вроде тормозящих звездочек и меньше рекламировать mol, то это видео должно сократиться в 2-3 раза даже в режиме "наговорил одним дублем".В целом непонятна ЦА этого видео. Для общего развития оно слишком длинное, для серьезного ответственного выбора слишком поверхностное.
pmcode
В чём смысл этого сравнения? Вы пишете, что используете только три компонента, но при этом тащите в бандл весь UI фреймворк, когда каждый из них позволяет импортировать только нужное по кускам.
gmtd Автор
Покажите (код, ссылка на код) как это делается для Quasar и Vuetify
RokeAlvo
Полностью согласен, но в экосистеме vue это действительно проблема. Может они и позволяют, но это точно не одна строчка в конфиге, а чаще так и нельзя вообще