无界微前端项目实战


前言

  • 微前端框架:无界 wujievue 微前端是什么 | 无界
  • 主应用:Vue 2 + elementui
  • 子应用:Vue 3+vite+element plus

前提

  • 子应用的资源和接口的请求都在主域名发起,所以会有跨域问题,子应用必须做cors 设置
  • vue3+vite 项目跨域配置参考
// vite.config.js
export default defineConfig({// 其它配置...server: {proxy: {'^/api': {target: '协议地址端口', //目标源,目标服务器,真实请求地址changeOrigin: true, //支持跨域rewrite: (path) => path.replace(/^\/api/, "/api"), //重写真实路径,替换/api}}}
})

快速上手

S1. 安装 wujievue
# vue2 框架
npm i wujie-vue2 -S
# vue3 框架
npm i wujie-vue3 -S
S2 . 主应用设置
  1. main.js 引入 wujiwvue
import WujieVue from "wujie-vue2";Vue.use(WujieVue);
  1. 创建一个 vue组件并使用 wujievue
<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>
  • wujievue Props 说明 setupApp | 无界
{ /** 唯一性用户必须保证 */ name: string; /** 需要渲染的url */ url: string;/** 需要渲染的html, 如果用户已有则无需从url请求 */ html?: string; /** 代码替换钩子 */ replace?: (code: string) => string; /** 自定义fetch */ fetch?: (input: RequestInfo, init?: RequestInit) => Promise<Response>; /** 注入给子应用的属性 */ props?: { [key: string]: any }; /** 自定义运行iframe的属性 */ attrs?: { [key: string]: any }; /** 自定义降级渲染iframe的属性 */ degradeAttrs?: { [key: string]: any }; /** 子应用采用fiber模式执行 */ fiber?: boolean; /** 子应用保活,state不会丢失 */ alive?: boolean; /** 子应用采用降级iframe方案 */ degrade?: boolean; /** 子应用插件 */ plugins?: Array<plugin>; /** 子应用生命周期 */ beforeLoad?: lifecycle; beforeMount?: lifecycle; afterMount?: lifecycle; beforeUnmount?: lifecycle; afterUnmount?: lifecycle; activated?: lifecycle; deactivated?: lifecycle; loadError?: loadErrorHandler; 
};
S3 子应用设置
  1. main. js 改造

将原项目中的
const app = createApp (App);
app.use (pinia). use (router);
app.mount (" #app ");
改造为如下格式

if (window.__POWERED_BY_WUJIE__) {let app;window.__WUJIE_MOUNT = () => {app = createApp(App).use(router).use(pinia);app.mount("#app");};window.__WUJIE_UNMOUNT = () => {app.unmount();};// module脚本异步加载,应用主动调用生命周期window.__WUJIE.mount();} else {const app = createApp(App);app.use(pinia).use(router);app.mount("#app");
}

数据通信

props 通信
  • 主应用可以通过 props 注入数据和方法:
<WujieVue name="xxx" url="xxx" :props="{ data: xxx, methods: xxx }"></WujieVue>
  • 子应用可以通过 $wujie 来获取:
const props = window.$wujie?.props; // {data: xxx, methods: xxx}
windows 通信

由于子应用运行的 iframesrc 和主应用是同域的,所以相互可以直接通信

  • 主应用调用子应用的全局数据
window.document.querySelector("iframe[name=子应用id]").contentWindow.xxx;
  • 子应用调用主应用的全局数据
window.parent.xxx;
eventBus 通信

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

  • 主应用使用方式:
// 如果使用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, ...) {});

疑难杂症

问题1: 子应用中 Element plus 冒泡系列组件(比如下拉框 Select)弹出位置不正确

解决方案: 将子应用将 body 设置为 position: relative 即可


问题2: 子应用点击事件频繁报错: [Vue warn]: Invalid event arguments: event validation failed for event "click"

