微前端插件 v-micro-app-plugin

news2024/11/14 13:56:17

    v-micro-app-plugin 是一款基于京东MicroApp框架的微前端插件,旨在帮助开发者快速地将微应用集成到不同的系统中,实现高效、灵活的前端模块化开发。以下是详细的使用指南,帮助你快速上手。

 微前端插件 v-micro-app-plugin 源码地址:GitHub - yoguoer/v-micro-app-plugin: v-micro-app-plugin是一款基于MicroApp的微前端插件,实现快速安装使用。v-micro-app-plugin是一款基于MicroApp的微前端插件,实现快速安装使用。. Contribute to yoguoer/v-micro-app-plugin development by creating an account on GitHub.icon-default.png?t=N7T8https://github.com/yoguoer/v-micro-app-plugin.git

用该插件搭建的的示例项目 vMicroVerseHub 源码地址:GitHub - yoguoer/vMicroVerseHub: vMicroversehub 是一个使用 v-micro-app-plugin搭建的 monorepo 微前端项目框架,主要用于给出案例,更好地展示插件的功能和用法。vMicroversehub 是一个使用 v-micro-app-plugin搭建的 monorepo 微前端项目框架,主要用于给出案例,更好地展示插件的功能和用法。 - yoguoer/vMicroVerseHubicon-default.png?t=N7T8https://github.com/yoguoer/vMicroVerseHub.git

特性

快速集成:通过简单的配置,即可将MicroApp微应用作为插件快速集成到现有系统中。

灵活部署:支持动态加载和卸载微应用,便于按需加载,提升页面加载速度和用户体验。

无缝通信:内置跨应用通信机制,支持不同微应用间的数据交换和事件传递。

易于扩展:插件架构清晰,易于根据业务需求进行定制和扩展。

安装

        你可以通过 npm、pnpm 或 yarn 来安装 v-micro-app-plugin

  • 通过 npm 安装

npm i v-micro-app-plugin --save
  • 通过 pnpm 安装

pnpm i v-micro-app-plugin --save
  • 通过 yarn 安装

yarn add v-micro-app-plugin

参数

initMyMicroApp 调用参数

参数名介绍类型
app应用实例object
options配置参数microAppConfig
routerRouter 实例any
store状态管理实例any

注意:microAppConfig的类型声明如下:

export interface microAppConfig {
    projectName?: string; // 项目名称
    subAppConfigs?: Object; // 子应用配置
    isBaseApp?: boolean; // 是否为 micro-app 主应用
    basePath?: string; // 打包路径
    disableSandbox?: boolean; // 是否禁用沙箱
    iframe?: boolean; // 是否使用 iframe
}

options 参数介绍

        在配置 v-micro-app-plugin 时,你需要准备一个符合条件的 options 对象,该对象包含以下参数:

参数名介绍类型
projectName项目名称string
subAppConfigs子应用配置对象,包含多个子应用的配置Object
isBaseApp标记当前应用是否为主应用(默认为 true)boolean
basePath打包路径或其他基础路径string
disableSandbox是否禁用沙箱(默认为 false)boolean
iframe是否使用 iframe(默认为 true)boolean

注意:subAppConfigs 对象中每个子应用的配置包括:

  • name:子应用名称

  • url:子应用的运行地址

使用

引入插件

        在你的主应用或目标系统的入口文件中,引入 v-micro-app-plugin

import initMyMicroApp from 'v-micro-app-plugin'

配置和启动

        你需要准备一个配置对象 options,包含项目名称、子应用配置、是否为MicroApp主应用以及打包路径等信息。然后,使用 initMyMicroApp 函数进行初始化。这里假设你已经有了一个 Vue 应用实例 app , Vue Router 实例 router,以及状态管理实例 store。

const options = {  
  projectName: 'v-micro-app-plugin',  
  subAppConfigs: {  
    'appFirst': {  
      name: 'appFirst',  
      url: 'http://localhost:4000/#/' // 微应用的运行地址  
    },  
    'appSecond': {  
      name: 'appSecond',  
      url: 'http://localhost:3000/#/' // 另一个微应用的运行地址  
    }  
  },  
  isBaseApp: true, // 当前应用是否为主应用
  basePath: '/', // 打包路径或其他基础路径 
  disableSandbox: false, // 是否禁用沙箱
  iframe: true, // 是否使用 iframe
};  
​
// 初始化微前端插件  
await initMyMicroApp(app, options, router, store); 

