【微前端】使用无界嵌入子应用

无界是一种解决iframe微前端方案缺点的新方法,具备成本低、速度快、原生隔离和功能强大的优点。它在Vue3项目中易于集成,支持保活、单例和重建模式,并提供了props、window通信和eventBus等多种父子应用通信方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

·前言

所谓微前端,就是把一个应用当成vue组件嵌入到另一个应用。将一个页面拆分成独立的小型应用,各个应用间相互独立,可以随意组合,更加灵活。原生比较常用的方案是使用iframe,但是这种方案存在一些缺点,如:dom隔离严重、路由无法保活、父子应用通讯困难等。

 本文将介绍一种基于iframe的全新微前端方案 -- 【无界】,解决了上述问题外还具有成本低、速度快、原生隔离、功能强等优点。

·无界

以下介绍在 Vue3 项目中如何应用无界嵌入子应用:

1. 安装

npm i wujie-vue3 -S

2. 在 main.ts 挂载使用

import { createApp } from 'vue';
import WujieVue from 'wujie-vue3';
import App from './App.vue';

const app = createApp(App);
app.use(WujieVue).mount('#app');

3. 在页面中应用

<template>
  <WujieVue
    width="100%"
    height="100%"
    name="server"
    :url="serverUrl"
    :alive="true"
    :sync="true"
    :after-mount="afterMount"
  />
</template>

<script setup lang="ts">
import { ref } from 'vue';
import wujieVue from 'wujie-vue3';
import { environment } from '@/app.config';

const serverUrl = ref(environment.VITE_SERVER_URL);

const afterMount = () => {};

</script>

<style scoped lang="scss"></style>

其中,name 为子应用唯一标识符,url 为子应用的路径地址,alive 设为 true 则是保活模式,after-mount 为子应用渲染后的生命周期钩子,无界的主要生命周期可以分为:

  • beforeLoad:子应用开始加载静态资源前触发
  • beforeMount:子应用渲染(调用window.__WUJIE_MOUNT)前触发
  • afterMount:子应用渲染(调用window.__WUJIE_MOUNT)后触发
  • beforeUnmount:子应用卸载(调用window.__WUJIE_UNMOUNT)前触发
  • afterUnmount: 子应用卸载(调用window.__WUJIE_UNMOUNT)后触发
  • activated:子应用保活模式下,进入时触发
  • deactivated:子应用保活模式下,离开时触发

 几种模式的区别:

  • 保活模式:子应用的alive设置为true时进入保活模式,内部的数据和路由的状态不会随着页面切换而丢失。在保活模式下,子应用只会进行一次渲染,页面发生切换时承载子应用domwebcomponent会保留在内存中,当子应用重新激活时无界会将内存中的webcomponent重新挂载到容器上。保活模式下改变  子应用的路由不会发生变化,需要采用通信的方式对子应用路由进行跳转
  • 单例模式:子应用的alivefalse且进行了生命周期改造时进入单例模式。子应用页面如果切走,会调用window.__WUJIE_UNMOUNT销毁子应用当前实例,子应用页面如果切换回来,会调用window.__WUJIE_MOUNT渲染子应用新的子应用实例

    在单例式下,改变 url 子应用的路由会发生跳转到对应路由。如果主应用上有多个菜单栏用到了子应用的不同页面,在每个页面启动该子应用的时候将name设置为同一个,这样可以共享一个wujie实例,承载子应用jsiframe也实现了共享,不同页面子应用的url不同,切换这个子应用的过程相当于:销毁当前应用实例 => 同步新路由 => 创建新应用实例

  • 重建模式:子应用既没有设置为保活模式,也没有进行生命周期的改造则进入了重建模式,每次页面切换不仅会销毁承载子应用 dom 的 webcomponent,还会销毁承载子应用jsiframe,相应的 wujie 实例和子应用实例都会被销毁。重建模式下改变 url 子应用的路由会跳转对应路由,但是在路由同步场景并且子应用的路由同步参数已经同步到主应用url上时则无法生效,因为改变url后会导致子应用销毁重新渲染,此时如果有同步参数则同步参数的优先级最高

4. 父子应用通信

承载子应用的iframe和主应用是同域的,所以主、子应用天然就可以很好的进行通信,在无界中提供三种通信方式:

  • props 通信

主应用可以通过props注入数据和方法:

<WujieVue name="xxx" url="xxx" :props="{ data: xxx, methods: xxx }"></WujieVue>

子应用可以通过$wujie来获取:

const props = window.$wujie?.props; // {data: xxx, methods: xxx}
  • window 通信

