当前位置: 首页 > news >正文

[qiankun]实战问题汇总

[qiankun]实战问题汇总

  • ERROR SyntaxError: Cannot use import statement outside a module
    • 问题分析
    • 解决方案
  • 子应用命名问题
    • 问题分析
    • 解决方案
  • 'jsonpFunction'
    • 详细错误信息
    • 问题分析
    • 解决方案
  • 微应用的注册问题
    • `Uncaught Error: application 'cli5-beta6-test-name' died in status LOADING_SOURCE_CODE: [qiankun]: Target container with #childApp not existed while cli5-beta6-test-name loading!`
      • 分析
    • `single-spa.min.js?25a2:2 Uncaught Error: application 'cli5-beta6-test-name' died in status NOT_MOUNTED: [qiankun]: Target container with #childApp not existed while cli5-beta6-test-name mounting!`
      • 分析
    • 解决方案
  • 子应用空白的问题
    • [Vue Router warn]: A hash base must end with a "#":
  • single-spa.min.js?25a2:2 Uncaught (in promise) Error: single-spa minified message #21
    • 现象描述
    • 解决方案
  • 微服务的挂载问题
    • 现象描述
    • 分析
    • 解决方案
  • [qiankun] lifecycle not found from xxx-web entry exports, fallback to get from window[ 'xxx-web']
    • 现象描述
    • 解决方案
  • App has already been mounted

主要是在qiankun的实现过程中遇到的各种的问题,这里做一个汇总,方便以后的查阅

ERROR SyntaxError: Cannot use import statement outside a module

问题分析

该问题是在子应用中通过import引入package文件导致的

解决方案

解决方案说是node早先只支持CommonJS的模块化方案,所以ES6的模块化特性用不了。但是在Node V13.2.0之后开始实验性的支持ESM模块化,不过需要创建package.json文件指明type类型为module。

但是添加之后仍旧报错

Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only file and data URLs are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'd:'

最后还是使用了require解决了该问题

const config = require('./package');

子应用命名问题

问题分析

该问题是在加载微前端服务的时候发生的,微服务无法正常加载,或者找不到微服务,如果你确定部署了该微服务的情况下,请确保该微服务的命名问题.

解决方案