环境变量配置

        为了在不同环境下(如开发、测试、生产)使用不同的微应用地址,你可以使用环境变量来动态设置 url。这里提供一个示例:

// 假设你已经在项目中配置了环境变量,例如使用 Vite 的 .env 文件   import.meta.env.MODE
const env = import.meta.env.MODE; // 这里使用的是 Vite 默认的 MODE 变量 
const microAppUrl = {  
  appFirst: {  
    development: 'http://localhost:3000/#/',  
    test: 'https://test.example.com/vivien/appFirst/',  
    production: 'https://www.example.com/vivien/appFirst/'  
  },  
  appSecond: {  
    development: 'http://localhost:4000/#/',  
    test: 'https://test.example.com/vivien/appSecond/',  
    production: 'https://www.example.com/vivien/appSecond/'  
  },  
};  
  
const options = {  
  projectName: 'micro-app-Name',  
  subAppConfigs: {  
    'appFirst': {  
      name: 'appFirst',  
      url: microAppUrl['appFirst'][env]  
    },  
    'appSecond': {  
      name: 'appSecond',  
      url: microAppUrl['appSecond'][env]  
    }  
  },  
  isBaseApp: true, // 是否为主应用  
  basePath: '/', // 打包路径或其他基础路径  
  disableSandbox: false, // 是否禁用沙箱
  iframe: true, // 是否使用 iframe
};  
  
await initMyMicroApp(app, options, router, store);

注意:不管是主应用还是子应用,都必须安装插件,根据需要进行不同的配置。

对象和方法

    v-micro-app-plugin 提供了一系列可供使用的方法和对象:

microAppUtils 对象

        该对象用于获取当前应用的一些基本信息,提供多个方法。具体如下:

方法名介绍参数
isMicroApp判断应用是否在微前端环境中-
isBaseApp判断应用是否是主应用-
getMicroAppBaseRoute获取子应用的基础路由-
getMicroAppPublicPath获取子应用的publicPath目录-
getMicroAppName获取当前应用名称name?: string
getMicroApp返回当前应用实例-

使用示例:

import { microAppUtils } from "v-micro-app-plugin";
​
const { isMicroApp, isBaseApp } = microAppUtils;
import { onBeforeMount } from "vue";
​
onBeforeMount(() => {
    console.log('是否在微前端环境中:',isMicroApp(), '是否为主应用:'isBaseApp())
})

getMicroAppMessage 方法

        此方法直接返回一个通信实例对象,该对象用于实现应用之间的通信,提供一系列 API 方便使用。具体如下:

方法名介绍参数
sendMessage发送数据{ data, appName, callback }: MessageParamsType
sendGlobal全局发送数据{ data, appName, callback }: MessageParamsType
forceSend强制发送数据,无论数据是否变化{ data, appName, callback }: MessageParamsType
forceSendGlobal强制全局发送数据,无论数据是否变化{ data, appName, callback }: MessageParamsType
getMessage获取数据appName?: string
getGlobalMessage获取全局数据-
clearMessage清除数据appName: string
clearGlobalMessage清除全局数据-

注意:MessageParamsType的类型声明如下:

interface MessageParamsType {
  data: object // 发送的数据内容
  appName?: string // 接收数据应用名称,当且仅当主应用发送数据时需要传入
  callback?: Function // 回调函数
}

使用示例:

        在子应用 appFirst 中,使用 sendMessage 给子应用发出数据,使用发出 sendGlobal 全局数据:

import { getMicroAppMessage } from "v-micro-app-plugin";