解决方案: 使用 wujie-polyfill 提供的插件解决 Site Unreachable

  1. 安装 wujie-polyfill npm i wujie-polyfill -S
  2. 给无界 <WujieVue> 组件添加 plugins 属性
<WujieVuewidth="100%"height="100%"name="xxx":url="xxx":plugins=“[InstanceofPlugin()]”
></WujieVue>
// script 中引入
import { InstanceofPlugin } from "wujie-polyfill";

问题3: 子应用中滚动事件失效,导致 sticky 样式失效,el-backtop 等组件失效

解决方案: 为子应用中的根元素设置样式 style="position: relative; height: calc(100vh - 120px); overflow-y: scroll"

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

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

相关文章

爬取B站评论:Python技术实现详解

引言 在当今信息爆炸的互联网时代&#xff0c;用户生成的内容不断涌现&#xff0c;其中包括了各种各样的评论。而B站作为一个充满活力的视频分享平台&#xff0c;其评论区更是一个充满了各种各样精彩评论的宝藏地。那么&#xff0c;有没有一种简单的方法可以将这些评论收集起来…

大模型日报2024-05-03

大模型日报 2024-05-03 大模型资讯 马克扎克伯格宣布Meta发布Llama 3大型语言模型的重大AI新闻 摘要: Meta公司在周四发布了其Llama 3大型语言模型的首两个版本。该模型是Meta AI的动力核心&#xff0c;马克扎克伯格称其为“未来的...”。这一进展标志着Meta在人工智能领域的进…

深度学习心得

1. KL loss 其经常要与softmax一起使用&#xff0c;就是为了学习one-hot分布 2. 降维 Pooling层的作用是增加模型的鲁棒性&#xff0c;让模型对输入的少量变化不那么敏感。 如果真想通过降维&#xff0c;减少模型训练参数&#xff0c;那应该用PCA降维方法&#xff0c; skl…

Java中new一个对象内存区域如何变化?顺序是什么?

Java中new一个对象内存区域如何变化&#xff1f;顺序是什么&#xff1f; 如果你对Java内存区域了解的话&#xff0c;那么肯定会知道&#xff0c;创建对象如果是第一次的话&#xff0c;首先肯定是要加载对应的Class&#xff08;要创建对象的类&#xff09;,加载的类信息就是放在…

贪心-耍杂技的牛

问题描述 农民约翰的 N头奶牛&#xff08;编号为 1…N&#xff09;计划逃跑并加入马戏团&#xff0c;为此它们决定练习表演杂技。 奶牛们不是非常有创意&#xff0c;只提出了一个杂技表演&#xff1a; 叠罗汉&#xff0c;表演时&#xff0c;奶牛们站在彼此的身上&#xff0c;形…

Django之配置数据库

一&#xff0c;创建项目 二&#xff0c;将项目的setting.py中的 DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite3,} }替换成如下&#xff08;以mysql为例&#xff09; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: …

力扣---二叉树的锯齿形层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,…

基于深度学习神经网络的AI图片上色DDcolor系统源码

第一步&#xff1a;DDcolor介绍 DDColor 是最新的 SOTA 图像上色算法&#xff0c;能够对输入的黑白图像生成自然生动的彩色结果&#xff0c;使用 UNet 结构的骨干网络和图像解码器分别实现图像特征提取和特征图上采样&#xff0c;并利用 Transformer 结构的颜色解码器完成基于视…

PDF Shaper Ultimate 免安装中文破姐版 v14.1

软件介绍 PDF Shaper是一套完整的多功能PDF编辑工具&#xff0c;可实现最高的生产力和文档安全性。它允许你分割&#xff0c;合并&#xff0c;水印&#xff0c;署名&#xff0c;优化&#xff0c;转换&#xff0c;加密和解密您的PDF文件&#xff0c;也可插入和移动页&#xff0…

数字化思维的目的与价值,你真的懂吗?

