使用wujie搭建微前端应用及踩坑

线上演示地址:wujie-app

源码地址:https://github.com/Jiang-K-J/micro-app?tab=readme-ov-file (如果觉您得有用,请帮忙点个小星星)

主应用:vue2+webpack

子应用:vue3+vite

子应用:react 18 + webpack

无界是微前端框架,有原生版(可在NPM下载),官方同时还针对Vue2、Vue3、React做了不同封装(也可在NPM下载)。封装的意义在于,原生配置较繁琐,而用封装好的版本(如wujie-vue2)操作更简单便捷,下面要讲解基于wujie-vue2封装好的框架开发,实际项目中也多用这种开发方式。

安装

主应用配置
  1. 准备

首先准备一个vue2的项目,可以是新项目,也可以是已经有过开发的项目,这都不影响wujie微前端框架的使用

  1. 安装
npm i wujie-vue2 -S
  1. 引入
// vue2
import WujieVue from "wujie-vue2";const { bus, setupApp, preloadApp, destroyApp } = WujieVue;Vue.use(WujieVue);
  1. 使用
<WujieVuewidth="100%"height="100%"name="xxx":url="xxx":sync="true":fetch="fetch":props="props":beforeLoad="beforeLoad":beforeMount="beforeMount":afterMount="afterMount":beforeUnmount="beforeUnmount":afterUnmount="afterUnmount"
></WujieVue>
  1. 属性介绍

更详细的介绍请参考:wujie可用属性的介绍与使用

子应用配置

无界对子应用的侵入非常小,在满足跨域条件下子应用可以不用改造。但是实际开发中,一个成熟的wujie子应用,我们一般需要对它的生命周期进行改造。注意,不同的子应用生命周期改造方式不同,可以参考官方文档,下面我们将讲解对vite构建的vue3子应用进行生命周期改造。

请在你的main.ts文件中加入下方代码

