You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3 Ionic项目中全局注册CordovaSQLiteDriver驱动的Ionic Storage方法

解决Ionic Storage全局访问及main.ts异步初始化问题

方案一:封装独立模块+异步启动Vue应用

这种方式能确保Storage实例初始化完成后,再将其注入全局,让组件、Pinia都能直接调用。

  1. 创建Storage封装文件
    新建src/utils/storage.ts,把初始化逻辑封装成一个自执行异步函数,导出初始化完成后的Promise:
import { Storage } from '@ionic/storage';
import * as Drivers from '@ionic/storage/drivers';
import { CordovaSQLiteDriver } from '@ionic/storage/sqlite';

// 仅初始化一次Storage实例
export const storagePromise = (async () => {
  const store = new Storage({
    name: 'localDb',
    driverOrder: [CordovaSQLiteDriver._driver, Drivers.IndexedDB, Drivers.LocalStorage],
  });
  await store.defineDriver(CordovaSQLiteDriver);
  await store.create();
  return store;
})();
  1. 修改main.ts异步启动应用
    用异步函数包裹应用启动逻辑,合法使用await等待Storage初始化,再将实例注入全局:
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';
import { storagePromise } from './utils/storage';

(async () => {
  const storage = await storagePromise;
  const app = createApp(App);
  const pinia = createPinia();

  // 方式1:挂载到Vue全局属性,组件中可通过this.$storage访问(需配置TS类型提示)
  app.config.globalProperties.$storage = storage;

  // 方式2:添加Pinia插件,让所有Pinia Store直接访问storage
  pinia.use(() => ({ storage }));

  app.use(pinia);
  app.mount('#app');
})();
  1. 配置TS类型提示(可选)
    在src/env.d.ts中添加全局属性类型声明,让TS识别$storage:
import type { Storage } from '@ionic/storage';

declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    $storage: Storage;
  }
}

方案二:不阻塞应用启动(按需等待)

如果不想让应用等待Storage初始化再启动,可以在需要使用的地方直接等待storagePromise:

  • Vue组件中使用:
<script setup lang="ts">
import { storagePromise } from '@/utils/storage';

const storage = await storagePromise;
// 调用Storage方法,比如 storage.get('user_token')
</script>
  • Pinia Store中使用:
import { defineStore } from 'pinia';
import { storagePromise } from '@/utils/storage';

export const useUserStore = defineStore('user', {
  actions: {
    async loadUserInfo() {
      const storage = await storagePromise;
      return await storage.get('user_info');
    }
  }
});

关键说明

  • 封装成Promise模块的好处是,无论在哪个地方调用,都只会初始化一次Storage实例,避免重复创建。
  • Pinia插件方式能让所有Store实例直接拿到Storage,无需重复导入模块。

内容的提问来源于stack exchange,提问作者Just Me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:12:56