function testSendMessage(){
 const microAppMessage = getMicroAppMessage()
 microAppMessage.sendMessage({
  data: { type: 'sendMessage', value: 'appFirst给主应用发送数据~' },
  callback: () => {
    console.log('使用sendMessage发送数据成功,执行回调!')
  }
 })
 microAppMessage.sendGlobal({
  data: { fun: 'sendGlobal', text: 'appFirst给全局发送数据~' },
  callback: () => {
    console.log('使用sendGlobal发送数据成功,执行回调!')
  }
 })
 setTimeout(() => {
    console.log("getGlobalMessage:", microAppMessage.getGlobalMessage(),"getMessage:", microAppMessage.getMessage())
 },3000)
}
// 结果发现:子应用 => 可以接收到全局信息,但接收不到自己发给主应用的信息。

        在主应用中,使用 getMessage 接收子应用发来的数据,使用 getGlobalMessage 接收全局数据:

import { getMicroAppMessage } from "v-micro-app-plugin";

function testGetMessage() {
 const microAppMessage = getMicroAppMessage()
 setTimeout(() => {
  console.log('getGlobalMessage:',microAppMessage.getGlobalMessage(),'getMessage:',microAppMessage.getMessage('appFirst'))
 }, 3000)
}
// 结果发现:主应用 => 可以接收到全局信息,也可以收到 appFirst 发来的信息。

Tip:其它通信 API 方法的使用方式同上。

注意应用发送数据给主应用时,无需传递appName参数;而应用发送数据给子应用时,则通过appName参数来指定某个具体子应用名称。同理,清空当前应用发送给主应用的数据时,无需传递appName参数;而清空应用发送给子应用的数据时,则通过appName参数来指定某个具体子应用名称。

可直接引入的方法

方法名介绍参数
getMainAppConfigs获取主应用配置项-
getSubAppConfigs获取子应用配置项-
getRounterInstance获取 Microapp 路由实例-
renderAllSubApp渲染所有子应用-

使用示例:

import { getMainAppConfigs, getSubAppConfigs } from "v-micro-app-plugin";
import { onBeforeMount } from "vue";

onBeforeMount(() => {
	console.log('使用示例:',getMainAppConfigs(), getSubAppConfigs())
})
// 将会输出当前主应用配置信息,以及其包含的子应用配置信息

其它

        为了照顾到一些微前端小白,在这里,我附上一些必要的、可能会有所帮助的信息。

配置路由信息

        有了主子应用之后,我们就需要在主应用中给子应用配置路由信息,这里一共有 2 个子应用,我们为它们分别进行配置。

  • appFirst:
import microAppSetting from '@/settings/microAppSetting'

export default {
  path: '/appFirst',
  name: 'appFirst',
  component: Layout,
  order: 1,
  hidden: false,
  meta: {
    title: 'appFirst',
    hideBreadcrumb: false,
    icon: Document,
    microAppOptions: microAppSetting.subAppConfigs!['appFirst']
  }
}
  • appSecond:

import microAppSetting from '@/settings/microAppSetting'

export default {
  path: '/appSecond',
  name: 'appSecond',
  component: Layout,
  order: 2,
  hidden: false,
  
  meta: {
    title: 'appSecond',
    hideBreadcrumb: false,
    icon: Document,
    microAppOptions: microAppSetting.subAppConfigs!['appSecond'],
  }
}

封装 MicroAppContainer

        众所周知,路由切换时,可以给<router-view />填充上对应路径的内容,同理,microApp中的<micro-app></micro-app>也有同样的功能。我们可以对其进行二次封装,结合v-if,以便于根据是路由指向的是子应用,还是本系统自由模块,来判断究竟是渲染微应用视图,还是渲染普通视图。

        为了达到这个目的,我们可以新建一个 MicroAppContainer 文件夹,在其中创建一个index.vue,然后键入以下内容:

<template>
  <div :class="[`${prefixCls}-container`]">
    <!-- name:应用名称, url:应用地址 -->
    <micro-app v-bind="options" :name="options.name" keep-alive></micro-app>
  </div>
</template>
<script setup lang="ts">
import { watch } from "vue";

const props = defineProps<{
  options: {
    [key: string]: any;
  };
}>();

let prefixCls = props.options.name

watch(
  () => props.options,
  (newValue) => {
    prefixCls = newValue.name
  },
  { immediate: true, deep: true }
);
</script>
<style></style>

⚠注意:keep-alive 属性可根据需要决定是否设置。

区分是否微应用视图

  • 在你需要加载子应用页面的地方:

        <div :class="[`${prefixCls}-viewer-microapp`]" v-if="isMicroAppView">
          <MicroAppContainer :options="microAppOptions" />
        </div>
        <div v-else>
          <router-view />
        </div>
  • 一些必要的逻辑语句:

import { watchEffect, ref } from 'vue'
import { useRoute } from 'vue-router'
const route = useRoute()
​
let isMicroAppView: Ref = ref(false)
let microAppOptions: Ref = ref({})
watchEffect(async () => {
  microAppOptions.value = route.meta.microAppOptions
  isMicroAppView.value = !isNullOrUnDef(microAppOptions.value) && !isEmpty(microAppOptions.value)
})

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

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

相关文章

golang 命令行聊天室

实战简介&#xff1a; 基于tcp协议实现功能 服务器端&#xff1a; 接受用户消息和循环转发 对功能命令进行处理&#xff08;meun查询功能词&#xff0c;changeName改名&#xff0c;online查询在线人数&#xff0c;quit退出&#xff09; 客户端&#xff1a; 接受服务器发送…

【话题】程序员之路:高效编码与持续成长的平衡之道

目录 程序员如何平衡日常编码工作与提升式学习&#xff1f; 引言 方向一&#xff1a;高效编码习惯与时间管理技巧 方向二&#xff1a;提升式学习的策略 实际案例&#xff1a; 方向三&#xff1a;职业发展与个人成长的和谐共生 实际案例&#xff1a; 程序员如何平衡日常编码工作…

金融业与三方公司网络互联方法

文章目录 云桌面定义类型非持久桌面主要特点和优点 持久桌面主要特点和优点 网络缺点 专线定义特点网络缺点 VPN定义特点网络缺点 零信任定义优点缺点与挑战网络应用最佳实践案例与趋势 互联网加白名单定义应用场景访问流程图优点缺点相关技术 云桌面 定义 云桌面是一种基于云…

工厂间的库存转储

从一个工厂到另一个工厂实施实物物料转储&#xff1a; 一步式程序两步式程序&#xff1a;使用两步式程序进行库存转储可能是因为两个工厂相距甚远&#xff0c;货物在某个特定时间内处于运输状态&#xff1b;或者两个工厂分别由不同的员工负责&#xff0c;每个员工只能过帐本工…

红酒与节日装饰:打造节日氛围的需备品

随着节日的脚步渐渐临近&#xff0c;节日的氛围也愈发浓厚。在这个特殊的时刻&#xff0c;红酒与节日装饰无疑成为了营造节日氛围的需备品。洒派红酒&#xff08;Bold & Generous&#xff09;作为定制红酒的品牌&#xff0c;其不同的韵味与节日装饰的精致整合&#xff0c;共…

react笔记:redux

redux状态管理 安装redux&#xff1a;num i redux 新建redux文件夹&#xff1a; store.jscount_reducer.js count_action.js constant.js (常量&#xff09; 1. store.js文件&#xff1a; // 该文件专门用于暴露一个store对象&#xff0c;整个应用只有一个store对…

MyBatis巧用1=0,再鸡肋也得用

一、问题导向 今天在实现文件上传数据库测试中&#xff0c;发现了一个略微容易被问题。虽然业务层可以约束空字符串的传入。但是测试DAO数据层时&#xff0c;被同事发现&#xff0c;说我&#xff1a;“为什么不加10”。 请看问题。 如果用户账号为空&#xff0c;则有分页输出…

在JavaFx中使用StyledLayerDescriptor(SLD)1.0和1.1版本进行地图美化实践

目录 前言 一、最开始的初始世界 1、默认的样式 二、注册事件让地图实现交互 1、绑定事件及注册处理逻辑 三、地图美化&#xff0c;让地图生动起来 1、POM.xml中引入相应的依赖 2、GeoTools加载不同版本的SLD问题 3、加载1.1.0版本的SLD 四、总结 前言 俗话说&#xff…

超简单理解LSTM和GRU模型

目录 参考资料 RNN在反向传播时容易遭受梯度消失的问题&#xff0c;而梯度是用于更新神经网络权重的关键因子&#xff0c;梯度消失描述的是梯度在时间序列反向传播中逐渐减小的情况。 若梯度过小&#xff0c;它对于网络的学习贡献甚微。结果是&#xff0c;在RNN中&#xff0c;梯…

