使用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.pswp.cn/web/65230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65230.shtml
英文地址,請注明出處:http://en.pswp.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終端是集成了數據處理、條碼掃描、無線通信等多種功能于一體的便攜式設備?…