微前端之使用无界创建一个微前端项目

  • wujie 使用手册
    • 使用简介
      • 主应用配置
        • 安装 wujie依赖
        • main.js配置
          • 是否开启预加载
        • 生命周期函数 – lifecycle.js配置
      • 子应用配置
        • 跨域设置
        • 运行模式
          • 生命周期改造
      • 在主应用中,使用wujie,将子应用引入到主应用中去

wujie 使用手册

在这里插入图片描述

wujie 是一个基于 Web Component 容器 + iframe 沙箱的微前端方案

能够完善的解决适配成本、样式隔离、运行性能、页面白屏、子应用通信、子应用保活、多应用激活、vite 框架支持、应用共享等问题。

无界支持多种项目的接入,如 react、vue 等

使用简介

主应用不限技术栈,只需引入 wujie、配置子应用路由并启动 wujie 即可。

wujie 针对 React 和 Vue 框架分别提供了 wujie-react wujie-vue2 wujie-vue3 依赖。

这里以 Vue2 为例。

主应用配置
安装 wujie依赖
pnpm i wujie -S# vue2 框架
pnpm add wujie-vue2# vue3 框架
# pnpm add wujie-vue3# react 框架
# pnpm add wujie-react
main.js配置
// main.jsimport Vue from 'vue'
import App from './App.vue'//引入无界微前端
// vue2
import WujieVue from "wujie-vue2";
// vue3
// import WujieVue from "wujie-vue3";import lifecycles from "../config/lifecycle";
const { setupApp, preloadApp, bus } = WujieVue;
Vue.use(WujieVue);
// const props = {
//     jump: (name) => {
//         router.push({ name });
//     },
// };//设置子应用demo
setupApp({name: "vue3Child1",url: "http://localhost:5173/",exec: true,// props,fetch: function fetch(url, options) {//console.log("fetch.url:=",url,options)return window.fetch(url, { ...options, credentials: "omit" });},...lifecycles,
});// 预加载
//preloadApp({
//    name: "demo",
//});Vue.config.productionTip = falsenew Vue({render: h => h(App),
}).$mount('#app')
是否开启预加载

注意:setupApp 设置子应用的name和 preloadApp 设置的name要一致。

预加载优势:预加载,可以极大的提升子应用首次打开速度

预加载劣势:

  • 资源的预加载会占用主应用的网络线程池
  • 资源的预执行会阻塞主应用的渲染线程

一般来说,如果不是很介意打开的首屏时间,这里预加载可以不用加。

生命周期函数 – lifecycle.js配置
const lifecycles = {beforeLoad: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeLoad 生命周期`),beforeMount: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeMount 生命周期`),afterMount: (appWindow) => console.log(`${appWindow.__WUJIE.id} afterMount 生命周期`),beforeUnmount: (appWindow) => console.log(`${appWindow.__WUJIE.id} beforeUnmount 生命周期`),afterUnmount: (appWindow) => console.log(`${appWindow.__WUJIE.id} afterUnmount 生命周期`),activated: (appWindow) => console.log(`${appWindow.__WUJIE.id} activated 生命周期`),deactivated: (appWindow) => console.log(`${appWindow.__WUJIE.id} deactivated 生命周期`),loadError: (url, e) => console.log(`${url} 加载失败`, e),
};
export default lifecycles;

无界提供一整套的生命周期钩子供开发者调用

如果子应用没有做生命周期的改造,那么 beforeMount、afterMount、beforeUnmount、afterUnmount 这四个生命周期将不会调用

子应用配置
跨域设置

子应用改造,无界对子应用的侵入非常小,在满足跨域条件下子应用可以不用改造。

子应用的资源和接口的请求都在主域名发起,所以会有跨域问题。

所以这里,主应用和子应用,建议使用nginx进行代理,解决跨域的问题。

//主应用
location /main {proxy_set_header Host    $host;proxy_pass http://127.0.0.18080;
}//子应用
location /demo {proxy_set_header Host    $host;proxy_pass http://127.0.0.18081;
}
运行模式

无界有三种运行模式:单例模式保活模式重建模式

其中保活模式、重建模式子应用无需做任何改造工作,单例模式需要做生命周期改造

生命周期改造

改造入口函数:

将子应用路由的创建、实例的创建渲染挂载到window.__WUJIE_MOUNT函数上
将实例的销毁挂载到window.__WUJIE_UNMOUNT上
如果子应用的实例化是在异步函数中进行的,在定义完生命周期函数后,请务必主动调用无界的渲染函数 window.__WUJIE.mount()

vue2

if (window.__POWERED_BY_WUJIE__) {let instance;window.__WUJIE_MOUNT = () => {const router = new VueRouter({ routes });instance = new Vue({ router, render: (h) => h(App) }).$mount("#app");};window.__WUJIE_UNMOUNT = () => {instance.$destroy();};
} else {new Vue({ router: new VueRouter({ routes }), render: (h) => h(App) }).$mount("#app");
}

vue3

