# 从 0.x (v1) 迁移到 v2
从 2.0.0-rc.4 支持版本开始,pinia
对Vue 2
和Vue 3
都支持!这意味着,所有最新的更新都将应用于V2
版本,因此Vue 2
和Vue 3
用户都能从中受益。如果您使用的是Vue 3
,这不会为您带来任何改变,因为您已经在使用rc
,您可以查看CHANGELOG (opens new window)以获取所有更改的详细说明。否则,这篇指南就是为您准备的!
# 弃用的部分
让我们看看需要应用到代码中的所有变更。首先,请确保您已经在运行最新的0.x
版本以查看弃用的内容:
npm i 'pinia@^0.x.x'
# or with yarn
yarn add 'pinia@^0.x.x'
如果您正在使用ESLint
,请考虑使用此插件 (opens new window)来找到所有已弃用的内容。否则,您应该相互对比查看它们之间相同的内容。下面是那些已弃用并被移除的API
:
createStore()
变成defineStore()
- 订阅中的
storeName
变成storeId
PiniaPlugin
被重命名为PiniaVuePlugin
(用于Vue 2
的Pinia
插件)$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中新增 (opens new window)
所有该类型的用法已由StoreGeneric
替换为GenericStore
。这是新的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 stores
都适用。
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()
,因此您使用@vue/composition-api
的版本至少为 1.1.0
:
npm i @vue/composition-api@latest
# or with 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
文件的现代化以支持Node.js
中的原生ESM
模块。文件使用.mjs
和.cjs
扩展名来让Node
从中受益。要解决此问题,您有两种可能:
如果您使用的是
Vue CLI 4.x
,请升级您的依赖项。这应该包括下面的修复。- 如果您无法升级,请将其添加到您的
vue.config.js
:
- 如果您无法升级,请将其添加到您的
// vue.config.js
module.exports = {
configureWebpack: {
module: {
rules: [
{
test: /\.mjs$/,
include: /node_modules/,
type: 'javascript/auto',
},
],
},
},
}
- 如果您手动处理
webpack
,您必须让它知道如何处理.mjs
文件:
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.mjs$/,
include: /node_modules/,
type: 'javascript/auto',
},
],
},
}
# 开发工具
Pinia v2
不再支持Vue Devtools v5
,它需要Vue Devtools v6
。在Vue Devtools 文档 (opens new window)中找到该扩展beta
通道的下载链接。
# Nuxt
如果您使用Nuxt
,pinia
现在有它的专有Nuxt
包🎉。安装它:
npm i @pinia/nuxt
# or with yarn
yarn add @pinia/nuxt
还要确保更新您的**@nuxtjs/composition-api
**包。
如果您使用的是TypeScript
,请调整您nuxt.config.js
和tsconfig.json
的配置:
// nuxt.config.js
module.exports {
buildModules: [
'@nuxtjs/composition-api/module',
- 'pinia/nuxt',
+ '@pinia/nuxt',
],
}
// tsconfig.json
{
"types": [
// ...
- "pinia/nuxt/types"
+ "@pinia/nuxt"
]
}
还建议您阅读Nuxt专用章节 (opens new window)。
← 组合Stores