Pinia и Vuex: различия

↑ 5.2 Состояние: Pinia, SSOT, Vue Query · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Легаси на Vuex ещё встречается; ждут перечня отличий и понимания миграции.

Объяснение

АспектVuexPinia
Статусрежим поддержкиофициальный стор Vue
Мутацииобязательны (mutations синхронные + actions)нет: state меняют напрямую или в actions
Модуливложенные modules, пространства имённезависимые сторы, композиция через импорт
TypeScriptсложная типизацияестественная, вывод типов
APIOptions; mapState/mapGetters/mapActionsOptions и Setup, storeToRefs
Composition APIобходные путинативно
DevToolsдада, time travel, история
SSR/HMRдада, проще
Размербольше~1 КБ
Плагиныестьесть, типизированные
// Vuex
mutations: { SET_USER(state, u) { state.user = u; } },
actions: { async login({ commit }, creds) { commit("SET_USER", await api.login(creds)); } },
 
// Pinia
actions: { async login(creds) { this.user = await api.login(creds); } }

Миграция: переносить модуль за модулем; Vuex и Pinia могут сосуществовать; заменять mapState на storeToRefs, мутации — на прямые изменения/actions, namespaced модули — на отдельные сторы (useXxxStore), rootState — на импорт другого стора.

Причины ухода от Vuex: многословность (мутации), слабая типизация, вложенные модули, сложность масштабирования.

Нюансы и подводные камни

  • Мутации давали трассировку изменений — в Pinia её обеспечивает DevTools и $onAction/$subscribe.
  • Прямое изменение state из компонентов поощряет разбросанные мутации: договоритесь о правилах (изменения через actions).
  • В Vuex-проекте с большим числом модулей миграцию планируйте по частям.
  • Плагины Vuex не совместимы с Pinia.

Практика

  1. Перенесите один Vuex-модуль в Pinia-стор.
  2. Замените mapState/mapActions в компонентах.
  3. Оцените объём кода до и после.

Вопросы с ответами

Связанные темы