京东微前端microApp 项目实战

1、什么项目适合做?

公司项目有N个系统构成一个大体积应用,代码越来越多,运行打包十几分钟以上

2、技术栈要求?

目前我说的这版是vue2为基座,子应用vue2,vue3,react都行,vite版本是单独的,自己去官网看着配。

3、基座需要配置修改哪些东西才能跑到子应用呢?

基础配置在基座(包含导航侧边栏登录等,基础组件,不可用的组件扔npm包里,子组件自己下载就行了)

先做基座的配置项:

main.js里配置

import microApp from "@micro-zoe/micro-app";
/** microApp 启动 */
microApp.start({
  'disable-memory-router': true, // 关闭虚拟路由系统
  'disable-patch-request': true, // 关闭对子应用请求的拦截
})

.env.development /  .env.production 里配置子应用端口号,有几个配几个

VUE_APP_URL_chirdren1 = http://localhost:40001/ #子应用1

router.js配置

 // 配置项目需要单独开启的页面,不带基座里的导航侧边栏等内容走这里
  {
    path: '/sub/chirdren1',
    component: () => import('@/layout/components/appMain/chirdren1'),
    hidden: true
  },

 // 带基座导航侧边栏等内容的页面走这里
 {
   path: '/chirdren1',
   component: () => import('@/layout/components/appMain/chirdren1'),
   name: 'drg',
   meta: {
      title: 'DRG智能管理系统'
   },
   hidden: true
 },


// 防止连续点击多次路由报错
let routerPush = Router.prototype.push;
Router.prototype.push = function push(location) {
  return routerPush.call(this, location).catch(err => err)
}
export default new Router({
  mode: 'history', // 去掉url中的#
  scrollBehavior: () => ({
    y: 0
  }),
  routes: constantRoutes
})
放router.beforeEach的js配置

import { MODULE_LIST } from '@/utils/constant'

// 匹配系统路径 确定当前系统

let module = MODULE_LIST.find(item=>item.baseUrl == to.path)
if (module) {
  Cookies.set("menuId", module.id);
}

这里是说,项目有很多,但是这里我们要给他设定默认的id,让基座知道往哪跳转

constant.js

export const MODULE_LIST = [{
    id: '1',
    name: '子系统1',
    baseUrl: '/chirdren1'
  },
  {
    id: '3',
    name: '子系统2',
    baseUrl: '/chirdren2'
  },
]

建一个去往子应用文件的地方

appMain文件夹

chirdren1.vue

<template>
  <div>
    <micro-app name="chirdren1" :url="appUrl" baseroute="/chirdren1"></micro-app>
  </div>
</template>

<script>
import microApp from '@micro-zoe/micro-app'
export default {
  data() {
    return {
      module: null,
      appUrl: process.env.VUE_APP_URL_chirdren1
    }
  },
  created() {
  },
  mounted() {
    microApp.addDataListener('chirdren1', (data) => {
      console.log('来自子应用chirdren1的数据', data)
      if(data.type === 'logout') {
        this.$store.dispatch('LogOut').then(() => {
          // Cookies.remove("menuId");
          this.$router.push({path: '/login'})
        })
      }
    })
  },
  methods: {
    goUrl(url) {
      console.log('===url', url)
      microApp.router.push({name: 'chirdren1', path: '/chirdren1#'+url})
    }
  }
}
</script>

name名字很重要,要对应起来,要不进入子应用的时候会有问题

再就是基座里,你切换其他系统的时候需要配置的地方,点击切换系统的方法

changeValue(val) {
        // 筛选菜单路由表
        this.$store
          .dispatch("GenerateRoutes", {
            val,
          })
          .then((accessRoutes) => {
            // 根据roles权限生成可访问的路由表
            this.$router.addRoutes(accessRoutes); // 动态添加可访问路由表
            // 这里去匹配上几个文件配置的系统id,然后进行跳转操作
            let currentModule = MODULE_LIST.find(item=>item.id == val)
            location.href = currentModule.baseUrl;
          });
      }
    },

上面操作完成,恭喜你微前端已经掌握了90%

因为子应用的配置相比较而言少的离谱咯

下面是子应用的配置

vue.config.js
配置上子应用的端口号40001


router.js

除去正常路由配置好后加上下面的