output: {// 该值需要与主项目中注册时的name值相对应library: `${packageName}`,libraryTarget: 'umd',jsonpFunction: `webpackJsonp_${packageName}`,}

一般这里的packageName是package.json中设置的name的值,也即项目名称,一般都使用英文,例如:micro-application

registerMicroApps([{name:projectName, //注册时的name值entry:projectDns,container: '#micro',activeRule:projectActiveRule,// 子应用触发规则(路径)props:{user:{ },activeRule:projectActiveRule//用于动态设置子应用的路由前缀}}}])

projectName与${packageName}应该相同否则加载存在问题

‘jsonpFunction’

详细错误信息

ValidationError: Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.- configuration.output has an unknown property 'jsonpFunction'. These properties are valid:object { assetModuleFilename?, auxiliaryComment?, charset?, chunkFilename?, chunkFormat?, chunkLoadTimeout?, chunkLoading?, chunkLoadingGlobal?, clean?, compareBeforeEmit?, crossOriginLoading?, devtoolFallbackModuleFilenameTemplate?, devtoolModuleFilenameTemplate?, devtoolNamespace?, enabledChunkLoadingTypes?, enabledLibraryTypes?, enabledWasmLoadingTypes?, environment?, filename?, globalObject?, hashDigest?, hashDigestLength?, hashFunction?, hashSalt?, hotUpdateChunkFilename?, hotUpdateGlobal?, hotUpdateMainFilename?, iife?, importFunctionName?, importMetaName?, library?, libraryExport?, libraryTarget?, module?, path?, pathinfo?, publicPath?, scriptType?, sourceMapFilename?, sourcePrefix?, strictModuleErrorHandling?, strictModuleExceptionHandling?, trustedTypes?, umdNamedDefine?, uniqueName?, wasmLoading?, webassemblyModuleFilename?, workerChunkLoading?, workerWasmLoading? }-> Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.Did you mean output.chunkLoadingGlobal (BREAKING CHANGE since webpack 5)?

问题分析

output: {// 该值需要与主项目中注册时的name值相对应library: `${packageName}`,libraryTarget: 'umd',jsonpFunction: `webpackJsonp_${packageName}`}

主要是该段代码导致的

解决方案

  1. 该问题主要是微应用导出时jsonpFunction的设置值导致的,该值随着webpack5的升级没有该属性了,并且该属性与跨域无关。最开始线上部署的跨域问题,我一直以为和该属性的设置相关,但其实没有关系,直接删除该属性即可
  2. 如果删除以上属性仍然存在报错可更改为以下的微服务导出设置
configureWebpack:{output: {library: {name:`${config.name}`,//项目名称值type:'umd'// 把子应用打包成 umd 库格式},}
}

因为随着相关包的升级,配置方式也发生了变更,最终采用的配置方案是以上方式

微应用的注册问题

Uncaught Error: application 'cli5-beta6-test-name' died in status LOADING_SOURCE_CODE: [qiankun]: Target container with #childApp not existed while cli5-beta6-test-name loading!

以上是微服务注册时的报错信息

分析

关于问题1,主应用为VUE时,路由含有过渡效果,就会出现加载子应用的时候dom节点#childApp 不存在,但是加载前查看发现是存在的,感觉是加载的时候#childApp被覆盖了,查找相关代码,确保挂载微服务的时候该节点存在,可以修改微服务的注册时机,以确保容器渲染完成再加载微服务

single-spa.min.js?25a2:2 Uncaught Error: application 'cli5-beta6-test-name' died in status NOT_MOUNTED: [qiankun]: Target container with #childApp not existed while cli5-beta6-test-name mounting!

分析

说明它一开始是有container容器的,因为如果一开始就没有的话,报错应该是:Target container with #container not existed while xxx loading 一开始有,中途没有了,那就一定是有代码改变了document,导致container丢失。所以需要从这个原因取排查代码

解决方案

以上两个问题最终都通过相同的方式解决了,在设计路由的时候在主应用追加了

  {path: "/micro/:pathMatch(.*)*",component: () => import(/* webpackChunkName: "micro" */ "../views/micro/index.vue")},

然后在views/micro/index.vue文件中添加dom,注册 container 设置为该dom

//主应用
<div id="micro"></div>registerMicroApps([{name: 'cli5-beta6-test-name', entry: 'http://localhost:8081',container: '#micro',activeRule: '#/micro/cli'// 子应用触发规则(路径)
}])
//子应用
const router = createRouter({history: createWebHashHistory((window as any).__POWERED_BY_QIANKUN__ ? "/micro/cli" : ""),routes,
});

子应用空白的问题

子应用如果是直接展示,内容可以正常加载出来,但是作为微服务没有内容
主应用App.vue,

<template><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/cliChild">About</router-link></div>
</template>

在这里插入图片描述

子应用App.vue是以下内容的

<template><div id="root">mycontent<router-view v-slot="{ Component }"><transition name="router-fade" mode="out-in"><keep-alive><component :is="Component"/></keep-alive></transition> </router-view></div>
</template>

在这里插入图片描述

这个问题最后发现是缺少 #,因为时hash路由,所以设置路由前缀的时候需要加上#

 history: createWebHashHistory((window as any).__POWERED_BY_QIANKUN__ ? "#/micro" : "")

[Vue Router warn]: A hash base must end with a “#”:

在修复上面那个问题后,就出现了这个警告,这个警告很是奇怪,我只是希望设置路由时添加前缀 #/micro/sonApplicationPrefix,但是就多了上面的警告信息

single-spa.min.js?25a2:2 Uncaught (in promise) Error: single-spa minified message #21

在这里插入图片描述

现象描述

该报错发生在我想多次注册统一名称的微服务的时候。某个微服务下可能存在多个路由页面,这些路由页面都希望能够被主应用中作为菜单加载,这就导致了同一个微服务被多次注册的现象(因为多个路由页面的微服务dns是相同的)

解决方案

因为是多个微服务注册发生的,所以要避免微服务的多次注册。在注册微服务之前我们要把同一个微服务的注册项过滤掉,因为该微服务只要注册过一次,当我们访问该微服务的其它路由页面的时候,会根据路径自动触发之前注册过的该微服务

微服务的挂载问题

现象描述

微服务挂载过程中,有一个微服务页面总是无法正常挂载,但是在该路由页面直接刷新页面的时候又正常挂载了,经过对比分析发现是微服务的渲染函数中,这一行代码导致的,这一行代码被写成了:

app.mount(container ? "#app" : "#app")

分析

微服务挂载的时候是根据主服务传递的 container 进行挂载的,因为 container是指定的主服务的容器,而#app则是子服务单独运行的挂载容器,因为主服务在加载子服务的时候 container是已经存在的,所以子服务挂载的位置应该是 container中包含的id为app的容器,因为如果是多页签页面可能存在多个#app,所以一定要指定是 container中的id为app的容器

解决方案

app.mount(container ? container.querySelector("#app") : "#app")

[qiankun] lifecycle not found from xxx-web entry exports, fallback to get from window[ ‘xxx-web’]

现象描述

该现象是微服务正常加载后出现的问题,也就说,除了多了该条警告信息,对于微服务的展示与加载没有其它影响,即使不处理也没有什么问题,但是该提示让强迫症的我有点纠结,还是找了找解决方案,不介意的话是可以跳过该问题的

解决方案

看到有说是因为注入的入口js文件,在html中不是最后的script标签导致的。
qiankun是通过html中的最后一个script文件,获取qiankun的生命周期,所以如果最后一个不是入口js文件就拿不到生命周期。看了一下本人的index.html文件,发现确实在injected后存在手动引入了一个js文件的现象,是不是该文件导致的?将该文件移到了head标签中引入,然后发现该警告问题消失了?!!!

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1.0"><% if (htmlWebpackPlugin.options.online) {%><script type="text/javascript" src="<%= BASE_URL %>config.js"></script><% } %><title>xxx-web</title></head>
<body><noscript><strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.Please enable it to continue.</strong></noscript><div id="app"></div><!-- built files will be auto injected 打包后的注入文件添加到此处-->
</body></html>

App has already been mounted

微服务二次加载,该问题主要是微服务是否曾经加载过,并且页面不会在某些情况下重新渲染

App has already been mounted.
If you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. const createMyApp = () => createApp(App)

开始以为是路由缓存keep-alive的问题,去除路由缓存,尝试了多次都仍然存在问题,包括最上方的资源已注册问题,最后发现最根本的原因是因为路由发生变化的时候,没有卸载微服务
vue3.x的卸载方法

app.unmount();app = null;router = null;

其它遇到的一些微服务问题,因为内容篇幅较长,会分出来

相关文章:

[qiankun]实战问题汇总

[qiankun]实战问题汇总ERROR SyntaxError: Cannot use import statement outside a module问题分析解决方案子应用命名问题问题分析解决方案jsonpFunction详细错误信息问题分析解决方案微应用的注册问题Uncaught Error: application cli5-beta6-test-name died in status LOADI…...

Kafka(6):服务端常用参数配置

参数配置&#xff1a;config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership.…...

2023爱分析·云原生智能运维中台市场厂商评估报告:秒云(miaoyun.io)

目录 1. 研究范围定义 2. 云原生智能运维中台市场定义 3. 厂商评估&#xff1a;秒云&#xff08;miaoyun.io&#xff09; 4. 入选证书 1. 研究范围定义 数字化时代&#xff0c;应用成为企业开展各项业务的落脚点。随着业务的快速发展&#xff0c;应用的功能迭代变得越…...

hadoop容器化部署

1、原容器 java:openjdk-8u111-jre jre路径&#xff1a; /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-1.8.0-openjdk-amd64 2、安装ssh docker run -it --name hadoop-test java:openjdk-8u111-jre bash apt-get update apt-get install openssh service ssh start …...

【07-JVM面试专题-JVM运行时数据区的虚拟机栈你知道吗?它的基本结构是什么呢?你知道栈帧的结构吗?那你说说动态链接吧?】

JVM运行时数据区的虚拟机栈你知道吗&#xff1f;它的基本结构是什么呢&#xff1f;你知道栈帧的结构吗&#xff1f;那你说说动态链接吧&#xff1f; JVM运行时数据区的虚拟机栈你知道吗&#xff1f;它的基本结构是什么呢&#xff1f;你知道栈帧的结构吗&#xff1f;那你说说动态…...

Java性能优化-GC优化基础

GC优化基础 调整堆大小 如果在FULL GC系统进行了交换&#xff0c;停顿时间会增长几个数量级&#xff0c;OS 如果G1 GC和后台进程处理堆&#xff0c;将会出现等待数据从磁盘复制到主内存时间较长&#xff0c;速度和下降并且并发模式可能失效 linux 关闭交换区 swapoff -a linu…...

【Tomcat】IDEA编译Tomcat源码-手把手教程

一、环境准备Tomcat不同版本之间有一定的兼容性问题~如下图所示&#xff1a;官网地址&#xff1a;https://tomcat.apache.org/whichversion.html下载tomcat9官网上面的源码&#xff1a;这一篇文章主要是带着大家在自己的IDEA跑起来一个Tomcat。使用的版本是Tomcat9.0.55 和 JDK…...

如何弄小程序?公司企业可以这样做小程序

公司企业现在对于小程序的需求已经是刚需了&#xff0c;即使已经有官网的情况下&#xff0c;也会考虑再弄一个小程序来做小程序官网。那么公司企业如何弄小程序呢&#xff1f;下面跟大家说说方法。 流程一、找小程序服务商 由于一些公司企业并不像现在的互联网公司企业那样有…...

【Git】IDEA集合Git和码云

目录 7、IDEA集合Git 7.1 配置Git忽略文件-IDEA特定文件 7.2 定位 Git 程序 7.3 初始化本地库 7.4 添加到暂存区 7.5 提交到本地库 7.6 切换版本 7.7 创建分支 7.8 切换分支 7.9 合并分支 7.10 解决冲突 8、 Idea集成码云 8.1 IDEA 安装码云插件 8.2 分析工程到码…...

[USACO03FALL / HAOI2006] 受欢迎的牛 G(C++,强连通分量)

题目背景 本题测试数据已修复。 题目描述 每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂&#xff0c;每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 AAA 喜欢 BBB&#xff0c;BBB 喜欢 CCC&#xff0c;那么…...

Vue 动态路由接口数据结构化为符合VueRouter的声明结构及菜单导航结构、动态路由懒加载方法

Vue 动态路由接口数据结构化为符合VueRouter的声明结构及菜单导航结构、动态路由懒加载方法 实现目标 项目打包代码实现按需分割路由懒加载按需打包&#xff0c;排除引入子组件的冗余打包&#xff08;仅处理打包冗余现象&#xff0c;不影响生产部署&#xff09;解决路由懒加载…...

Python----------字符串

1.转义字符 注&#xff1a;转义字符放在你所想效果字符前 2.原始字符串 print(r"D:\three\two\one\now") ->D:\three\two\one\now注&#xff1a; 在使用原始字符串时&#xff0c;转义字符不再有效&#xff0c;只能当作原始的字符&#xff0c;每个字符都没有特殊…...

日志收集笔记(架构设计、Log4j2项目初始化、Lombok)

1 架构设计 ELK 技术栈架构设计图&#xff1a; 从左往右看&#xff0c; Beats&#xff1a;主要是使用 Filebeat&#xff0c;用于收集日志&#xff0c;将收集后的日志数据发送给 Kafka&#xff0c;充当 Kafka 的生产者Kafka&#xff1a;高性能消息队列&#xff0c;主要起缓冲…...

一文教你玩转 Apache Doris 分区分桶新功能|新版本揭秘

数据分片&#xff08;Sharding&#xff09;是分布式数据库分而治之 (Divide And Conquer) 这一设计思想的体现。过去的单机数据库在大数据量下往往面临存储和 IO 的限制&#xff0c;而分布式数据库则通过数据划分的规则&#xff0c;将数据打散分布至不同的机器或节点上&#xf…...

数据挖掘,计算机网络、操作系统刷题笔记54

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记54 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…...

将数组中的每个元素四舍五入到指定的精度numpy.rint()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组中的每个元素 四舍五入到指定的精度 numpy.rint() 选择题 请问np.rint(a)的输出结果是? import numpy as np anp.array([-1.72,-1.3,0.37,2.4]) print("【显示】a&#xff1a;\n…...

Web安全之服务器端请求伪造(SSRF)类漏洞详解及预防

如何理解服务器端请求伪造&#xff08;SSRF&#xff09;类漏洞当服务器向用户提交的未被严格校验的URL发起请求的时候&#xff0c;就有可能会发生服务器端请求伪造&#xff08;SSRF&#xff0c;即Server-Side Request Forgery&#xff09;攻击。SSRF是由攻击者构造恶意请求URL&…...

LeetCode:239. 滑动窗口最大值

239. 滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-…...

JS 函数参数(动态参数、剩余参数)

需求&#xff1a;求和函数 传入不同实参 求和出来1.动态参数 arguments 只存在于函数内function getSum() {//arguments 获取传递的所有参数 是一个伪数组let num 0for(let i0;i<arguments.length;i){num arguments[i]}return num}//调用console.log(getSum(1,2,3))consol…...

365天深度学习训练营-第J3周:DenseNet算法实战与解析

目录 一、前言 二、论文解读 1、DenseNet的优势 2、设计理念 3、网络结构 4、与其他算法进行对比 三、代码复现 1、使用Pytorch实现DenseNet 2、使用Tensorflow实现DenseNet网络 四、分析总结 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...