在这个数字时代&#xff0c;数字化思维正逐渐成为企业和个人的能力。那么&#xff0c;数字化思维究竟以什么为中心&#xff1f;为了达成什么目的&#xff1f;又具有怎样的价值呢&#xff1f;让我们一起来揭开这个神秘的面纱。 数字化思维以数据为中心。数据成为了决策的关键依据…

Python系列一之excel的读取

这里我常用的 python 对于 excel 的读取库有两个&#xff0c;一个是 xlsxwriter 用于操作 excel 的写入&#xff0c;一个是 xlrd 用于 excel 文件的读取。 使用的库的版本如下&#xff1a; xlsx1.2.6xlrd1.1.0 xlsxwriter 写入 excel 新建一个 excel import xlsxwriterpat…

C语言实验-学生信息管理系统

按以下菜单界面编写学生信息管理系统&#xff1b; 1&#xff09;录入学生信息首先输入学生人数&#xff0c;然后根据学生人数开辟动态数组&#xff1b; 2&#xff09;学生信息包括学号、姓名、性别、三门课成绩、总分&#xff1b;其中学号、姓名、 性别、三门课成绩是需要从键盘…

初始《stack》《queue》及手搓模拟《stack》《queue》

目录 前言&#xff1a; stack的介绍和使用 stack的介绍&#xff1a; ​编辑stack的使用&#xff1a; ​编辑stack的模拟实现&#xff1a; queue的介绍和使用 queue的介绍&#xff1a; queue的使用: queue的模拟实现: priority_queue的介绍和使用 priority_queue的介绍:…

mysql先行笔记

mysql笔记 数据库&#xff1a;DataBase 简称&#xff1a;DB 按照一定格式存储数据的一些文件的组合 数据库管理系统&#xff1a; DataBaseManagement,简称&#xff1a;DBMS 专门用来管理数据库中的数据&#xff0c;可以对数据库中的数据进行增删改查 常见的数据库管理系统&am…

Hdfs小文件治理策略以及治理经验

小文件是 Hadoop 集群运维中的常见挑战&#xff0c;尤其对于大规模运行的集群来说可谓至关重要。如果处理不好&#xff0c;可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要&#xff0c;说HDFS 存储小文件…

08 - 步骤 表输出

简介 表输出&#xff08;Table Output&#xff09;步骤是用于将 Kettle 中的数据写入关系型数据库表的步骤。它允许用户将数据流中的数据插入、更新或删除到目标数据库表中。 使用 场景 我要将处理完的数据流中的sysOrgCode 跟 plateNumber 保存记录到mysql 1、拖拽表输出…

Java Jackson-jr 库使用介绍

介绍 Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API&#xff0c;Jackson-jr 的启动速度更快&#xff0c;包大小更小。 虽然Jackson databind&#xff08;如ObjectMapper&#xff09;是通用数据绑定的良好选择…

QT, 查看局域网在线主机网卡的出厂商

如题 &#xff0c; 通过QProcess获取到的局域网mac地址&#xff0c;使用QNetworkReply &#xff08;记得要QT network&#xff09;可以获取其对应的生产产商&#xff08;将mac地址传入某专门查询mac地址厂商的网站&#xff0c;并分析其返回值&#xff0c;获得结果&#xff0c;…

初学python记录:力扣1235. 规划兼职工作

题目&#xff1a; 你打算利用空闲时间来做兼职工作赚些零花钱。 这里有 n 份兼职工作&#xff0c;每份工作预计从 startTime[i] 开始到 endTime[i] 结束&#xff0c;报酬为 profit[i]。 给你一份兼职工作表&#xff0c;包含开始时间 startTime&#xff0c;结束时间 endTime …

001 登录(md5加密)

文章目录 pom.xmlLoginController.javaUserMapper.javaUser.javaUserServiceImpl.javaUserService.javaMD5Util.javaMD5UtilTest.javaValidatorUtil.javaLoginVo.javaRespBean.javaRespBeanEnum.javaSeckillApplication.javaUserMapper.xmllogin.htmlapplication.yamlsql 传统方…