// 防止连续点击多次路由报错
let routerPush = Router.prototype.push;
Router.prototype.push = function push(location) {
  return routerPush.call(this, location).catch(err => err)
}
export default new Router({
  mode: 'hash', // 去掉url中的#
  scrollBehavior: () => ({
    y: 0
  }),
  routes: constantRoutes
})

router.beforeEach里配上

import { MODULEID } from '@/utils/constant'

里面是这个
export const MODULEID = 1

/** 模块名称 */
export const MODULE_NAMES = {
  '1': '/chirdren',
}


router.beforeEach里配上

let val = MODULEID
        // 判断当前用户是否已拉取完user_info信息
        store.dispatch('GetInfo').then((infoRes) => {
          const chars = infoRes.modules.split(",");
          // 用户所属系统模块集合
          Cookies.set("userModules", chars);
          isRelogin.show = false
          store
            .dispatch("GenerateRoutes", {
              val,
            }).then(accessRoutes => {
              // 根据roles权限生成可访问的路由表
              router.addRoutes(accessRoutes) // 动态添加可访问路由表
              next({
                ...to,
                replace: true
              }) // hack方法 确保addRoutes已完成
            })
        }).catch(err => {
          store.dispatch('LogOut').then(() => {
            Cookies.remove("menuId");
            // Message.error(err)
            next({
              path: '/'
            })
          })
        })

配完这些恭喜你,成功跳转到子应用了,需要基座下发或者子应用回传数据,官网api就有就不写了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Squid配置用户名密码的方法

环境 Centos7.9 Squid 3.5.20 步骤 1 使用htpasswd工具&#xff0c;生成用户名密码。 例如这里添加用户名peter, 密码123. yum install httpd-tools htpasswd -c /etc/squid/squid_user peter New password: 123 Re-type new password: 123 Adding password for user peter…

人工智能在软件开发中的角色:助手还是替代者?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

一键转换,高效管理:引领文件批量改后缀名与TXT转DOCX格式新潮流

在这个数字化时代&#xff0c;文件管理和格式转换成为了我们日常工作中不可或缺的一部分。然而&#xff0c;手动更改文件后缀名以及将TXT文件转换为DOCX格式&#xff0c;不仅耗时耗力&#xff0c;还容易出错。幸运的是&#xff0c;我们有了文件批量改名高手这款强大的工具&…

大模型在软件测试领域的应用场景有哪些?_大模型在测试领域应用

在数字化转型的大背景下&#xff0c;在软件定义一切的趋势下&#xff0c;软件测试人员需要接触和理解的信息越来越多&#xff0c;并呈现加速增长的态势。需求越来越大&#xff0c;交付周期越来越短&#xff0c;受制于体力和能力限制&#xff0c;测试人员的效率和质量难以同步提…

Mysql在Windows系统下安装以及配置

目录 一、下载Mysql 二、安装Mysql及环境配置 一、下载Mysql 1. 下载地址 官网:https://www.mysql.com&#xff0c;这里我选用的是Mysql8.0.37版本&#xff08;版本无所谓&#xff0c;随便下8.0.几都行&#xff09; 2.点击DOWNLOADS 然后&#xff0c;点击 MySQL Community…

【SOLID原则前端中的应用】开闭原则(Open/Closed Principle)- vue3示例

开闭原则&#xff08;Open/Closed Principle&#xff09;在Vue 3中的应用 开闭原则&#xff08;Open/Closed Principle&#xff0c;OCP&#xff09;规定&#xff0c;软件实体&#xff08;类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改关闭。 也就是说&#xf…

中国植物志(80卷)

中国植物志&#xff0c;全书共80卷126分册&#xff0c;3700页&#xff0c;记载了我国301科3408属31142种植物学名、形态特征、生态环境、地理分布、经济用途和物候期等。是研究中国植物的重要论著&#xff08;截图仅部分&#xff09;。

VBA通过Range对象实现Excel的数据写入

前言 本节会介绍通过VBA中的Range对象&#xff0c;来实现Excel表格中的单元格写入、区域范围写入&#xff0c;当然也可以写入不同类型的数据&#xff0c;如数值、文本、公式&#xff0c;以及实现公式下拉自动填充的功能。 一、单元格输入数据 1.通过Value方法实现输入不同类型…