成功的秘诀:客户推荐推动 SaaS 成功的4个原因

在竞争激烈的SaaS市场中&#xff0c;脱颖而出并非易事。客户推荐合作伙伴关系正是这样一种强大的营销渠道&#xff0c;它利用口碑传播的力量&#xff0c;将满意的客户转变为品牌倡导者&#xff0c;从而显著提升品牌信誉和市场影响力。 您的 SaaS 品牌应该接受客户推荐营销的4 …

进 程

1.进程&#xff1a;进行中的程序。 微观串行&#xff0c;宏观并行。 程序的一次执行过程 进程是程序的一个实例 一个程序可以对应一个或多个进程。 2.为什么需要进程&#xff1f; 3.进程的组成部分&#xff1a; 进程 pcb 块 栈|堆|bss|data|text 其中&#xff1a; 家族…

车载测试与分析的利器之CANoe

连接汽车神经网络的专家 CANoe不仅是一款强大的总线分析工具&#xff0c;它还集成了仿真、标定和诊断功能&#xff0c;为汽车工程师提供了全方位的车载网络解决方案。从基础的信号监测到复杂的网络交互测试&#xff0c;CANoe凭借其灵活性和高效性&#xff0c;成为了车载测试工程…

浏览器后门:保护影子 IT 的新前线

浏览器扩展是网络犯罪分子的主要目标。这不仅仅是消费者的问题&#xff0c;也是企业对抗影子 IT 的新领域。 最终&#xff0c;扩展权限越多&#xff0c;攻击面就越大。研究表明&#xff0c;平均每个企业的生态系统中都有近 1500 个浏览器扩展程序 - 即使是一个不良插件也可能导…

线上o2o商城小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 在数字化时代&#xff0c;线上线下融合&#xff08;O2O&#xff09;的商业模式已成为推动零售业发展的新引擎。为了满足商家快速构建高效、便捷、用户友好的电商平台需求&#xff0c;我们精心研发了一款线上O2O商城小程序源码系统。该系统不仅配备了完整的安装代码包…

面向对象编程-多态

一、多态的引入 1、先看一个问题 2、使用传统的方法类解决 class Food:nameNonedef __init__(self,name):self.namenameclass Fish(Food):passclass Bone(Food):passclass Animal:nameNonedef __init__(self,name):self.namenameclass Cat(Animal):passclass Dog(Animal):pas…

STM32F103-固件库开发-keil一些警告解决-中断机制-NVIC-简单按钮电灯流程及其代码;

1、固件库和HAL库 固件库&#xff08;Standard Peripheral Library&#xff0c;通常被称为SPL&#xff09;和HAL库&#xff08;Hardware Abstraction Layer&#xff0c;硬件抽象层&#xff09;都是STMicroelectronics&#xff08;ST&#xff09;为STM32系列微控制器提供的软件…

腾讯云AI代码助手:智能编程的新篇章,大家的代码开发伙伴

文章目录 一、前言二、开发环境介绍三、腾讯云AI代码助手使用实例1、案例一&#xff1a;代码补全2、案例二&#xff1a;代码注释和解释等3、案例三&#xff1a;与AI对话实现需求 四、获得的帮助与提升五、建议六、结语 一、前言 随着人工智能技术的飞速发展&#xff0c;其在各…

SWIPT综述

TS PS Hybrid TSPS ρ 和 α 的最优值以及确定继电器的最优位置可以最小化系统的 OP。 SWIPT CoR with non-linear EH, the hybrid protocol performs better than TSR as well as PSR protocols in terms OP. 波束成形&#xff1a;多天线 SWIPT CoR NETWORKS 多天线系统在 5…

自制神之嘴: fish-speech 容器镜像 (文本转语音 AI 大模型)

穷, 没有 N 卡 ! 穷, 没有 N 卡 ! 穷, 没有 N 卡 !! (重要的事情说 3 遍. ) 最近发现了一个很新的 AI (神经网络) 文本转语音大模型: https://speech.fish.audio/ fish-speech 可以根据输入的文本, 生成高质量的人类说话声音, 效果挺好的. fish-speech 官方已经提供了容器 (d…

2.3 不同数据库管理系统的比较与应用场景

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…