从 0.x (v1) 迁移到 v2
从 2.0.0-rc.4 版本开始,pinia 支持 Vue 2 和 Vue 3!这意味着所有新的更新都将应用于此 v2 版本,以便 Vue 2 和 Vue 3 用户都能从中受益。如果您使用的是 Vue 3,这对您来说没有任何改变,因为您已经在使用 rc 版本,您可以查看 变更日志 以详细了解所有更改。否则,本指南适合您!
弃用
让我们看看您需要对代码进行的所有更改。首先,确保您已经在运行最新的 0.x 版本以查看任何弃用
npm i 'pinia@^0.x.x'
# or with yarn
yarn add 'pinia@^0.x.x'如果您使用的是 ESLint,请考虑使用 此插件 来查找所有弃用的用法。否则,您应该能够看到它们,因为它们显示为已删除。以下是被弃用并已删除的 API
createStore()变为defineStore()- 在订阅中,
storeName变为storeId PiniaPlugin重命名为PiniaVuePlugin(Pinia 的 Vue 2 插件)$subscribe()不再接受布尔值作为第二个参数,请改用带有detached: true的对象。- Pinia 插件不再直接接收 Store 的
id。请改用store.$id。
重大变更
删除这些后,您可以使用以下命令升级到 v2
npm i 'pinia@^2.x.x'
# or with yarn
yarn add 'pinia@^2.x.x'并开始更新您的代码。
通用 Store 类型
在 2.0.0-rc.0 中添加
将任何使用 GenericStore 类型的代码替换为 StoreGeneric。这是新的通用 Store 类型,应该接受任何类型的 Store。如果您正在使用 Store 类型编写函数,但没有传递其泛型(例如 Store<Id, State, Getters, Actions>),您也应该使用 StoreGeneric,因为没有泛型的 Store 类型会创建一个空 Store 类型。
function takeAnyStore(store: Store) {}
function takeAnyStore(store: StoreGeneric) {}
function takeAnyStore(store: GenericStore) {}
function takeAnyStore(store: StoreGeneric) {}插件的 DefineStoreOptions
如果您正在使用 TypeScript 编写插件,并扩展 DefineStoreOptions 类型以添加自定义选项,您应该将其重命名为 DefineStoreOptionsBase。此类型将应用于 setup 和 options Store。
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
# or with yarn
yarn add @vue/composition-api@latestwebpack 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 文件的现代化以支持 Node.js 中的原生 ESM 模块。文件现在使用 .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', }, ], }, }
开发者工具
Pinia v2 不再劫持 Vue 开发者工具 v5,它需要 Vue 开发者工具 v6。在 Vue 开发者工具文档 中找到扩展程序的测试版通道的下载链接。
Nuxt
如果您使用的是 Nuxt,pinia 现在有自己的专用 Nuxt 包 🎉。使用以下命令安装它
npm i @pinia/nuxt
# or with 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 部分。