Миграция с 0.x (v1) до v2
С версии 2.0.0-rc.4 Pinia поддерживает как Vue 2, так и Vue 3! Это означает, что все новые обновления будут применяться к версии 2, чтобы пользователи Vue 2 и Vue 3 могли извлечь из этого выгоду. Если вы используете Vue 3, это ничего не меняет для вас, так как вы уже использовали версию rc, и вы можете проверить список изменений для подробного объяснения всех изменений. В противном случае, это руководство для вас!
Устаревшее
Давайте рассмотрим все изменения, которые вам нужно внести в свой код. Прежде всего, убедитесь, что вы уже используете последнюю версию 0.x, чтобы увидеть какие-либо устаревшие функции:
npm i 'pinia@^0.x.x'
# или с помощью yarn
yarn add 'pinia@^0.x.x'Если вы используете ESLint, рассмотрите возможность использования этого плагина для поиска всех устаревших использований. В противном случае вы должны сразу видеть их как перечеркнутые. Вот API, которые были устаревшими и удалены:
createStore()становитсяdefineStore()- В подписках
storeNameстановитсяstoreId PiniaPluginбыл переименован вPiniaVuePlugin(плагин Pinia для Vue 2)$subscribe()больше не принимает boolean в качестве второго параметра, вместо него передавайте объект сdetached: true.- Плагины Pinia больше не получают напрямую
idхранилища. Вместо этого используйтеstore.$id.
Несовместимые обновления
После их удаления можно перейти на версию 2 с помощью:
npm i 'pinia@^2.x.x'
# или с помощью yarn
yarn add 'pinia@^2.x.x'И начните обновлять свой код.
Общий тип хранилища
Добавлен в 2.0.0-rc.0
Замените любое использование типа GenericStore на StoreGeneric. Это новый общий тип хранилища, который должен принимать любой тип хранилища. Если вы писали функции, использующие тип Store без передачи его дженериков (например, Store<Id, State, Getters, Actions>), то вам также следует использовать StoreGeneric, так как тип Store без дженериков создает пустой тип хранилища.
function takeAnyStore(store: Store) {}
function takeAnyStore(store: StoreGeneric) {}
function takeAnyStore(store: GenericStore) {}
function takeAnyStore(store: StoreGeneric) {}DefineStoreOptions для плагинов
Если вы писали плагины, используя TypeScript, и расширяли тип DefineStoreOptions для добавления пользовательских опций, то вам следует переименовать его в DefineStoreOptionsBase. Этот тип будет применяться как к setup-хранилищам, так и к option-хранилищам.
declare module 'pinia' {
export interface DefineStoreOptions<S, Store> {
export interface DefineStoreOptionsBase<S, Store> {
debounce?: {
[k in keyof StoreActions<Store>]?: number
}
}
}PiniaStorePlugin был переименован
Тип PiniaStorePlugin был переименован в PiniaPlugin.
import { PiniaStorePlugin } from 'pinia'
import { PiniaPlugin } from 'pinia'
const piniaPlugin: PiniaStorePlugin = () => {
const piniaPlugin: PiniaPlugin = () => {
// ...
}Примечание: данное изменение возможно только после обновления до последней версии Pinia без устаревших использований.
Версия @vue/composition-api
Поскольку pinia теперь полагается на effectScope(), необходимо использовать как минимум версию 1.1.0 пакета @vue/composition-api:
npm i @vue/composition-api@latest
# или с помощью yarn
yarn add @vue/composition-api@latestПоддержка webpack 4
Если вы используете webpack 4 (Vue CLI использует webpack 4), вы можете столкнуться с ошибкой следующего вида:
ERROR Failed to compile with 18 errors
error in ./node_modules/pinia/dist/pinia.mjs
Can't import the named export 'computed' from non EcmaScript module (only default export is available)Это связано с модернизацией файлов dist для поддержки нативных ESM-модулей в Node.js. Теперь файлы используют расширение .mjs и .cjs, тобы позволить Node воспользоваться этим преимуществом. Чтобы исправить эту проблему, у вас есть два варианта:
Если вы используете Vue CLI 4.x, обновите свои зависимости. Это должно включать исправление, приведенное ниже.
Если обновление для вас невозможно, добавьте это в ваш
vue.config.js:js// vue.config.js module.exports = { configureWebpack: { module: { rules: [ { test: /\.mjs$/, include: /node_modules/, type: 'javascript/auto', }, ], }, }, }
Если вы вручную управляете webpack, то вам придется указать ему, как работать с файлами
.mjs:js// webpack.config.js module.exports = { module: { rules: [ { test: /\.mjs$/, include: /node_modules/, type: 'javascript/auto', }, ], }, }
Devtools
Pinia v2 больше не перехватывает Vue Devtools v5, для этого требуется Vue Devtools v6. Найдите ссылку на скачивание на странице Документация Vue Devtools для бета-канала расширения.
Nuxt
Если вы используете Nuxt, у Pinia теперь есть собственный пакет для Nuxt 🎉. Установите его с помощью:
npm i @pinia/nuxt
# или с помощью yarn
yarn add @pinia/nuxtТакже не забудьте обновить пакет @nuxtjs/composition-api.
Затем адаптируйте свои nuxt.config.js и tsconfig.json, если вы используете TypeScript:
// nuxt.config.js
module.exports {
buildModules: [
'@nuxtjs/composition-api/module',
'pinia/nuxt',
'@pinia/nuxt',
],
}// tsconfig.json
{
"types": [
// ...
"pinia/nuxt/types"
"@pinia/nuxt"
]
}Рекомендуется также ознакомиться с специальным разделом Nuxt.