Pinia 從 0.x (v1) 遷移至 v2

2023-09-28 15:31 更新

從 0.x (v1) 遷移至 v2

2.0.0-rc.4 版本開(kāi)始,pinia 同時(shí)支持 Vue 2 和 Vue 3!這意味著,v2 版本的所有更新,將會(huì)讓 Vue 2 和 Vue 3 的用戶都受益。如果你使用的是 Vue 3,這對(duì)你來(lái)說(shuō)沒(méi)有任何改變,因?yàn)槟阋呀?jīng)在使用 rc 版本,你可以查看發(fā)布日志來(lái)了解所有更新的詳細(xì)解釋。如果你使用的不是 Vue 3,那這個(gè)指南是為你準(zhǔn)備的!

棄用

讓我們來(lái)看看你需要對(duì)你的代碼做出的所有修改。首先,為了解所有棄用,確保你已經(jīng)在運(yùn)行最新的 0.x 版本:

  1. npm i 'pinia@^0.x.x'
  2. ## 或者使用 yarn
  3. yarn add 'pinia@^0.x.x'

如果你正在使用 ESLint,可以考慮使用這個(gè)插件,來(lái)查找所有廢棄的用法。否則,你得手動(dòng)檢查。這些都是被廢棄且已經(jīng)刪除了的 API:

  • createStore() 變成 defineStore()
  • 在訂閱中,storeName 變成 storeId
  • PiniaPlugin 更名為 PiniaVuePlugin(Vue 2 的 Pinia 插件)
  • $subscribe() 不再接受 boolean 作為第二個(gè)參數(shù),而是傳遞一個(gè)帶有 detached: true 的對(duì)象。
  • Pinia 插件不再直接接收 store 的 id。使用 store.$id 代替。

非兼容性更新

刪除下面這些后,你可以用下面命令升級(jí)到 V2 版了:

  1. npm i 'pinia@^2.x.x'
  2. ## 或者使用 yarn
  3. yarn add 'pinia@^2.x.x'

然后開(kāi)始更新你的代碼。

通用 Store 類型

添加于 2.0.0-rc.0

StoreGeneric 取代 GenericStore 類型的全部用法。這是新的通用 store 類型,應(yīng)該可以接受任何類型的 store。如果你在寫函數(shù)時(shí)使用 Store 類型而不想傳遞其泛型 (例如Store<Id, State, Getters, Actions>),你可以使用 StoreGeneric,因?yàn)闆](méi)有泛型的 Store 類型會(huì)創(chuàng)建一個(gè)空的 store 類型:

  1. function takeAnyStore(store: Store) {} // [!code --]
  2. function takeAnyStore(store: StoreGeneric) {} // [!code ++]
  3. function takeAnyStore(store: GenericStore) {} // [!code --]
  4. function takeAnyStore(store: StoreGeneric) {} // [!code ++]

針對(duì)插件的 DefineStoreOptions

如果你在用 TypeScript 寫插件并擴(kuò)展了 DefineStoreOptions 類型來(lái)添加自定義選項(xiàng),你應(yīng)該把它改名為 DefineStoreOptionsBase。這個(gè)類型將同時(shí)適用于 setup 和 option store。

  1. declare module 'pinia' {
  2. export interface DefineStoreOptions<S, Store> { // [!code --]
  3. export interface DefineStoreOptionsBase<S, Store> { // [!code ++]
  4. debounce?: {
  5. [k in keyof StoreActions<Store>]?: number
  6. }
  7. }
  8. }

PiniaStorePlugin 已被重命名

類型 PiniaStorePlugin 被重新命名為 PiniaPlugin。

  1. import { PiniaStorePlugin } from 'pinia' // [!code --]
  2. import { PiniaPlugin } from 'pinia' // [!code ++]
  3. const piniaPlugin: PiniaStorePlugin = () => { // [!code --]
  4. const piniaPlugin: PiniaPlugin = () => { // [!code ++]
  5. // ...
  6. }

注意這個(gè)更新只能在升級(jí)到最新的沒(méi)有棄用的 Pinia 版本后生效。

@vue/composition-api 版本 %{#vue-composition-api-version}%

由于 pinia 目前依賴于 effectScope() ,你使用的 @vue/composition-api 的版本必須是 1.1.0 及以上:

  1. npm i @vue/composition-api@latest
  2. ## 或者使用 yarn
  3. yarn add @vue/composition-api@latest

支持 webpack 4 %{#webpack-4-support}%

如果你使用的是 webpack 4 (Vue CLI 使用的是 webpack 4),你可能會(huì)遇到這樣的錯(cuò)誤:

  1. ERROR Failed to compile with 18 errors
  2. error in ./node_modules/pinia/dist/pinia.mjs
  3. Can't import the named export 'computed' from non EcmaScript module (only default export is available)

這是構(gòu)建文件為支持 Node.js 中的原生 ESM 模塊進(jìn)行的現(xiàn)代化適配。為更好地支持 Node,文件現(xiàn)在使用的擴(kuò)展名是 .mjs.cjs。要解決這個(gè)問(wèn)題,你有兩種可用的方法:

  • 如果你使用 Vue CLI 4.x,升級(jí)你的依賴。具體修復(fù)步驟如下。
    • 如果你不可能升級(jí),請(qǐng)將下面的代碼添加到你的 vue.config.js 中:

  1. // vue.config.js
  2. module.exports = {
  3. configureWebpack: {
  4. module: {
  5. rules: [
  6. {
  7. test: /\.mjs$/,
  8. include: /node_modules/,
  9. type: 'javascript/auto',
  10. },
  11. ],
  12. },
  13. },
  14. }

  • 如果你手動(dòng)處理 webpack,你將必須讓它知道如何處理 .mjs 文件:

  1. // webpack.config.js
  2. module.exports = {
  3. module: {
  4. rules: [
  5. {
  6. test: /\.mjs$/,
  7. include: /node_modules/,
  8. type: 'javascript/auto',
  9. },
  10. ],
  11. },
  12. }

Devtools

Pinia v2 不再劫持 Vue Devtools v5,它需要的是 Vue Devtools v6??梢栽?Vue Devtools 文檔中找到該擴(kuò)展 beta 版本的下載鏈接。

Nuxt

如果你正在使用 Nuxt,pinia 現(xiàn)在有了專門的 Nuxt 軟件包????。請(qǐng)用以下方法安裝它:

  1. npm i @pinia/nuxt
  2. ## 或者使用 yarn
  3. yarn add @pinia/nuxt

還要確保更新你的 @nuxtjs/composition-api。

如果你使用 TypeScript,還要調(diào)整你的 nuxt.config.jstsconfig.json

  1. // nuxt.config.js
  2. module.exports {
  3. buildModules: [
  4. '@nuxtjs/composition-api/module',
  5. 'pinia/nuxt', // [!code --]
  6. '@pinia/nuxt', // [!code ++]
  7. ],
  8. }

  1. // tsconfig.json
  2. {
  3. "types": [
  4. // ...
  5. "pinia/nuxt/types" // [!code --]
  6. "@pinia/nuxt" // [!code ++]
  7. ]
  8. }
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)