主应用调用子应用的全局数据

window.document.querySelector("iframe[name=子应用id]").contentWindow.xxx;

子应用调用主应用的全局数据

window.parent.xxx;
  • eventBus 通信

无界提供一套去中心化的通信方案,主应用和子应用、子应用和子应用都可以通过这种方式方便的进行通信,主应用使用方式:

// 如果使用wujie
import { bus } from "wujie";

// 如果使用wujie-vue
import WujieVue from "wujie-vue";
const { bus } = WujieVue;

// 如果使用wujie-react
import WujieReact from "wujie-react";
const { bus } = WujieReact;

// 主应用监听事件
bus.$on("事件名字", function (arg1, arg2, ...) {});
// 主应用发送事件
bus.$emit("事件名字", arg1, arg2, ...);
// 主应用取消事件监听
bus.$off("事件名字", function (arg1, arg2, ...) {});

子应用使用方式:

// 子应用监听事件
window.$wujie?.bus.$on("事件名字", function (arg1, arg2, ...) {});
// 子应用发送事件
window.$wujie?.bus.$emit("事件名字", arg1, arg2, ...);
// 子应用取消事件监听
window.$wujie?.bus.$off("事件名字", function (arg1, arg2, ...) {});

·总结

总的来说无界的优点还是很明显:

  • 使用iframe作为天然的 js 沙箱,不会污染主应用环境
  • 使用 Web Components 来隔离htmlcss,这是一个浏览器原生支持的组件封装技术,可以有效隔离元素之间的样式
  • 提供了事件总线和props传参,弥补了iframe通信困难的缺点
  • 子应用无需做任何改造,接入更简单
  • 实现了多应用激活、应用保活功能
  • 提供了vue和react组件的封装,开箱即用

以上就是在Vue3项目中使用微前端无界的相关介绍,目前比较流行的微前端框架还有乾坤(single-spa的进一步优化),感兴趣的小伙伴可以自行去了解 ^-^ ​​​​​​​ 

### 无界框架中子应用方法调用的实现方式 在微前端架构中,无界框架(Boundary Framework)是一种常见的解决方案,用于管理多个独立开发和部署的子应用。为了实现在父应用中调用子应用的方法,通常需要借助特定的技术手段来完成跨边界通信。 #### 1. **通过全局对象暴露方法** 无界框架允许子应用将自己的功能或方法注册到一个全局对象上,这样主应用可以通过访问该全局对象间接调用子应用中的方法。例如,在子应用初始化时可以执行如下代码: ```javascript window.subAppMethods = { sayHello: function(name) { console.log(`Hello, ${name}!`); } }; ``` 随后,主应用可以直接通过 `window.subAppMethods.sayHello('World');` 调用子应用的功能[^1]。 #### 2. **利用事件总线机制** 另一种常用的方式是基于事件驱动模型构建一个事件总线(Event Bus),使得主应用能够向子应用发送消息并触发相应的处理逻辑。以下是简单的实现示例: ##### 子应用端监听事件: ```javascript document.addEventListener('customEvent', (event) => { const data = event.detail; console.log('Received from parent:', data); }); ``` ##### 主应用端派发事件: ```javascript const customEvent = new CustomEvent('customEvent', { detail: 'Message from Parent' }); document.dispatchEvent(customEvent); ``` 这种方式不仅实现了父子之间的交互,还保持了模块间的松耦合特性[^2]。 #### 3. **采用PostMessage API进行跨域通讯** 如果涉及到不同域名下的子应用,则可运用浏览器原生支持的 PostMessage 技术来进行安全有效的数据交换。下面展示了一个基本的例子: ##### 发送方(通常是主应用卡槽所在位置): ```javascript childWindow.postMessage({ action: 'invokeMethod', methodName: 'sayHello', args: ['User'] }, '*'); ``` ##### 接收方(即目标子应用内部定义好相应处理器): ```javascript window.onmessage = function(event) { if (event.data.action === 'invokeMethod') { this[event.data.methodName](...event.data.args); // 动态调用指定函数名及其参数列表 } } ``` 此方法特别适合于那些无法直接修改源码或者存在严格同源策略限制的情况[^3]。 ### 总结 综上所述,在微前端环境下使用无界框架时,有多种途径可供选择以达成从外部控制内部业务流程的需求。无论是简单粗暴地挂载公开接口至 window 上还是精心设计一套完善的发布订阅模式乃至依赖标准化协议如 postMessage 都各有千秋需视实际场景灵活选用最佳实践方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值