Pull to refresh

Vue state management: Pinia stores или composables с глобальными рефами?

Reading time2 min
Views6.9K

На Reddit прошла интересная дискуссия с 25К+ просмотрами по вопросу предпочтений разработчиков при необходимости управлять глобальным состоянием во Vue 3. Ниже её итоги.

Reddit подводит итоги года по частоте посещения /r/vuejs из разных стран мира
Reddit подводит итоги года по частоте посещения /r/vuejs из разных стран мира

Вопрос автором был поставлен так: Зачем использовать Pinia вместо глобальных ref's?

В своих проектах я использую composable функции с глобальным состоянием, как описано в документации Vue.

Каждая функция представляет собой объект бизнес-логики - например, useShoppingCart, useAppConfig и т. д. - и инкапсулирует реактивное состояние и бизнес-логику.

Этот подход часто критикуют и рекомендуют использовать Pinia.

Я знаю о поддержке SSR и возможностях Devtools в Pinia, но это не мой случай - они мне не нужны.

Так почему же, за исключением нужды в SSR и Devtools, я должен использовать Pinia?

Плюсы composable сторов на глобальных рефах очевидны:

  1. Простота

  2. Нативность по отношению к фреймворку.

  3. Отсутствие зависимостей означает отсутствие будущей ситуации "RIP Vuex" с переписыванием 50% кодовой базы проекта.

  4. API Composition выглядит очень зрелым и стабильным и вряд ли сильно изменится в ближайшем будущем (по сравнению с переходом Vue 2 -> Vue 3).

  5. Позволяет использовать всю мощь Reactivity API вместо жесткой Reactive обертки для переменных у Pinia. Разница в производительности может быть огромной.

Минусы?

Было получено на данный момент 36 комментариев, которые можно скомпилировать в следующие выводы:

  1. Большинство согласилось, что если не нужна поддержка SSR и интеграция с Devtools, то работа с Reactivity API напрямую и инкапсуляция реактивного состояния и бизнес логики в composable функции вполне возможна. Для многих это лучше использования Pinia.

  2. Работа с Reactivity API позволяет делать многое, что не позволяет Pinia - например, делать сторы на TypeScript классах.

  3. Был предложен лайфхак - во время разработки импортировать реактивные данные из composable сторов в Pinia, и тогда возможно использование Devtools. При билде для продакшна Pinia уже нет.

  4. Из-за того, что Pinia оборачивает всё в Reactive (даже в режиме setup stores) происходит сильная потеря производительности при работе с Ref или ShallowRef, которые не используют Proxy. Evan You говорил об этом, но плюсы от использования Proxy по сравнению с самописной реализацией реактивности во Vue 2, перекрывают минусы по его словам.

  5. Единственный аргумент в пользу Pinia - унификация работы со стором в команде.

Очень интересный пример использования TypeScript классов в качестве стора через composable был предложен пользователем ferferga. Он дает возможность использовать приватные поля, сеттеры и геттеры (без .value), получить first class type support, что было бы невозможно в случае с Pinia. Данный пример приведен здесь не в качестве рекомендации, но как демонстрация того, что возможно с Composition API


Интересная и полезная информация о Vue.js и фронтенде в целом на нашем сайте: Vue‑FAQ.org.

Также заходите на наш Телеграм‑канал: https://t.me/vuefaq

Only registered users can participate in poll. Log in, please.
Что вы предпочитаете для управления глобальным состоянием во Vue 3?
72.09% Pinia93
20.93% Composable функции с глобальным стейтом27
6.98% Другое9
129 users voted. 33 users abstained.
Tags:
Hubs:
Total votes 8: ↑5 and ↓3+3
Comments15

Articles