[qiankun]主应用和子应用间通信报错:[vuex] do not mutate vuex store state outside mutation handlers.

报错情况:在这里插入图片描述
主要原因是主应用中定义的全局状态下发给子应用,子应用注册成vuex全局状态后,并修改了值更新给主应用,主应用也同步更新自己的全局状态,此时的全局状态是vuex注册过的,在主应用更改就会报错了。

主应用定义了全局数据(主要是登录的用户数据),用于下发给子应用:
store.js

import {
   initGlobalState} from 'qiankun'
import {
   reactive} from 'vue'
import registerGlobalModule from "./globalRegister"

// 让initialState变成可响应的:https://v3.cn.vuejs.org/guide/reactivity-fundamentals.html#%E5%A3%B0%E6%98%8E%E5%93%8D%E5%BA%94%E5%BC%8F%E7%8A%B6%E6%80%81
const initialState = reactive({
   
    user: {
   
        name: ''
    }
})
// 初始化全局状态
const actions = initGlobalState(initialState)
// actions默认提供:监听全局状态变化:state 新状态, prev 旧状态
actions.onGlobalStateChange((state, prev) => {
   
    console.log('【main change】', state, prev, initialState)
    for (const key in state) {
   
         initialState[key] = state[key]
     }
})
// 获取globalState下的某个子级对象,无key,表示取全部
actions.getGlobalState = (key) => {
   
    return key 
### 解决方案 当在 Linux 上部署 qiankun 后遇到子应用出现 `Cannot use import statement outside a module` 错误时,这通常是因为 JavaScript 文件未被正确识别为 ES 模块。此问题可以通过多种方式来解决。 #### 修改 HTML 文件结构 确保所有的 `<script>` 标签带有 `type="module"` 属性,以便浏览器能够理解这些脚本作为 ES 模块处理[^4]: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!-- 添加 type="module" --> <script type="module" src="./indexes.js"></script> </body> </html> ``` #### 配置 Webpack 或其他构建工具 对于基于 Vue 的微前端框架如 Qiankun 来说,如果使用的是 Webpack 构建,则需确认配置项支持 ES Modules 动态加载特性。具体来说,在 webpack.config.js 中设置如下选项可以解决问题[^3]: ```javascript // webpack.config.js module.exports = { // ... output: { libraryTarget: "umd", globalObject: "this" }, experiments: { topLevelAwait: true, } }; ``` 此外,还需检查 package.json 是否指定了 `"type": "module"` 字段,从而告知 Node.js 将整个项目视为 ECMAScript Module (ESM)[^1]。 #### 调整 Babel 插件配置 有时即使做了上述更改仍然会碰到相同的问题,这时可能需要调整 .babelrc 文件内的 preset-env 设置以兼容 ESM: ```json { "presets": [ ["@babel/preset-env", { "modules": false }] ] } ``` 通过以上措施应该能有效缓解乃至彻底消除 `Cannot use import statement outside a module` 这样的报错现象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值