esm和cmj混用报错分析

elpis DSL领域模型开发时,引入pinia处理模版数据时报错

代码

menu.js

js 复制代码
const { defineStore } = require('pinia') ; 
import { ref } from 'vue';
export const useMenuStore = defineStore('menu',()=>{const menuList = ref([])})

business.js

js 复制代码
import {useMenuStore} from './menu.js' 
const menuStore = useMenuStore()
报错信息:

getActivePinia()" was called but there was no active Pinia. Are you trying to use a store before calling "app.use(pinia)"?

报错提示为useMenuStoreapp.use(pinia)之前运行了

问题分析:getActivePinia() 为检查当前是否存在活跃实例。webpack打包正常,node环境运行正常,浏览器访问报错。说明是运行时问题,boot.js中有app.use(pinia)实例化。最终定位menu.js 文件 cmj 和esm混用导致

问题解析:

cmj和esm加载时机

CommonJS: 同步加载,运行时确认依赖。

ESM: 异步加载,编译时编译确认依赖。

总结:

在webpack 编译时 定义好了useMenuStore ,但是没有 执行const { defineStore } = require('pinia') ; 。在运行时才执行const { defineStore } = require('pinia') ; 但是useMenuStore 早已经定义好,而此时business.js已经提前调用了useMenuStore(),导致Pinia实例未激活。

解决方案

const { defineStore } = require('pinia') ; 替换为import { defineStore } from 'pinia';

相关推荐
Jolyne_几秒前
【浏览器插件】一键下载页面图片和文本
前端
Jony_5 分钟前
Android 类加载机制
前端·客户端
im_AMBER7 分钟前
HTTP概述 01
javascript·网络·笔记·网络协议·学习·http
1024小神18 分钟前
在 Swift 中,参数标签(argument label),用于在调用函数时提高代码的可读性。
前端
思茂信息21 分钟前
CST电动车EMC仿真(二)——电机控制器MCU的EMC仿真
开发语言·javascript·单片机·嵌入式硬件·cst·电磁仿真
joker学java24 分钟前
el表达式jstl和我们的js都是什么时候使用
前端
晴殇i25 分钟前
前端极速性能优化:从加载到渲染的全链路实战指南
前端·javascript
joker学java25 分钟前
el,js,jstl什么时候进行混用
前端
AAA阿giao27 分钟前
JavaScript 深拷贝全解析:从栈与堆内存机制到安全对象复制实践
前端·javascript·json
Keya27 分钟前
鸿蒙Next系统手机使用Charles配置证书并抓包教程
前端·harmonyos