微前端qiankun框架的使用

文章描述

随着工作时间的增加,发现公司的项目逐渐多了起来,有一个项目比较庞大,是需要集成多个子系统而形成的大项目。其中便是使用微前端的概念qiankun框架来集成其他多个子项目的。接下来,一起来看一下qiankun框架的具体使用方法吧。

更具体的使用方法请参考qiankun官网

主要内容
主应用
下载依赖

npm i qiankun -S

我们只需要再主应用中下载即可,需要注意的是,下载当前的依赖对node的版本也有限制,我第一次安装就踩坑了

要求的node版本是"^12.22.0 || ^14.17.0 || >=16.0.0"之内,不能高不能低,挺无语的哈...

添加配置

在main.js文件夹同级下创建registerApp.js文件(重要)

import { registerMicroApps, start } from 'qiankun';// 配置加载中的钩子函数
const onLoad = ()=>{console.log("加载中");
}
registerMicroApps([{name: 'appChild', // 子程序的name名,对应的是子程序中package中的name名字,唯一的entry: '//localhost:3002', // 子程序的路径,就是访问子程序的路径container: '#container',   // 希望将子应用放在哪个容器内activeRule: '/ortherSystem', // 子程序的路由匹配规则,如当主程序中访问路由/ortherSystem时,框架会自动将子应用的内容加载到上面的容器内loader:onLoad,   // 当前子应用加载时运行的函数props:{          // 希望给子应用传递的值,在子应用暴露出的mount等函数中可拿到text:"你好,我是主应用"  }}
],{beforeLoad:()=>{console.log("加载前");},beforeMount:()=>{console.log("挂载前");},afterMount:()=>{console.log("挂载后");},beforeUnmount:()=>{console.log("销毁前");},afterUnmount:()=>{console.log("销毁后");},
});start({sandbox: {strictStyleIsolation: true, // 开启shadow dom样式隔离模式},
});

当然如果,如果我们需要手动添加子应用程序时,可以用下面这个函数,这个函数可以让我们在某个js函数中加载子应用。

import { loadMicroApp } from 'qiankun';loadMicroApp({name: 'app',entry: '//localhost:7100',container: '#yourContainer',
});

对了,当前创建的文件记得要在main.js文件中引入哦

打包配置

在vue.config.js中也需要添加相关的打包配置

const { defineConfig } = require('@vue/cli-service')
const packageName = require('./package.json').name;
module.exports = defineConfig({devServer: {host:'localhost',port:3001,headers:{'Access-Control-Allow-Origin':'*',},publicPath:'./',configureWebpack:{output: {library: `${packageName}`,libraryTarget: 'umd',chunkLoadingGlobal: `webpackJsonp_${packageName}`,},}
})

请注意'Access-Control-Allow-Origin':'*'配置一定需要,要不会有跨域错误。

子应用

子应用中不需要下载相关的依赖,只需要安装要求进行配置即可

配置main.js

根据官网要求,我们需要在子应用的main.js文件中添加并导出几个函数,分别是bootstrap,mount,unmount等函数。main.js的文件具体写法如下,被我改造了一下

import { createApp } from 'vue'
import App from './App.vue'// 引入路由
import router from './router/router'let app = null;
const render = (props)=>{app = createApp(App);app.use(router);app.use(ElementPlus);app.mount(props && props.container ? props.container.querySelector("#app") : '#app');
}
/*** bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。* 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。*/
export async function bootstrap(props) {console.log(props,'props app bootstraped');
}// 这个变量是qiankun框架暴露给全局的,判断当前应用是否使用qiankun框架了
if(!window.__POWERED_BY_QIANKUN__){render()
}
/*** 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法*/
export async function mount(props) {console.log(props,"props");render(props)
}
/*** 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例*/
export async function unmount(props) {app.unmount()app = null;
}/*** 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效*/
export async function update(props) {console.log('update props', props);
}
添加文件

创建public-path.js、.env.development、.env.production等文件

1、.env.development

VUE_APP_PORT = 3002

2、env.production

VUE_APP_PORT = 3002

3、public-path.js(该文件主要用于动态修改publicPath属性)

(function() {if (window.__POWERED_BY_QIANKUN__) {if(process.env.NODE_ENV	 === 'development') {__webpack_public_path__ = `//localhost:${process.env.VUE_APP_PORT}${process.env.BASE_URL}`;return;}__webpack_public_path__ = window.INJECTED_PUBLIC_PATH_BY_QIANKUN__;}
})();

该文件记得在main.js中引入哦

打包配置

1、在package.json文件中,将name修改为主应用中注册所使用的name名。

2、在路由配置中,将路由的baseUrl改成主应用中注册的路由规则的值,如:

// 我得主应用的路由规则为 /ortherSystem
const routerHistory = createWebHistory('/ortherSystem')

3、在vue.config.js里面配置

const { defineConfig } = require('@vue/cli-service')
const packageName = require('./package.json').name;module.exports = defineConfig({devServer: {host: 'localhost',headers:{'Access-Control-Allow-Origin':'*',},port: process.env.VUE_APP_PORT,},configureWebpack:{output: {library: `${packageName}`,libraryTarget: 'umd',chunkLoadingGlobal: `webpackJsonp_${packageName}`,},}
})
运行结果

好了,进行了上面的几步后我们应该就可以看到基本的效果了,

 

 报错经历

1、node版本不匹配,这是我们需要换适合的node版本了,推荐是"^12.22.0 || ^14.17.0 || >=16.0.0"之间。

 2、当我们的主应用和子应用都准备好了,但是效果还是不出来,查看控制台发现是跨域了,这是因为端口后ip不同,我们需要再vue.config.js文件的devServer下添加相关配置

 headers:{'Access-Control-Allow-Origin':'*',},

3、 子应用中路由不匹配,子应用中匹配好的路由,子应用单独启动能正常跳转,但是使用qiankun框架使用就无法正常匹配了,报404未找到页面

这大概率是因为你在主应用中将添加子应用的容器使用router-view这个标签渲染了,我们不要用这个标签,可以的话在组件中直接引入渲染即可

<template><!-- 不要要用这种方法 --><!-- <router-view></router-view> --><!-- 用这种方法渲染homePage组件,子应用的容器就在homePage组件中 --><homePage></homePage>
</template><script setup>
import homePage from '@/components/homePage.vue'
</script>

4、 样式问题,在子应用中样式是正常的,但是在主应用中,子应用的样式丢失了,而且在我还设置了strictStyleIsolation: true模式,样式还是很神奇的消失了,

网上查询了好多方法,最后用审查元素查看发现子应用也正常被shadow-root包裹起来了,结果发现是子应用中,挂载元素时自己写错了,在子应用中的render函数应该这样写

let app = null;
const render = (props)=>{app = createApp(App);app.use(router);app.use(ElementPlus);// 错误// app.mount(props && props.container ? props.container : '#app');// 正常app.mount(props && props.container ? props.container.querySelector("#app") : '#app');
}

props是qiankun框架提供的参数,里面包含了我们注册时提供的子应用名和主应用中要挂载的容器,但是我们不能直接将子应用挂载到props.container容器中,这样会将里面内置的标签属性给覆盖掉,导致样式不生效

 

最终感想

这只是qiankun框架的基本使用方式,具体的方法和更多详情可以去官网查看,官网写的很清楚的,当前属于我个人的笔记,也希望通过这篇文章可以帮到同行的朋友

如果以上写的内容有什么错误的地方,欢迎各位大佬来指点,我发现后一定尽快修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于CVX优化器的储能电池调峰调频算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 原理概述 4.2 CVX工具箱概述 5.完整工程文件 1.课题概述 基于CVX优化器的储能电池调峰调频算法matlab仿真。CVX 是一种用于求解凸优化问题的强大工具。凸优化问题具有良好的数学性质&#xff0c;能…

回归——数学公式推导全过程

文章目录 一、案例引入 二、如何求出正确参数 1. 最速下降法 1&#xff09;多项式回归 2&#xff09;多重回归 2. 随机梯度下降法 一、案例引入 以Web广告和点击量的关系为例来学习回归&#xff0c;假设投入的广告费和点击量呈现下图对应关系。 思考&#xff1a;如果花了…

微服务中的服务发现

微服务中的服务发现 什么是服务发现 服务发现是微服务架构中的关键机制&#xff0c;用于确定各个微服务的地址。例如&#xff0c;在一个 API Server 服务中&#xff0c;我们可能需要调用 User 服务来处理用户注册、登录和信息查询&#xff0c;也可能需要 Product 服务来获取商…

C#与西门子PLC的六大通信库

C#与西门子PLC的六大通信库&#xff1a; 一、S7.NET S7.NET是一款开源的S7协议通信库&#xff0c;支持西门子S7通信。 二、Sharp7 Sharp7与S7.NET一样&#xff0c;是一款.NET版本的S7通信库。 三、Snap7 Snap7是一个开源的C通信库&#xff0c;支持西门子S7通信。 四、Prodave P…

IOS接入微信方法

导入SDK 和配置 SDK 的不做介绍&#xff1b; 1 在IOS 开发者中心 Identifiers 打开‘Associated Domains’ 2 建立一个文件&#xff08;不带后缀的&#xff09;apple-app-site-association, teamid在 IOS 开发者中心的会员找&#xff0c;appid在 xcode里面找 {"applin…

DHCPv6 Stateless Vs Stateful Vs Stateless Stateful

DHCPv6常见配置模式 在 IPv6 网络中,DHCPv6 的 Stateless(无状态)、Stateful(有状态) 和 Stateless + Stateful(混合模式) 是三种常见的配置模式。它们的主要区别在于客户端如何获取 IPv6 地址和其他网络配置信息(如 DNS 服务器)。 Stateless(无状态)模式 Statele…

HTTPS协议—加密算法和中间攻击人的博弈

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

Java替换jar包中class文件

在更新java应用版本的运维工作中&#xff0c;由于一些原因&#xff0c;开发没办法给到完整的jar包&#xff0c;这个时候&#xff0c;就可以只将修改后的某个Java类的class文件替换掉原来iar包中的class文件&#xff0c;重新启动服务即可&#xff1a; 1、将jar包和将要替换的cl…

【UI设计】一些好用的免费图标素材网站

阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一&#xff0c;拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等&#xff0c;适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…

【10】高效存储MongoDB的用法

目录 一、什么是MongoDB 二、准备工作 &#xff08;1&#xff09;安装MongoDB ​&#xff08;2&#xff09;安装pymongo库 三、连接MongoDB 四、指定数据库 五、指定集合 六、插入数据 &#xff08;1&#xff09; insert 方法 &#xff08;2&#xff09;insert_one(…

MATLAB+Arduino利用板上的按键控制板上Led灯

几年不使用&#xff0c;之前的知识都忘掉了。需要逐步捡起来。 1 熟悉按键的使用 2熟悉灯的控制 1 电路 我们将通过 MATLAB 的 Arduino 支持包与 Arduino 板通信&#xff0c;读取按键状态并控制 LED 灯的亮灭。 按键&#xff1a;连接到 Arduino 的数字引脚&#xff08;例如…

《深度学习》——YOLOv3详解

文章目录 YOLOv3简介YOLOv3核心原理YOLOv3改进YOLOv3网络结构 YOLOv3简介 YOLOv3&#xff08;You Only Look Once, version 3&#xff09;是一种先进的实时目标检测算法&#xff0c;由 Joseph Redmon 和 Ali Farhadi 开发。它在目标检测领域表现出色&#xff0c;具有速度快、精…

【项目设计】网页版五子棋

文章目录 一、项目介绍1.项目简介2.开发环境3.核心技术4.开发阶段 二、Centos-7.6环境搭建1.安装wget工具2.更换软件源(yum源)3.安装scl工具4.安装epel软件源5.安装lrzsz传输工具6.安装高版本gcc/g编译器7.安装gdb调试器8.安装git9.安装cmake10.安装boost库11.安装Jsoncpp库12.…

在coze工作流中将数据回写到飞书表格

在coze工作流中将数据回写到飞书表格

并查集(竞赛)

一、模型建立 本质就是一个数组&#xff0c;数组的下标对应节点的编号&#xff0c;数组的值对应对应编号的节点的父节点。规定根节点的父节点是自己。 规定三个集合的根节点分别是1 4 6 二、并查集操作并实现 并查集主要操作&#xff1a;查找一个节点的父节点&#xff0c;判…

Leetcode 刷题笔记1 图论part04

leetcode 110 字符串接龙 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…

从扩展黎曼泽塔函数构造物质和时空的结构-7

有了先前关于电荷之间吸引和排斥关系的频率分析图&#xff0c;我们可以按照类似的方法&#xff0c;对磁场做一样的分析&#xff0c;即分析磁体同极相斥&#xff0c;异极相吸的本质。 我们知道上图得以成立的原因在于磁感线&#xff0c;如下图所示的排布方式&#xff0c; 磁体的…

AI比人脑更强,因为被植入思维模型【18】万物系统思维模型

把事物看成链&#xff0c;看成网&#xff0c;看成生态。 定义 万物系统思维模型是一种将宇宙万物视为一个相互关联、相互作用的整体系统的思维方式。它强调从系统的角度去认识、分析和解决问题&#xff0c;认为系统中的各个要素之间存在着复杂的相互关系&#xff0c;这些关系不…

Qt-Q_ENUM宏和QMetaEnum类

Q_ENUM是一个宏定义&#xff0c;它的作用是将一个枚举类型注册到元对象系统&#xff0c;从而能够通过QMetaEnum类获得一些关于enum类型的一些信息&#xff0c;例如获取enum类型的名称字符串&#xff0c;enum值和字符串互相转换&#xff0c;enum类型保存在QVariant中&#xff0c…

MongoDB 配合python使用的入门教程

MongoDB 入门教程 1. 安装 MongoDB 首先&#xff0c;你需要在你的机器上安装MongoDB。你可以从 MongoDB官网 下载并安装 Community 版本。安装完成后&#xff0c;启动MongoDB服务。 # 在Linux/Mac上启动MongoDB mongod# 在Windows上&#xff0c;你可以通过Windows服务启动Mo…