// 你的路由文件
const routes = [{ path: '/', component: About },{ path: '/about', component: About },{ path: '/skip', component: Skip },{ path: '/connect', component: Connect },{ path: '/keepAlive', component: KeepAlive },{ path: '/isolation', component: Isolation }
]declare global {interface Window {// 是否存在无界__POWERED_BY_WUJIE__?: boolean;// 子应用mount函数__WUJIE_MOUNT: () => void;// 子应用unmount函数__WUJIE_UNMOUNT: () => void;// 子应用无界实例__WUJIE: { mount: () => void };}
}if (window.__POWERED_BY_WUJIE__) {let instance: any;window.__WUJIE_MOUNT = () => {const router = createRouter({ history: createWebHistory(), routes });instance = createApp(App)instance.use(router);instance.mount("#app");};window.__WUJIE_UNMOUNT = () => {instance.unmount();};/*由于vite是异步加载,而无界可能采用fiber执行机制所以mount的调用时机无法确认,框架调用时可能vite还没有加载回来,这里采用主动调用防止用没有mount无界mount函数内置标记,不用担心重复mount*/window.__WUJIE.mount()
} else {createApp(App).use(createRouter({ history: createWebHistory(), routes })).mount("#app");
}

基本使用

  1. Props传参
  • 主应用
<template><WujieVuewidth="100%"height="100%"name="about-vue":url="$v3Url":props="{ username: 'JohnDoe', theme: 'dark' }"/>
</template><script>
export default {data() {return {$v3Url: "https://subapp.example.com",};},
};
</script>
  • 子应用 :子应用可以通过 window.$wujie.props 获取主应用传递的参数。window.$wujie 这个属性,是wujie自动注入到子应用的windo上的,不需要你做任何操作
const props = window.$wujie?.props;
console.log(props.username); // 输出:JohnDoe
console.log(props.theme);    // 输出:dark
  1. 路由跳转

其实就是主应用通过Props传递一个给子应用,子应用触发主应用的函数实现路由跳转。当然,你也可以将整个路由对象传递给子应用,让子应用实现自定义跳转

  • 主应用
<template><!-- 子应用 A --><wujie-vue name="A" url="//hostA.com" :props="{jump}" ></WujieVue>
</template><script>
export default {methods: {jump(location) {this.$router.push(location);}
}
</script>
  • 子应用
// 子应用 A 点击跳转处理函数
function handleJump() {window.$wujie?.props.jump({ path: "/pathB" });
}
  1. 应用通信

Wujie 提供了 bus 作为事件总线,主应用和子应用都可以通过它来发送和接收事件。

  • 主应用 :主应用监听和发送事件
<template><WujieVuewidth="100%"height="100%"name="about-vue":url="$v3Url"/><button @click="sendMessageToChild">发送消息到子应用</button>
</template><script>
export default {methods: {sendMessageToChild() {window.$wujie?.bus?.$emit("message-from-main", {msg: "Hello from Main App",});},},mounted() {window.$wujie?.bus?.$on("message-from-child", (data) => {console.log("收到子应用消息:", data);});},
};
</script>
  • 子应用 :子应用监听和发送事件
if (window.$wujie?.bus) {// 监听主应用的消息window.$wujie.bus.$on("message-from-main", (data) => {console.log("收到主应用消息:", data);});// 发送消息到主应用window.$wujie.bus.$emit("message-from-child", {msg: "Hello from Child App",});
}

部署

wujie的部署和普通项目部署没有区别,只是子应用需要配置nginx来允许跨域访问

  • 主应用nginx配置
location / {index index.html;try_files $uri /index.html;}
  • 子应用nginx配置
location / {index index.html;try_files $uri /index.html;# 添加跨域头add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";add_header Access-Control-Allow-Headers "Content-Type, Authorization";if ($request_method = OPTIONS) {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";add_header Access-Control-Allow-Headers "Content-Type, Authorization";return 204;}}

踩坑总结

  1. UI组件库样式丢失——增加patchElementHook插件
 <WujieVuewidth="100%"height="100%"name="xxx":url:props="{ jump }":plugins="[{patchElementHook(element, iframeWindow) {if (element.nodeName === "STYLE") {element.insertAdjacentElement = function (_position, ele) {iframeWindow.document.head.appendChild(ele);};}},}]"></WujieVue>
  1. el-select 位置偏移以及 el-table tootip 位置偏移的问题

持续更新中

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

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

相关文章

【数据可视化-11】全国大学数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

141.《mac m1安装mongodb详细教程》

文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…

frameworks 之 Winscope 工具

frameworks 之 Winscope 工具 1. 手机端开启2. 加载追踪的文件2.1 Android12 3. 分析文件 Winscope 是一款 Web 工具&#xff0c;可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文…

在日期字段中自动插入斜杠“/”的最佳方法是什么

我正在尝试向输入日期字段添加功能&#xff0c;以便当用户输入数字时&#xff0c;自动添加斜杠“/”。 所以假设我有以下 html&#xff1a; <input type"text" id"fooDate" />假设我有以下 javascript&#xff1a; var dateField document.getElem…

极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现

极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现 目录 极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现1. 极限学习机 (ELM) 算法概述1.1 单隐层前馈神经网络1.2 ELM的优势2. ELM的核心技术2.1 模型定义2.2 随机初始化2.3 最小二乘法2.4…

【姿态估计实战】使用OpenCV和Mediapipe构建锻炼跟踪器【附完整源码与详细说明】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

nvm如何安装

一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同&#xff0c;而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题&#xff0c;它可以在同一台机器上下管理多个 node 版本&#xff0c;使得程序员可以轻松地安装、卸载和切换不同的 node 版本。 在下载和配…

cityhash–对字符串的哈希算法

原文地址&#xff1a;cityhash–对字符串的哈希算法 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 分享一个给字符串计算hash的开源库&#xff0c;谷歌出品。 源代码在&#xff1a;https://github.com/google/cityhash 可以自己下载&#x…

spring cloud微服务分布式架构

spring cloud微服务分布式架构 应用架构 单体应用架构&#xff1a;all in one 如&#xff1a;前端后端部署在一台服务器中 web应用和数据库放在同一台服务器中&#xff0c;只要服务器挂掉&#xff0c;应用就会终止。 分布式架构&#xff1a;将一个系统拆分为多个独立的组件&…

【HarmonyOS】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置Resiza…

深入Android架构(从线程到AIDL)_12 Android UI 单线程程序

目录 6、 Android UI 单线程程序 單線程程序概念 单线程可避免线程安全问题 SurfaceView与非UI线程 6、 Android UI 单线程程序 單線程程序概念 单线程程序意谓着两个(或多个)线程不能共享对象或变量值。Android的UI是单线程程序的环境。UI控件(如Button等)都是由UI线程所…

STM32-笔记36-ADC(模拟/数字转换器)

一、什么是ADC&#xff1f; 全称&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器。 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12 位 ADC 是一种逐次逼近型模拟数字转换器&#xff08;0…

房产销售系统(源码+数据库+文档)

亲测完美运行带论文&#xff1a;文末获取源码 文章目录 项目简介&#xff08;论文摘要&#xff09;运行视频包含的文件列表&#xff08;含论文&#xff09;前端运行截图后端运行截图 项目简介&#xff08;论文摘要&#xff09; 随着科学技术的飞速发展&#xff0c;各行各业都在…

游戏社交趋势下,游戏语音再升级!

如今&#xff0c;游戏已成为我们社交生活的一个重要娱乐方式&#xff0c;春节临近&#xff0c;与亲朋好友一起畅玩“开黑”无疑是节假日的一大乐趣。在游戏社交互动中&#xff0c;“游戏语音”不可或缺。在传统游戏语音领域&#xff0c;多人在线游戏如 MOBA、FPS 和 MMORPG 的实…

HTML5实现好看的博客网站、通用大作业网页模板源码

HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码&#xff0c;博客网站源码&#xff0c;HTML模板源码&#xff0…

ArcGIS中怎么把数据提取到指定范围(裁剪、掩膜提取)

最近&#xff0c;经常能收到怎么把数据提取到指定范围、栅格数据怎么裁剪、矢量数据怎么裁剪、栅格数据怎么掩膜提取的咨询。 下面是我对这个问题的解决思路&#xff1a; 对于矢量数据&#xff1a; ①首先把数据加载进来 ②软件界面上面的工具栏找到→地理处理→裁剪&#x…

PHP 使用集合 处理复杂数据 提升开发效率

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

(转)rabbitmq怎么保证消息不丢失?

RabbitMQ 可以通过以下多种机制来保证消息不丢失&#xff1a; 生产阶段 - 持久化队列和交换器&#xff1a; - 在声明队列和交换器时&#xff0c;将 durable 参数设置为 true &#xff0c;确保它们是持久化的。这样&#xff0c;即使 RabbitMQ 节点重新启动&#xff0c;队列和交…

node.js内置模块之---stream 模块

stream 模块的作用 在 Node.js 中&#xff0c;stream 模块是一个用于处理流&#xff08;stream&#xff09;的核心模块。流是一种处理数据的抽象方式&#xff0c;允许程序处理大量数据时不会一次性将所有数据加载到内存中&#xff0c;从而提高性能和内存效率。通过流&#xff0…

手持PDA终端,提升零售门店管理效率

随着科技的不断进步和零售行业的持续发展&#xff0c;手持PDA终端的应用将会越来越广泛。它将不断融合更多先进的技术和功能&#xff0c;为零售门店管理带来更加便捷、高效、智能的解决方案。 手持PDA终端是集成了数据处理、条码扫描、无线通信等多种功能于一体的便携式设备‌…