【qiankun微前端】基座主应用(vue2)+多个微应用(任意框架)

前言

前段时间对我们已有的工程进行了微前端改造,后来思考一下微前端的本质,查询了不少资料,从qiankun微前端示例中学到了不少。

微前端的核心,似乎应该是一个基座应用(含登录页,layout页,404和首页等),多个子应用(任意框架,提供内部页面内容),下面就对这个思路进行实现讲解:
在这里插入图片描述
在这里插入图片描述

一、主应用

在这里插入图片描述

1、主应用主要提供 Login、Layout、Home、404等基础页面。
2、通过提供qiankun的initGlobalState、registerMicroApps、start等完成主应用的qiankun注册、子应用的注册和数据初始化,监听。

// router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '@/store'
import Login from '@/views/Login'
import Home from '@/views/Home'
import Layout from '@/views/Layout'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'Vue.use(VueRouter)// 路由
const constantRoutes = [{path: '/login',name: 'login',component: Login,meta: { isTabs: false, isSide: false, moduleName: 'main', title: '登录' }},{path: '/',name: 'Layout',component: Layout,redirect: process.env.VUE_APP_DEFAULT_APP, // 默认加载的路由children: [{path: '/home',name: 'Home',component: Home,meta: { isTabs: false, isSide: false, moduleName: 'main', title: '首页' }}]}
]const createRouter = () => {return new VueRouter({mode: 'history',routes: constantRoutes,isAddAsyncMenuData: false})
}// 处理重复点击同一个路由报错的问题
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location) {return originalPush.call(this, location).catch((err) => err)
}const router = createRouter()/*** 重置注册的路由导航map* 主要是为了通过addRoutes方法动态注入新路由时,避免重复注册相同name路由*/
const resetRouter = () => {const newRouter = createRouter();router && (router.matcher = newRouter.matcher);
};router.beforeEach((to, from, next) => {NProgress.start()// 菜单当前选中及页面持久if (to.path !== '/login') {store.commit('permission/UPDATE_CURRENT_MODULE_NAME', to.meta.moduleName)store.commit('permission/UPDATE_CURRENT_PAGE', to.path)}// 首页的时候组装左侧导航数据// if (to.path === '/home') {//   store.commit('permission/UPDATE_SUB_MENU', true)// }if (!router.options.isAddAsyncMenuData) {store.dispatch('permission/generateRoutes').then((accessRoutes) => {// 根据用户权限生成可访问的路由表for (let i = 0, length = accessRoutes.length; i < length; i += 1) {const element = accessRoutes[i]router.addRoute(element)}router.options.isAddAsyncMenuData = truenext({ ...to, replace: true }) // hack方法 确保addRoutes已完成})} else {next()}
})router.afterEach(() => {NProgress.done()
})export { constantRoutes, resetRouter };export default router
// store/modules/permission.js
import http from 'axios'
import { constantRoutes } from '@/router'
import Layout from '@/views/Layout'
import { homeMenuData } from '../../utils'const permission = {namespaced: true,state: () => ({routers: null,menuList: [],subMenu: [],currentModuleName: 'main',currentPage: '/home'}),mutations: {// 当前模块UPDATE_CURRENT_MODULE_NAME (state, payload) {sessionStorage.setItem('currentApp', payload)state.currentModuleName = payload},// 当前页面UPDATE_CURRENT_PAGE (state, payload) {sessionStorage.setItem('currentPage', payload)state.currentPage = payload},// 菜单数据UPDATE_MENU_LIST (state, payload) {state.menuList = payload},// 左侧菜单数据,子应用菜单数据UPDATE_SUB_MENU (state, payload) {state.subMenu = []// if (typeof payload === 'boolean') {//   state.subMenu.push(homeMenuData)//   return// }if (typeof payload === 'object') {state.subMenu = payload}},// 路由数据UPDATE_ROUTERS (state, payload) {state.routers = constantRoutes.concat(payload)}},actions: {generateRoutes ({ commit }) {return new Promise((resolve) => {// 向后端请求路由数据http.get('/mock/menu.json').then((res) => {const data = res.datadata.unshift(homeMenuData) // 添加首页菜单,默认主应用的菜单信息在这里commit('UPDATE_MENU_LIST', data)let routes = []for (let i = 0; i < data.length; i++) {const module = data[i]const route = getMenuItem(module.menuList)routes = [...routes, ...route]}routes.push({path: '*',name: 'notfound',component: () => import('@/views/404.vue')})commit('UPDATE_ROUTERS', routes)resolve(routes)})})}},getters: {}
}// 组装路由数据
function getMenuItem (menus) {let routers = []for (let index = 0; index < menus.length; index++) {const menu =</

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

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

相关文章

stm32入门-----软件I2C读写MPU6050

目录 前言 MPU6050 1.简介 2.相关参数 3.硬件电路 4.MPU6050框图 C编程实现I2C读写MPU6050步骤 1.MyI2C.c文件 &#xff08;1&#xff09;引脚的宏定义 &#xff08;2&#xff09;对SCL和SDA的操作以及初始化 &#xff08;3&#xff09;起始信号标志 &#xff08;4…

数据结构(面试)

目录 线索二叉树哈夫曼树并查集最小生成树最短路径拓扑排序二叉排序树平衡二叉树红黑树折半查找散列表堆排序归并排序 线索二叉树 原理&#xff1a;利用树节点的n1个左右空指针指向其遍历序列的前驱和后继&#xff08;线索&#xff09; 优点&#xff1a;简化遍历&#xff0c;不…

7.2 单变量(多->多),attention/informer

继续上文书写&#xff1a; 1 GRU Attention 收敛速度稳定的很多&#xff0c;你看这些模型是不是很容易搭&#xff0c;像积木一样&#xff1b; def create_model(input_shape, output_length,lr1e-3, warehouse"None"):input Input(shapeinput_shape)conv1 Conv…

【C++标准模版库】模拟实现vector+迭代器失效问题

模拟实现vector 一.vector成员变量二.构造函数1.无参&#xff08;默认&#xff09;构造2.有参构造3.拷贝构造1.传统写法2.现代写法 三.vector对象的容量操作1.size2.capacity3.clear4.empty5.reserve6.resize 四.vector对象的访问及遍历操作1.operator[]2.实现迭代器&#xff1…

免费【2024】springboot 大学生志愿者管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

windows下设置java环境变量

1.打开window的环境变量设置 右键开始菜单选择系统 选择高级系统设置&#xff1a; 点击环境变量 2.在系统变量 新增 JAVA_HOME&#xff1b;该变量的值 选择jdk所在的目录即可。 JAVA_HOME: D:\Program Files\Java\jdk1.8.0_131 3. 在系统变量新增 classpath; 该变量的值设置…

GoLang 安装

golang学习笔记 goland 安装 To use Go programming language in Visual Studio Code (VSCode), you can follow these steps: 1. Install Go: Download and install the latest version of Go from the official Go website (https://golang.org/dl/). 2. Install VSCode:…

llama-3.1下载部署

llama-3.1 下载部署 下载 huggingface 详情页填写申请后等待审核 点击 头像->setting->access token 创建token 配置环境变量 下载模型 pip install -U huggingface_hubhuggingface-cli download --resume-download meta-llama/Meta-Llama-3.1-8B-Instruct --loca…

IDEA的疑难杂症

注意idea版本是否与maven版本兼容 2019idea与maven3.6以上不兼容 IDEA无法启动 打开idea下载安装的目录:如:Idea\IntelliJ IDEA 2024.1\bin 在bin下面找到 打开在最后一行添加暂停 pause 之后双击运行idea.bat 提示找不到一个jar包,切记不要有中文目录 IDEA缓存 …

Java与Python谁更适合后端开发?

在软件开发的世界里&#xff0c;选择合适的编程语言就像为建筑选择合适的材料一样重要。 对于后端开发而言&#xff0c;Java和Python都是流行的选择&#xff0c;但它们各自拥有独特的优势和劣势&#xff0c;“谁更适合”就成为一个被议论的话题。 事实上&#xff0c;并不存在…

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题&#xff1a; 用于图像分类的可扩展量子非局部神经网络 作者&#xff1a; Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接&#xff1a;https://arxiv.org/abs/2407.18906 摘要&#x…

[BJDCTF2020]Easy MD51

抓包看一下信息&#xff0c;发现有sql注入字段 输入 注入发现 查看源码 然后get传参?aQNKCDZO&bs214587387a 最后 MD5函数的弱类型比较 发现PHP代码&#xff0c;分析仍为 PHP md5绕过。 使用数组绕过POST传入param1[]1&param2[]2&#xff0c;得到flag。

RIP综合练习

要求&#xff1a; 1.合理使用IP地址划分网络&#xff0c;各自创建循环接口 2.R1创建环回172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.减少路由条目数量&#xff0c;R1,R2之间增加路由传递安全性 5.R5创建一个环回模拟运营商&#xff0c;不能…

打卡第31天------贪心算法

每天抓紧时间刷题,争取尽快上岸,不能再耽误一分一秒了,2024年已经过去大半年了。这个算法编程题是我的痛点。要尽快弥补。 卡尔在讲算法题的时候,思路比较清晰,通俗易懂,以前看见算法题就害怕,因为啥都不会,看懵了,跟了一个月了,每天坚持刷题,偶尔会回顾思路,也会…

开源Spring Boot版本WebSSH:轻松在浏览器中管理SSH和FTP

介绍 WebSSH 是一个轻量级的开源ssh工具&#xff0c;只需安装在服务端&#xff0c;就可以通过浏览器访问SSH和FTP。它支持文件和日志高亮显示&#xff0c;Vim 和 Top 命令&#xff0c;实时查看日志&#xff0c;并且操作体验与标准的 Shell 基本相同。WebSSH 支持多会话、文件上…

【Git】git 从入门到实战系列(二)—— git 介绍以及安装方法 (文末附带视频录制操作步骤)

文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列&#xff08;一&#xff09;—— Git 的诞生&#xff0c;Lin…

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; &#xff08;其中k1, k2为整数&#xff09; Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x)&#xff1b; 目标1&#xff1a;根据k1与k2的关系&#xff0c;找出一组最小整数组&#xff08;k1, k2&#xff09;&#xff…

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据&#xff0c;将每个单词表示为一个连续的向量&#xff0c;这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text&#xff0c;预测其文本标签label。以下使用mock商品数据的代码实现过程过下&#xff1a; 1、…

PCL从理解到应用【08】 点云特征 | 法线估计 | 主曲率估计

前言 在PCL中&#xff0c;有多种方法和函数可以用来提取点云特征&#xff0c;本文介绍几何特征。 其中&#xff0c;几何特征主要包括法线估计和主曲率估计。 这些特征能够描述点云表面的几何形状&#xff0c;常用于进一步的点云处理和分析&#xff0c;如配准、分割和物体识别…

利用canvas 实现图片的标注,把标注像素点传入到后端

背景&#xff1a;我们有一个摄像的产品&#xff0c;拍照传统的水表盘面&#xff0c;我们需要框选水表读数&#xff0c;标注点传到后端&#xff0c;后端根据标注点自动去截取摄像表拍摄回来的图片&#xff0c;然后拿到大模型里面进行训练。由于同一只表拍摄的画面都是一样的&…