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

news2024/11/15 11:15:46

前言

前段时间对我们已有的工程进行了微前端改造,后来思考一下微前端的本质,查询了不少资料,从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 = true
      next({
    ...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.data
          data.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.coloradmin.cn/o/1976505.html

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

相关文章

预警器件控制思考

预警器件控制思考 最小示例思想 当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。 最简单的就是&#xff0c; 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件. 如果在一段时间内, 一直是环境异常, 我…

私藏心术:低谷期翻身转运秘籍

私藏心术&#xff1a;低谷期翻身转运秘籍 在生活中&#xff0c;每个人都可能遇到低谷期&#xff0c;那些看似无法逾越的障碍和挫折。但记住&#xff0c;低谷期不是终点&#xff0c;而是重新站起来的起点。本文将分享一些实用的心术和策略&#xff0c;帮助你在低谷期实现翻身转…

第一个 Flask 项目

第一个 Flask 项目 安装环境创建项目启动程序访问项目参数说明Flask对象的初始化参数app.run()参数 应用程序配置参数 安装环境 mkvirtualenv flask_envpip install flask创建项目 启动程序 访问项目 http://127.0.0.1:5000/ 参数说明 Flask是一个用Python编写的轻量级Web应…

程序员学长 | 快速学习一个算法,CLIP

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;快速学习一个算法&#xff0c;CLIP 今天给大家介绍一个强大的算法模型&#xff0c;CLIP。 CLIP (Contrastive Language–Image Pre-training) 是一个…

机器学习流程图

第一部分&#xff1a;课程使用的技术栈 &#xff08;1&#xff09;Numpy 科学计算基础库&#xff0c;矩阵运算&#xff0c;线性代数 &#xff08;2&#xff09;matplotlib 绘图库&#xff0c;数据可视化 &#xff08;3&#xff09;Scikit 封装了各种分类&#xff0c;回归…

【课程总结】day19(下):Transformer源码深入理解

前言 在上一章【课程总结】day19(下):Transformer架构及注意力机制了解总结中,我们对Transformer架构以及注意力机制有了初步了解,本章将结合《The Annotated Transformer》中的源码,对Transformer的架构进行深入理解。 背景 《The Annotated Transformer》是由 Harva…

LaneATT推理详解及部署实现(上)

目录 前言1. 概述2. 环境配置3. Demo测试4. ONNX导出初探5. ONNX导出优化6. ONNX导出总结结语下载链接参考 前言 最近想关注下车道线检测任务&#xff0c;在 GitHub 上找了一个模型 LaneATT&#xff0c;想通过调试分析 LaneATT 代码把 LaneATT 模型导出来&#xff0c;并在 tens…

Java游戏源码:象棋网络对战版

学习java朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款象棋网络对战版源码。 源码搭建和讲解 源码分为客户端和服务器&#xff0c;采用java原生 java.net.Socket 实现&#xff0c;服务器主循环代码&#xff1a; import java.net.ServerSocket; import jav…

二维码生成原理及解码原理

☝☝☝二维码配图 二维码 二维码&#xff08;Quick Response Code&#xff0c;简称QR码&#xff09;是一种广泛使用的二维条形码技术&#xff0c;由日本公司Denso Wave在1994年开发。二维码能有效地存储和传递信息&#xff0c;广泛应用于商品追溯、支付、广告等多个领域。二维…

Star-CCM+负体积网格检查与出现原因

要使网格可用于有限体积计算&#xff0c;每个网格单元必须具有正体积&#xff0c;否则初始化过程将失败&#xff0c;且模拟计算无法运行。 负体积网格单元可能会以多种不同的方式出现&#xff0c;但必须修复或从网格中移除&#xff0c;才能继续执行任何后续操作。 要检查体网…

<数据集>人员摔倒识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;8605张 标注数量(xml文件个数)&#xff1a;8605 标注数量(txt文件个数)&#xff1a;8605 标注类别数&#xff1a;1 标注类别名称&#xff1a;[fall] 序号类别名称图片数框数1fall860512275 使用标注工具&#xf…

当前生物信息学研究面临的四大机遇和挑战(特别是最后一个,一定要足够重视)...

生物信息学是应用计算方法分析生物数据&#xff0c;如 DNA&#xff0c;RNA&#xff0c;蛋白质和代谢物。生物信息学已成为促进我们对生命科学的理解以及开发新的诊断&#xff0c;治疗和生物技术产品的重要工具。本文我们将探讨生物信息学研究的一些当前趋势和发展&#xff0c;以…

如何快速入门 PyTorch ?

PyTorch是一个机器学习框架&#xff0c;主要依靠深度神经网络&#xff0c;目前已迅速成为机器学习领域中最可靠的框架之一。 PyTorch 的大部分基础代码源于 Ronan Collobert 等人 在 2007 年发起的 Torch7 项目&#xff0c;该项目源于 Yann LeCun 和 Leon Bottou 首创的编程语…

【C++题解】1249. 搬砖问题

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1249. 搬砖问题 类型&#xff1a;嵌套穷举 题目描述&#xff1a; 36 块砖&#xff0c; 36 人搬。男搬 4 &#xff0c;女搬 3 &#xff0c;两个小儿抬一砖。 要求一次全搬完。问需…

GitHub最全中文排行榜开源项目,助你轻松发现优质资源!

文章目录 GitHub-Chinese-Top-Charts&#xff1a;中文开发者的开源项目精选项目介绍项目特点核心功能1. 热门项目榜单2. 详细项目信息 如何使用覆盖范围软件类资料类 GitHub-Chinese-Top-Charts&#xff1a;中文开发者的开源项目精选 在全球范围内&#xff0c;GitHub已经成为了…

谷歌外链:提升网站权重的秘密武器!

谷歌外链之被称为提升网站权重的秘密武器&#xff0c;主要是因为它们对网站的搜索引擎排名有着直接且显著的影响 谷歌和其他搜索引擎使用外链作为衡量网站信任度和权威性的重要指标。当一个网站获得来自其他信誉良好的源的链接时&#xff0c;这被视为信任的投票。多个高质量链…

opencv-图像仿射变换

仿射变换就是将矩形变为平行四边形&#xff0c;而透视变换可以变成任意不规则四边形。实际上&#xff0c;仿射变换是透视变换的子集&#xff0c;仿射变换是线性变换&#xff0c;而透视变换不仅仅是线性变换。 仿射变换设计图像位置角度的变化&#xff0c;是深度学习预处理中常…

力扣SQL50 患某种疾病的患者 正则表达式

Problem: 1527. 患某种疾病的患者 在SQL查询中&#xff0c;REGEXP 是用于执行正则表达式匹配的操作符。正则表达式允许使用特殊字符和模式来匹配字符串中的特定文本。具体到你的查询&#xff0c;^DIAB1|\\sDIAB1 是一个正则表达式&#xff0c;它使用了一些特殊的通配符和符号。…

Vue:vue-router使用指南

一、简介 点击查看vue-router官网 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成&#xff0c;让用 Vue.js 构建单页应用变得轻而易举。功能包括&#xff1a; 嵌套路由映射动态路由选择模块化、基于组件的路由配置-路由参数、查询、通配符-展示由 Vue.js 的过渡系…

DNS常见面试题

DNS是什么&#xff1f; 域名使用字符串来代替 IP 地址&#xff0c;方便用户记忆&#xff0c;本质上一个名字空间系统&#xff1b;DNS 是一个树状的分布式查询系统&#xff0c;但为了提高查询效率&#xff0c;外围有多级的缓存&#xff1b;DNS 就像是我们现实世界里的电话本、查…