【Python】从文本字符串中提取数字、电话号码、日期、网址的方法汇总(全!)

我们在做数据清洗的时候&#xff0c;有时候会遇到将一堆文本中提取我们需要的内容&#xff0c;最常见的是&#xff0c;从一大段文本中提取出数字、电话号码、日期、网址等。而在Python中&#xff0c;正则表达式re&#xff0c;则可以满足我们从文本中提取数字、电话号码和日期等…

echarts实现3D柱状图(视觉层面)

一、第一种效果 效果图 使用步骤 完整实例&#xff0c;copy就可直接使用 <template><div :class"className" :style"{height:height,width:width}" /> </template><script>import echarts from echartsrequire(echarts/theme/…

《人人都是产品经理》:大产品

《人人都是产品经理》&#xff1a;大产品 产品之大时间之大空间之大&#xff1a;商业、产品、技术设计之大以写书为例 团队之大 回答一个问题 产品经理应该是管理者嘛&#xff1f;优点在于&#xff1a;缺点在于&#xff1a;总结&#xff1a; 如何让团队更加开心总结 产品之大 …

ChatGPT如何应用在谷歌seo?

ChatGPT在提升博客和创作效率方面非常有用。它可以帮助你快速生成吸引人的标题&#xff0c;确保内容第一眼就能抓住读者的注意力。不仅如此&#xff0c;ChatGPT还能根据你的主题生成详细的文章提纲&#xff0c;让你在写作时思路更加清晰。关键词优化也是它的强项&#xff0c;可…

hive内置函数

--查询hive的内置函数列表 show functions; --查询具体函数的使用描述 desc function extended 函数名 desc function extended current_database; 一.字符串函数 1.字符串的拆分 &#xff1a;split(); select split(hello,java;hi,bigdata,[,;]); [ ]内可以写多个分隔符 --…

【论文解读】Multiagent Multitraversal Multimodal Self-Driving: Open MARS Dataset

Open MARS Dataset 摘要引言Dataset CurationVehicle SetupData CollectionDataset Statistics Benchmark Task and ModelPlace RecognitionNeural Reconstruction Experimental ResultsVisual Place RecognitionNeural Reconstruction Opportunities and Challenges结论 摘要 …

7.2、指针变量的定义和使用

代码 #include <iostream> using namespace std; #include <string>int main() {//定义指针int a 10;//指针定义语法&#xff1a;数据类型 * 指针变量名int * p;//让指针记录变量a的地址p &a;cout << "a的地址为&#xff1a;" << &am…

恶意软件是什么意思?常见的恶意软件类型

您可能听说过很多有关恶意软件感染和运行服务器的危险的信息。但是&#xff0c;您可能还不清楚这在现实生活中意味着什么&#xff0c;或者该如何处理。让我们来了解一下&#xff1a;当人们谈论恶意软件时&#xff0c;他们真正指的是什么&#xff1f; 恶意软件是恶意软件的缩写&…

热网无线监测系统 SystemManager.asmx SQL注入漏洞复现

0x01 产品简介 热网无线监测系统是一种先进的热力管网监测解决方案,它通过无线通信技术实现对热力管网各项参数的实时监测和数据分析,以提高供热效率、降低能耗、保障管网安全。系统利用先进的传感器技术和无线通信技术,对热力管网中的温度、压力、流量等关键参数进行实时监…

【JAVA多线程】JDK中的各种锁,看这一篇就够了

目录 1.概论 1.1.实现锁的要素 1.2.阻塞队列 1.3.Lock接口和Sync类 2.各种锁 2.1.互斥锁 2.1.1.概论 2.1.2.源码 1.lock() 2.unlock() 2.2.读写锁 2.3.Condition 2.3.1.概论 2.3.2.底层实现 1.概论 1.1.实现锁的要素 JAVA中的锁都是可重入的锁&#xff0c;因为…

Google 发布了最新的开源大模型 Gemma 2,本地快速部署和体验

Gemma 2 是 Google 最新发布的开源大语言模型。它有两种规模&#xff1a;90 亿&#xff08;9B&#xff09;参数和 270 亿&#xff08;27B&#xff09;参数&#xff0c;分别具有基础&#xff08;预训练&#xff09;和指令调优版本&#xff0c;拥有 8K Tokens 的上下文长度&#…