if (window.__POWERED_BY_WUJIE__) {let instance;window.__WUJIE_MOUNT = () => {const router = createRouter({ history: createWebHistory(), routes });instance = createApp(App);instance.use(router);instance.mount("#app");};window.__WUJIE_UNMOUNT = () => {instance.unmount();};
} else {createApp(App).use(createRouter({ history: createWebHistory(), routes })).mount("#app");
}
在主应用中,使用wujie,将子应用引入到主应用中去

经过上面主应用和子应用的改造之后,就可以再主应用中,使用wujie,将子应用引入到主应用中去。

主应用,有这样的一个vue组件

wujieDemo.vue 页面使用WujieVue引用目标项目的页面

// wujieDemo.vue
<template> <WujieVuewidth="100%"height="100%"name="vue3Child1":url="vue3Child1Url"/>
</template><script>export default {data() {return {vue3Child1Url: 'http://localhost:5173/',}},
</script>

注意,上面 WujieVue 使用的name要和 setupApp 设置的name,要对应。

参考文档:

https://juejin.cn/post/7262347509951889467

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

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

相关文章

Python实现简单的读文字发音

使用pyttsx3包&#xff0c;先安装。 核心代码&#xff1a;engine pyttsx3.init() # 初始化 uname "周吴郑王" engine.say("奥利给给给" str(uname) "的" str(uname) "&#xff0c;感谢&#xff01;&#xff01;&#xff01;") e…

Day22:安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

目录 开发环境 数据导入-mysql架构&库表列 数据库操作-mysqli函数&增删改查 数据接收输出-html混编&超全局变量 第三方插件引用-js传参&函数对象调用 完整源码 思维导图 PHP知识点&#xff1a; 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0…

基于Spring Boot的图书个性化推荐系统 ,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1765769136268455938

C#,动态规划的集合划分问题(DP Partition problem)算法与源代码

1 动态规划问题中的划分问题 动态规划问题中的划分问题是确定一个给定的集是否可以划分为两个子集&#xff0c;使得两个子集中的元素之和相同。 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是运筹学的一个分支&#xff0c;是求解决策过程最优化的过程…

macbook pro 2018 安装 arch linux 双系统

文章目录 友情提醒关于我的 mac在 mac 上需要提前做的事情复制 wifi 驱动 在 linux 上的操作还原 wifi 驱动连接 wifi 网络磁盘分区制作文件系统挂载分区 使用 archinstall 来安装 arch linux遗留问题 友情提醒 安装 archl linux 的时候&#xff0c;mac 的键盘是没法用的&#…

【开源】JAVA+Vue.js实现创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…

解读电影级视频生成模型 MovieFactory

Diffusion Models视频生成-博客汇总 前言&#xff1a;MovieFactory是第一个全自动电影生成模型&#xff0c;可以根据用户输入的文本信息自动扩写剧本&#xff0c;并生成电影级视频。其中针对预训练的图像生成模型与视频模型之间的gap提出了微调方法非常值得借鉴。这篇博客详细解…

匈牙利算法

匈牙利算法&#xff1a;是一种在多项式时间内求解任务分配问题的组合优化算法&#xff0c;并推动了后来的原始对偶方法 时间复杂度&#xff1a;O(nm) 适用场景&#xff1a;二分图的最大匹配 核心思想&#xff1a;增广路径&#xff0c;即当左边集合的点1匹配右边的点2为已匹配…

IPv6扩展头(四)——分片头

分片头部&#xff08;Fragment Header&#xff09;用于IPv6源节点向目的节点发送一个大于路径MTU的数据报。 一、优势 IPv6 分片头具有多种优势&#xff0c;可提高网络效率&#xff0c;包括减少数据包延迟和减少网络拥塞。使用 IPv6 分片头&#xff0c;数据包在源处而不是中间…

光谱整形1

华为张德江&#xff1a;下一代光传送网将走向400G80波WDM系统_通信世界网 (cww.net.cn) 张德江指出&#xff0c;400G WDM系统具有三大基本特征&#xff1a;支持400G80波&#xff0c;单纤32T超大容量&#xff0c;传输距离与100G相当&#xff1b;支持32维以上的光交叉&#xff1…

Python实例☞数据类型及运算符案例

实例一&#xff1a; ❶要求☞从键盘获取一个4位整数&#xff0c;并分别输出个、十、百、千位 ❷程序代码☞ ①第一种方法 print(请输入一个4位整数&#xff1a;) xeval(input()) print(个位数为&#xff1a;,x%10) print(十位数为&#xff1a;,(x//10)%10) print(百位数为&am…

4.1k star,官方出品的redis桌面管理工具——redislnsight

导航 令人抓狂的大key加载RedisInsight 简介RedisInsight的亮点GitHub 地址安装和使用RedisInsight 下载安装 使用RedisInsight redis数据库可视化直观的CLI&#xff08;Command-Line Interface&#xff09;日志分析和命令分析 结语参考 令人抓狂的大key加载 工欲善其事必先利…