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

微前端micro-app的使用

演示效果

子应用的项目

基应用嵌入子应用效果图

目录

前言

一、微前端是什么?

它主要解决了两个问题:

二、使用步骤

1.安装依赖

2.在入口处引入

3.子应用的路由()

4.分配一个路由给子应用(重要)(基应用的路由)

5.在基应用的MyPage页面中嵌入子应用

三、子应用的操作

1、设置基础路由(如果基座应用是history路由,子应用是hash路由,这一步可以省略)

2、接收基应用传过来的数据,进行路由跳转

3.子应用隐藏左边侧边栏和上边头部栏

在src\router\index.js下

总结


前言

博主在项目中由于多个团队开发项目,需要相互嵌套,从而了解到微前端micro-app嵌套项目,从而简单记录一下使用过程


一、微前端是什么?

微前端的概念是由ThoughtWorks在2016年提出的,它借鉴了微服务的架构理念,核心在于将一个庞大的前端应用拆分成多个独立灵活的小型应用,每个应用都可以独立开发、独立运行、独立部署,再将这些小型应用融合为一个完整的应用,或者将原本运行已久、没有关联的几个应用融合为一个应用。微前端既可以将多个项目融合为一,又可以减少项目之间的耦合,提升项目扩展性,相比一整块的前端仓库,微前端架构下的前端仓库倾向于更小更灵活。

它主要解决了两个问题:

  • 1、随着项目迭代应用越来越庞大,难以维护。
  • 2、跨团队或跨部门协作开发项目导致效率低下的问题

二、使用步骤

1.安装依赖

npm i @micro-zoe/micro-app --save

2.在入口处引入

main.js

import microApp from "@micro-zoe/micro-app";microApp.start();if (window.__MICRO_APP_ENVIRONMENT__) console.log('我在微前端环境中')
else console.log('我不在微前端环境中')
if (window.__MICRO_APP_BASE_APPLICATION__) {console.log('我是基座应用')}

3.子应用的路由()

 

