从 0.x (v1) 迁移到 v2
从 2.0.0-rc.4 支持版本开始,pinia对Vue 2和Vue 3都支持!这意味着,所有最新的更新都将应用于V2版本,因此Vue 2和Vue 3用户都能从中受益。如果您使用的是Vue 3,这不会为您带来任何改变,因为您已经在使用rc,您可以查看CHANGELOG以获取所有更改的详细说明。否则,这篇指南就是为您准备的!
弃用的部分
让我们看看需要应用到代码中的所有变更。首先,请确保您已经在运行最新的0.x版本以查看弃用的内容:
npm i 'pinia@^0.x.x'# or with yarnyarn add 'pinia@^0.x.x'
如果您正在使用ESLint,请考虑使用此插件来找到所有已弃用的内容。否则,您应该相互对比查看它们之间相同的内容。下面是那些已弃用并被移除的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 yarnyarn add 'pinia@^2.x.x'
并开始更新您的代码。
Store 泛型
所有该类型的用法已由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 yarnyarn add @vue/composition-api@latest
webpack 4 支持
如果您使用的是webpack 4(Vue CLI使用webpack 4),您可能会遇到如下错误:
ERROR Failed to compile with 18 errorserror in ./node_modules/pinia/dist/pinia.mjsCan'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.jsmodule.exports = {configureWebpack: {module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: 'javascript/auto',},],},},}
- 如果您手动处理
webpack,您必须让它知道如何处理.mjs文件:
// webpack.config.jsmodule.exports = {module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: 'javascript/auto',},],},}
开发工具
Pinia v2不再支持Vue Devtools v5,它需要Vue Devtools v6。在Vue Devtools 文档中找到该扩展beta通道的下载链接。
Nuxt
如果您使用Nuxt,pinia现在有它的专有Nuxt包🎉。安装它:
npm i @pinia/nuxt# or with yarnyarn add @pinia/nuxt
还要确保更新您的@nuxtjs/composition-api包。
如果您使用的是TypeScript,请调整您nuxt.config.js和tsconfig.json的配置:
// nuxt.config.jsmodule.exports {buildModules: ['@nuxtjs/composition-api/module',- 'pinia/nuxt',+ '@pinia/nuxt',],}
// tsconfig.json{"types": [// ...- "pinia/nuxt/types"+ "@pinia/nuxt"]}
还建议您阅读Nuxt专用章节。