4.分配一个路由给子应用(重要)(基应用的路由

/***  注意:*    权限是通过路由中的 name 属性来进行定位,所以 name 必须填写,且唯一**    isMenu  false表示该路由仅仅是路由,而不生成菜单*        默认所有路由都生成菜单,不想生成菜单直接添加属性 isMenu 为 false 即可*      注意:1.不需要每个路由都添加 isMenu 属性,只需要给不需要生成菜单的路由添加该属性,需要生成菜单的路由不需要加该属性*             2.二级菜单 isMenu 必须写在 children 里的每条路由上,一级菜单写在 children 外面(当前路由即可)*         3.权限路由不需要添加 isMenu ,因为权限路由是有后端返回的,所以不需要添加 isMenu 属性*    特别注意: 后台返回的权限菜单数据*            path值与name的值(后台返回的权限菜单中的path值与name值),必须对应组件目录中的组件所在目录*           如:角色路由组件 roles 目录必须与后台返回的数据中的角色路由 name 值一致,否则加载不到组件*              path:'/组件目录名称',*              name:'组件目录名称'*           path 与 name 必须对应组件目录名称*/// 所有人都可以访问const routes = [{path: "/login",//name:'login',isMenu: false,component: () =>import(/* webpackChunkName: "login" */ "@/views/login.vue"),},{path: "/",name: "dashboard",redirect: "/home",isMenu: false,children: [{path: "/home",name: "home",meta: { title: "主页", icon: false },component: () => import(/* webpackChunkName: "home" */ "@/views"),},],},{path: "/test",name: "test",isMenu: true,meta: { title: "测试管理", icon: "el-icon-s-tools" },component: () => import(/* webpackChunkName: "test" */ "@/views/test"),},{path: "/versiontwotable",name: "表格",isMenu: true,meta: { title: "表格2", icon: "el-icon-s-tools" },component: () =>import(/* webpackChunkName: "test" */ "@/views/versiontwo/pages/makecodeIndex.vue"),},{path: "/my-page/*",name: "子应用",isMenu: true,meta: { title: "子应用", icon: "el-icon-s-tools" },children: [// 其他的路由都写到这里{name: "/",path: "/",redirect: "/index",meta: { title: "index" },isMenu: true,children: [{name: "index",path: "/index",meta: { title: "index" },component: () => import("@/views/microapp/pages/index.vue"),},],},{name: "/form",path: "/form",redirect: "/form/index",meta: { title: "form" },isMenu: true,children: [{name: "/form/index",path: "/form/index",meta: { title: "form" },component: () => import("@/views/microapp/pages/index.vue"),},],},{name: "/example",path: "/example",redirect: "/example/tree",meta: { title: "example" },isMenu: true,children: [{name: "/tree",path: "/example/tree",meta: { title: "tree" },component: () => import("@/views/microapp/pages/index.vue"),},{name: "/copy",path: "/example/copy",meta: { title: "copy" },component: () => import("@/views/microapp/pages/index.vue"),},],},{name: "/table",path: "/table",meta: { title: "table" },redirect: "/table/index",isMenu: true,children: [{name: "/table/index",path: "/table/index",meta: { title: "table" },component: () => import("@/views/microapp/pages/index.vue"),},],},{name: "/admin",path: "/admin",meta: { title: "admin" },redirect: "/admin/index",isMenu: true,children: [{name: "/admin/index",path: "/admin/index",meta: { title: "admin" },component: () => import("@/views/microapp/pages/index.vue"),},],},{name: "/people",path: "/people",meta: { title: "people" },redirect: "/people/index",isMenu: true,children: [{name: "/people/index",path: "/people/index",meta: { title: "people" },component: () => import("@/views/microapp/pages/index.vue"),},],},],},{path: "/test1",name: "test1",isMenu: true,meta: { title: "角色管理", icon: "el-icon-s-tools" },children: [{path: "/roles3-2",name: "roles93-2",meta: { title: "角色管理3-2", icon: "el-icon-s-data" },component: () => import(/* webpackChunkName: "test1" */ "@/views/test"),},{path: "/roles3-3",name: "roles93-3",isMenu: true,meta: { title: "角色管理3-3", icon: "el-icon-s-data" },component: () => import(/* webpackChunkName: "tes3" */ "@/views/test"),},{path: "/roles3-1",name: "roles93-1",isMenu: true,meta: { title: "角色管理3-1", icon: "el-icon-s-data" },children: [{path: "/a",name: "a",meta: { title: "角色管理1-1", icon: "el-icon-s-data" },component: () =>import(/* webpackChunkName: "test5555" */ "@/views"),},],},],},{path: "/401",name: "401",isMenu: false,component: () =>import(/* webpackChunkName: "401" */ "@/views/error/401.vue"),},];

5.在基应用的MyPage页面中嵌入子应用

基座下发跳转指令

<!--  -->
<template><div><h1>子应用</h1><!--name(必传):应用名称url(必传):应用地址,会被自动补全为http://localhost:3000/index.htmlbaseroute(可选):基座应用分配给子应用的基础路由,就是上面的 `/my-page`--><micro-appname="app1"url="http://localhost:8888/"baseroute="/my-page"keep-alive@datachange="handleDataChange"></micro-app></div>
</template><script>import microApp from "@micro-zoe/micro-app";export default {data() {//这里存放数据return {};},//监听属性 类似于data概念computed: {},//监控data中的数据变化watch: {"$route.path": {handler(newValue, oldValue) {console.log("当前的数据", newValue);microApp.setData("app1", { path: newValue }); //向子应用发送路由数据},immediate: true,},},//方法集合methods: {AppTo() {},},//生命周期 - 创建完成(可以访问当前this实例)created() {},//生命周期 - 挂载完成(可以访问DOM元素)mounted() {// const childData = microApp.getData("app1"); // 返回子应用的data数据// console.log("childData", childData);},methods: {handleDataChange(e) {console.log("来自子应用的数据", e.detail);},},};
</script>
<style lang="scss" scoped></style>

子应用的操作

1、设置基础路由(如果基座应用是history路由,子应用是hash路由,这一步可以省略)

/router/index.jsimport Vue from "vue";
import VueRouter from "vue-router";const router = new VueRouter({// 👇 设置基础路由,子应用可以通过window.__MICRO_APP_BASE_ROUTE__获取基座下发的baseroute,如果没有设置baseroute属性,则此值默认为空字符串base: window.__MICRO_APP_BASE_ROUTE__ || process.env.BASE_URL,routes,
});main.jslet app = new Vue({router,render: h => h(App),
}).$mount('#app')

2、接收基应用传过来的数据,进行路由跳转

在APP.vue这里
<template><div id="app"><router-view /></div>
</template>
<script>
export default {data() {//这里存放数据return {};},//生命周期 - 创建完成(可以访问当前this实例)created() {},//生命周期 - 挂载完成(可以访问DOM元素)mounted() {//第一种跳转// if (window.__MICRO_APP_BASE_ROUTE__) {//   window.microApp.addDataListener((data) => {//     console.log("data的数据在这里冲冲冲", data);//     this.$router.push({ path: data.path });//   });// }},
};
</script>
<style>
html,
body {width: 100%;height: 100%;margin: 0;padding: 0;
}
</style>在main.js这里// 与基座进行数据交互
//第二种跳转
if (window.__MICRO_APP_ENVIRONMENT__) {console.log("我在微前端环境中");if (window.__MICRO_APP_BASE_ROUTE__) {// 监听基座下发的数据变化window.microApp.addDataListener((data) => {console.log("data的数据在这里冲冲冲", data);console.log("router.currentRoute.value.path", router.currentRoute.path);// 当基座下发path时进行跳转if (data.path && data.path !== router.currentRoute.path) {router.push({ path: data.path });}});}// 向基座发送数据setTimeout(() => {window.microApp.dispatch({ myname: "tenant-app" });}, 3000);
}

3.子应用隐藏左边侧边栏和上边头部栏

第一种方法:判断是否在微前端环境中,如果是,则隐藏,反之显示

<template><el-container><!-- undefined取反是true --><el-header v-if="!isShow"><header-temp></header-temp></el-header><el-container><el-aside v-if="!isShow" width="200px"><sidebar class="sidebar-container"></sidebar></el-aside><el-main><app-main></app-main></el-main></el-container></el-container>
</template>
<script>
import AppMain from "./appMain"; // 页面布局的右侧区域
import sidebar from "./sideBar"; // 页面布局的左侧菜单
import headerTemp from "./headerTemp"; // 页面布局的header菜单
export default {name: "layout",components: { sidebar, AppMain, headerTemp },data() {return {isShow: window.__MICRO_APP_ENVIRONMENT__, //判断当前是否在微前端环境,如果在则是true 如果不在是undefined};},created() {console.log("isShow", this.isShow);},
};
</script>
<style>
.el-header {padding: 0 !important;margin-left: 180px;
}
</style>

 第二种方法:子应用中添加一个非layout布局的空页面,当子应用单独运行时,指向layout布局页面,如果是在微服务中使用,则指向空页面,在src/layout下创建EmptyLayout.vue

<template><div class="emptyLayout"><router-view> </router-view></div>
</template>
<style lang="scss" scoped>
.emptyLayout {height: 100%;
}
</style>

在src\router\index.js下

//尝试微前端获取layout
function getComponent() {if (window.__MICRO_APP_ENVIRONMENT__) {console.log("进入了这里了嘛 微前端");return () => import("@/components/layout/EmptyLayout.vue");} else {return Layout;}
}component: getComponent(), //尝试微前端

总结

这里博主只是通过简单的两个项目进行微前端的搭建,具体项目不便编写,若有遇到的可以咨询博主,有用的的铁子可以一键三联,谢谢

相关文章:

微前端micro-app的使用

演示效果 子应用的项目 基应用嵌入子应用效果图 目录 前言 一、微前端是什么&#xff1f; 它主要解决了两个问题&#xff1a; 二、使用步骤 1.安装依赖 2.在入口处引入 3.子应用的路由&#xff08;&#xff09; 4.分配一个路由给子应用&#xff08;重要&#xff09;&#xff0…...

【JUC】Java内存模型之JMM

【JUC】Java内存模型之JMM 文章目录【JUC】Java内存模型之JMM1. 概念2. JMM三大特性2.1 可见性2.2 原子性2.3 有序性3. 多线程对变量的读写过程4. 先行发生原则——happens-before4.1 happens-before八条规则4.1.1 次序规则4.1.2 锁定规则4.1.3 volatile变量规则4.1.4 传递规则…...

Win11快速打开便签和使用技巧分享

Win11快速打开便签和使用技巧分享。Win11系统中为用户提供了一个非常实用的系统组件&#xff0c;就是便签功能&#xff0c;使用这个功能可以帮助我们便捷的进行一些重要内容的记录。那么如何去开启开启这个程序来使用呢&#xff1f;来看看以下的详情分享吧。 详细分享&#xff…...

CSS:横向导航栏

横向导航栏&#xff08;盗版导航栏&#xff0c;B站仿写。&#xff09; 原视频链接 <html><head><title>demo</title><style>*{margin: 0;padding: 0;list-style: none;text-decoration: none;}body{display: flex;justify-content: center;a…...

视频动态库测试及心得

视频动态库测试及心得 这几天一直在弄动态库测试&#xff0c;h给的写好的动态库--预处理模块的库。视频处理项目一部分&#xff0c;需要连接实际情况测试。 需求&#xff1a; 1.把实际相机连接到&#xff0c;并读取实时数据流&#xff0c;保存到双循环链表里面; 2.测试背景建模…...

陶泓达:4.18午间欧盘黄金原油最新精准操作建议!

黄金方面&#xff1a; 黄金消息面解析&#xff1a;周一&#xff08;4月17日&#xff09;美市盘中&#xff0c;美国公布的4月纽约联储制造业指数和4月NAHB房产市场指数均超出预期&#xff0c;提振了美联储在5月继续加息的预期。数据公布之后&#xff0c;美元指数加速上扬&#x…...

环境变量相关知识

目录 目录 谢谢你的阅读&#xff0c;这是对我最大的鼓舞 先说结论&#xff1a; 开始论述&#xff1a; 让我们举个例子 相关指令 创建本地变量 创建环境变量 方法一&#xff1a; 方法二&#xff1a; 删除环境变量 子进程中也有环境变量 第一种&#xff1a; 第二种 …...

如何快速入门ChatGPT

作为一个AI模型&#xff0c;ChatGPT并不需要像人一样“学习”&#xff0c;它已经通过大量的训练数据和算法进行了预训练&#xff0c;可以回答广泛的问题。 然而&#xff0c;如果你想学习如何使用ChatGPT来进行对话或者问答&#xff0c;以下是一些建议&#xff1a; 一、了解Ch…...

Akka定时任务schedule()方法

Akka定时任务schedule()方法 文章目录Akka定时任务schedule()方法什么是Akka定时任务schedule()方法&#xff1f;如何使用Akka定时任务schedule()方法&#xff1f;如何在actor外部获取Scheduler对象为什么需要提供一个隐式的ExecutionContext对象&#xff0c;用于执行定时任务&…...

Python实现处理和分析大规模文本数据集,包括数据清洗、标注和预处理

处理和分析大规模文本数据集,包括数据清洗、标注和预处理,是自然语言处理(NLP)中非常重要的一步。Python 是一种非常流行的编程语言,拥有丰富的 NLP 库和工具,可以帮助我们完成这些任务。以下是一个简单的实现示例,包括数据清洗、标注和预处理: import re import nltk…...

灌区量测水系统

1)灌区量测水 灌区量测水是水资源管理的基础&#xff0c;是推进节水农业和水价改革的重要手段。常规在主要水闸处&#xff0c;监测闸前和闸后水位及闸门开启状态(闸位)&#xff0c;通过实时监测数据&#xff0c;计算过闸流量。要实现全灌区水资源动态配置、精准灌溉&#xff0…...

3.3 泰勒公式

学习目标&#xff1a; 复习微积分基础知识。泰勒公式是微积分的一个重要应用&#xff0c;因此在学习泰勒公式之前&#xff0c;需要复习微积分的基本概念和技能&#xff0c;包括函数的导数和微分、极限、定积分等。可以参考MIT的微积分课程进行复习和加强。 学习泰勒级数和泰勒…...

ubuntu中通过vscode编译调试ORB-SLAM3

为了在orb-slam3的基础上进行二次开发&#xff0c;这几天花了不少精力&#xff0c;终于搞懂怎么在ubuntu系统中像windows里visual studio中一样方便的打断点调试了&#xff0c;在这里把整个过程再重新梳理一下。 1 首先从安装ubuntu 22.04开始 因为是从实验室毕业先辈那里继承…...

阿里版 ChatGPT 突然上线!

转自:纯洁的微笑 其实早本月初&#xff0c;就传出过不少阿里要推出类ChatGPT的消息。 前几天率先流出的天猫精灵“鸟鸟分鸟”脱口秀版GPT&#xff0c;就是基于大模型的“压缩版”&#xff0c;已经以其惊艳表现吸引了众目光。 如今“原版大菜”上桌&#xff0c;自然一点即着&a…...

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图 如下图所示&#xff1a; 二、环境信息 主机名K8S版本系统版本内核版本IP地址备注k8s-master-621.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.62master节点k8s-worker-631.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63worker节点k8s-worker-641…...

MAZDA CX-50没现车怎么办?赶紧去VR看车啊!

爱车一族往往都有过这样的经历&#xff1a;听说某家品牌出了一款心仪的新车&#xff0c;于是一直心心念念想要先睹为快。然而这时候问题就来了&#xff1a;新车从发布到量产上市往往要经历一段过程。没有现车的日子里&#xff0c;就算每天去4S店蹲守也看不到新车。那种心里痒痒…...

结构体全解,适合初学者的一条龙深度讲解(附手绘图详解)

我们知道&#xff0c;C语言是允许我们自己来创造类型的&#xff0c;这些类型就叫做——自定义类型。 自定义类型又包括结构体类型&#xff0c;联合体类型还有枚举类型。 今天的文章&#xff0c;我们就着重讲解这其中的结构体类型。 目录 结构体的声明 1.1结构的基础知识 …...

什么是SD-WAN技术?企业网络优化的利器!

现今&#xff0c;企业网络架构已成为其发展不可或缺的组成部分。针对网络性能优化方面&#xff0c;SD-WAN是一种值得深思熟虑的选择&#xff0c;在企业网络中应用SD-WAN技术能够带来多重好处。 什么是SD-WAN技术以及它是如何工作的&#xff1f; SD-WAN是软件定义的广域网&…...

JAVA练习106- 生命游戏

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目-生命游戏 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 4 月12日练习…...

【案例教程】基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作实践技术

【原文链接】: 基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作实践技术https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247537049&idx3&sn31ef342c4808aed6fee6ac108b899a33&chksmfe6897f3c91f1ee5c4fa8e4eeea34…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

李沐--动手学深度学习--GRU

1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...