微前端qiankun框架的使用

文章描述

隨著工作時間的增加,發現公司的項目逐漸多了起來,有一個項目比較龐大,是需要集成多個子系統而形成的大項目。其中便是使用微前端的概念qiankun框架來集成其他多個子項目的。接下來,一起來看一下qiankun框架的具體使用方法吧。

更具體的使用方法請參考qiankun官網

主要內容
主應用
下載依賴

npm i qiankun -S

我們只需要再主應用中下載即可,需要注意的是,下載當前的依賴對node的版本也有限制,我第一次安裝就踩坑了

要求的node版本是"^12.22.0 || ^14.17.0 || >=16.0.0"之內,不能高不能低,挺無語的哈...

添加配置

在main.js文件夾同級下創建registerApp.js文件(重要)

import { registerMicroApps, start } from 'qiankun';// 配置加載中的鉤子函數
const onLoad = ()=>{console.log("加載中");
}
registerMicroApps([{name: 'appChild', // 子程序的name名,對應的是子程序中package中的name名字,唯一的entry: '//localhost:3002', // 子程序的路徑,就是訪問子程序的路徑container: '#container',   // 希望將子應用放在哪個容器內activeRule: '/ortherSystem', // 子程序的路由匹配規則,如當主程序中訪問路由/ortherSystem時,框架會自動將子應用的內容加載到上面的容器內loader:onLoad,   // 當前子應用加載時運行的函數props:{          // 希望給子應用傳遞的值,在子應用暴露出的mount等函數中可拿到text:"你好,我是主應用"  }}
],{beforeLoad:()=>{console.log("加載前");},beforeMount:()=>{console.log("掛載前");},afterMount:()=>{console.log("掛載后");},beforeUnmount:()=>{console.log("銷毀前");},afterUnmount:()=>{console.log("銷毀后");},
});start({sandbox: {strictStyleIsolation: true, // 開啟shadow dom樣式隔離模式},
});

當然如果,如果我們需要手動添加子應用程序時,可以用下面這個函數,這個函數可以讓我們在某個js函數中加載子應用。

import { loadMicroApp } from 'qiankun';loadMicroApp({name: 'app',entry: '//localhost:7100',container: '#yourContainer',
});

對了,當前創建的文件記得要在main.js文件中引入哦

打包配置

在vue.config.js中也需要添加相關的打包配置

const { defineConfig } = require('@vue/cli-service')
const packageName = require('./package.json').name;
module.exports = defineConfig({devServer: {host:'localhost',port:3001,headers:{'Access-Control-Allow-Origin':'*',},publicPath:'./',configureWebpack:{output: {library: `${packageName}`,libraryTarget: 'umd',chunkLoadingGlobal: `webpackJsonp_${packageName}`,},}
})

請注意'Access-Control-Allow-Origin':'*'配置一定需要,要不會有跨域錯誤。

子應用

子應用中不需要下載相關的依賴,只需要安裝要求進行配置即可

配置main.js

根據官網要求,我們需要在子應用的main.js文件中添加并導出幾個函數,分別是bootstrap,mount,unmount等函數。main.js的文件具體寫法如下,被我改造了一下

import { createApp } from 'vue'
import App from './App.vue'// 引入路由
import router from './router/router'let app = null;
const render = (props)=>{app = createApp(App);app.use(router);app.use(ElementPlus);app.mount(props && props.container ? props.container.querySelector("#app") : '#app');
}
/*** bootstrap 只會在微應用初始化的時候調用一次,下次微應用重新進入時會直接調用 mount 鉤子,不會再重復觸發 bootstrap。* 通常我們可以在這里做一些全局變量的初始化,比如不會在 unmount 階段被銷毀的應用級別的緩存等。*/
export async function bootstrap(props) {console.log(props,'props app bootstraped');
}// 這個變量是qiankun框架暴露給全局的,判斷當前應用是否使用qiankun框架了
if(!window.__POWERED_BY_QIANKUN__){render()
}
/*** 應用每次進入都會調用 mount 方法,通常我們在這里觸發應用的渲染方法*/
export async function mount(props) {console.log(props,"props");render(props)
}
/*** 應用每次 切出/卸載 會調用的方法,通常在這里我們會卸載微應用的應用實例*/
export async function unmount(props) {app.unmount()app = null;
}/*** 可選生命周期鉤子,僅使用 loadMicroApp 方式加載微應用時生效*/
export async function update(props) {console.log('update props', props);
}
添加文件

創建public-path.js、.env.development、.env.production等文件

1、.env.development

VUE_APP_PORT = 3002

2、env.production

VUE_APP_PORT = 3002

3、public-path.js(該文件主要用于動態修改publicPath屬性)

(function() {if (window.__POWERED_BY_QIANKUN__) {if(process.env.NODE_ENV	 === 'development') {__webpack_public_path__ = `//localhost:${process.env.VUE_APP_PORT}${process.env.BASE_URL}`;return;}__webpack_public_path__ = window.INJECTED_PUBLIC_PATH_BY_QIANKUN__;}
})();

該文件記得在main.js中引入哦

打包配置

1、在package.json文件中,將name修改為主應用中注冊所使用的name名。

2、在路由配置中,將路由的baseUrl改成主應用中注冊的路由規則的值,如:

// 我得主應用的路由規則為 /ortherSystem
const routerHistory = createWebHistory('/ortherSystem')

3、在vue.config.js里面配置

const { defineConfig } = require('@vue/cli-service')
const packageName = require('./package.json').name;module.exports = defineConfig({devServer: {host: 'localhost',headers:{'Access-Control-Allow-Origin':'*',},port: process.env.VUE_APP_PORT,},configureWebpack:{output: {library: `${packageName}`,libraryTarget: 'umd',chunkLoadingGlobal: `webpackJsonp_${packageName}`,},}
})
運行結果

好了,進行了上面的幾步后我們應該就可以看到基本的效果了,

?

?報錯經歷

1、node版本不匹配,這是我們需要換適合的node版本了,推薦是"^12.22.0 || ^14.17.0 || >=16.0.0"之間。

?2、當我們的主應用和子應用都準備好了,但是效果還是不出來,查看控制臺發現是跨域了,這是因為端口后ip不同,我們需要再vue.config.js文件的devServer下添加相關配置

 headers:{'Access-Control-Allow-Origin':'*',},

3、?子應用中路由不匹配,子應用中匹配好的路由,子應用單獨啟動能正常跳轉,但是使用qiankun框架使用就無法正常匹配了,報404未找到頁面

這大概率是因為你在主應用中將添加子應用的容器使用router-view這個標簽渲染了,我們不要用這個標簽,可以的話在組件中直接引入渲染即可

<template><!-- 不要要用這種方法 --><!-- <router-view></router-view> --><!-- 用這種方法渲染homePage組件,子應用的容器就在homePage組件中 --><homePage></homePage>
</template><script setup>
import homePage from '@/components/homePage.vue'
</script>

4、?樣式問題,在子應用中樣式是正常的,但是在主應用中,子應用的樣式丟失了,而且在我還設置了strictStyleIsolation: true模式,樣式還是很神奇的消失了,

網上查詢了好多方法,最后用審查元素查看發現子應用也正常被shadow-root包裹起來了,結果發現是子應用中,掛載元素時自己寫錯了,在子應用中的render函數應該這樣寫

let app = null;
const render = (props)=>{app = createApp(App);app.use(router);app.use(ElementPlus);// 錯誤// app.mount(props && props.container ? props.container : '#app');// 正常app.mount(props && props.container ? props.container.querySelector("#app") : '#app');
}

props是qiankun框架提供的參數,里面包含了我們注冊時提供的子應用名和主應用中要掛載的容器,但是我們不能直接將子應用掛載到props.container容器中,這樣會將里面內置的標簽屬性給覆蓋掉,導致樣式不生效

?

最終感想

這只是qiankun框架的基本使用方式,具體的方法和更多詳情可以去官網查看,官網寫的很清楚的,當前屬于我個人的筆記,也希望通過這篇文章可以幫到同行的朋友

如果以上寫的內容有什么錯誤的地方,歡迎各位大佬來指點,我發現后一定盡快修改

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73169.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于CVX優化器的儲能電池調峰調頻算法matlab仿真

目錄 1.課題概述 2.系統仿真結果 3.核心程序與模型 4.系統原理簡介 4.1 原理概述 4.2 CVX工具箱概述 5.完整工程文件 1.課題概述 基于CVX優化器的儲能電池調峰調頻算法matlab仿真。CVX 是一種用于求解凸優化問題的強大工具。凸優化問題具有良好的數學性質&#xff0c;能…

回歸——數學公式推導全過程

文章目錄 一、案例引入 二、如何求出正確參數 1. 最速下降法 1&#xff09;多項式回歸 2&#xff09;多重回歸 2. 隨機梯度下降法 一、案例引入 以Web廣告和點擊量的關系為例來學習回歸&#xff0c;假設投入的廣告費和點擊量呈現下圖對應關系。 思考&#xff1a;如果花了…

微服務中的服務發現

微服務中的服務發現 什么是服務發現 服務發現是微服務架構中的關鍵機制&#xff0c;用于確定各個微服務的地址。例如&#xff0c;在一個 API Server 服務中&#xff0c;我們可能需要調用 User 服務來處理用戶注冊、登錄和信息查詢&#xff0c;也可能需要 Product 服務來獲取商…

C#與西門子PLC的六大通信庫

C#與西門子PLC的六大通信庫&#xff1a; 一、S7.NET S7.NET是一款開源的S7協議通信庫&#xff0c;支持西門子S7通信。 二、Sharp7 Sharp7與S7.NET一樣&#xff0c;是一款.NET版本的S7通信庫。 三、Snap7 Snap7是一個開源的C通信庫&#xff0c;支持西門子S7通信。 四、Prodave P…

IOS接入微信方法

導入SDK 和配置 SDK 的不做介紹&#xff1b; 1 在IOS 開發者中心 Identifiers 打開‘Associated Domains’ 2 建立一個文件&#xff08;不帶后綴的&#xff09;apple-app-site-association, teamid在 IOS 開發者中心的會員找&#xff0c;appid在 xcode里面找 {"applin…

DHCPv6 Stateless Vs Stateful Vs Stateless Stateful

DHCPv6常見配置模式 在 IPv6 網絡中,DHCPv6 的 Stateless(無狀態)、Stateful(有狀態) 和 Stateless + Stateful(混合模式) 是三種常見的配置模式。它們的主要區別在于客戶端如何獲取 IPv6 地址和其他網絡配置信息(如 DNS 服務器)。 Stateless(無狀態)模式 Statele…

HTTPS協議—加密算法和中間攻擊人的博弈

活動發起人小虛竹 想對你說&#xff1a; 這是一個以寫作博客為目的的創作活動&#xff0c;旨在鼓勵大學生博主們挖掘自己的創作潛能&#xff0c;展現自己的寫作才華。如果你是一位熱愛寫作的、想要展現自己創作才華的小伙伴&#xff0c;那么&#xff0c;快來參加吧&#xff01…

Java替換jar包中class文件

在更新java應用版本的運維工作中&#xff0c;由于一些原因&#xff0c;開發沒辦法給到完整的jar包&#xff0c;這個時候&#xff0c;就可以只將修改后的某個Java類的class文件替換掉原來iar包中的class文件&#xff0c;重新啟動服務即可&#xff1a; 1、將jar包和將要替換的cl…

【UI設計】一些好用的免費圖標素材網站

阿里巴巴矢量圖標庫https://www.iconfont.cn/國內最大的矢量圖標庫之一&#xff0c;擁有 800 萬 圖標資源。特色功能包括團隊協作、多端適配、定制化編輯等&#xff0c;適合企業級項目、電商設計、中文產品開發等場景。IconParkhttps://iconpark.oceanengine.com/home字節跳動…

【10】高效存儲MongoDB的用法

目錄 一、什么是MongoDB 二、準備工作 &#xff08;1&#xff09;安裝MongoDB ?&#xff08;2&#xff09;安裝pymongo庫 三、連接MongoDB 四、指定數據庫 五、指定集合 六、插入數據 &#xff08;1&#xff09; insert 方法 &#xff08;2&#xff09;insert_one(…

MATLAB+Arduino利用板上的按鍵控制板上Led燈

幾年不使用&#xff0c;之前的知識都忘掉了。需要逐步撿起來。 1 熟悉按鍵的使用 2熟悉燈的控制 1 電路 我們將通過 MATLAB 的 Arduino 支持包與 Arduino 板通信&#xff0c;讀取按鍵狀態并控制 LED 燈的亮滅。 按鍵&#xff1a;連接到 Arduino 的數字引腳&#xff08;例如…

《深度學習》——YOLOv3詳解

文章目錄 YOLOv3簡介YOLOv3核心原理YOLOv3改進YOLOv3網絡結構 YOLOv3簡介 YOLOv3&#xff08;You Only Look Once, version 3&#xff09;是一種先進的實時目標檢測算法&#xff0c;由 Joseph Redmon 和 Ali Farhadi 開發。它在目標檢測領域表現出色&#xff0c;具有速度快、精…

【項目設計】網頁版五子棋

文章目錄 一、項目介紹1.項目簡介2.開發環境3.核心技術4.開發階段 二、Centos-7.6環境搭建1.安裝wget工具2.更換軟件源(yum源)3.安裝scl工具4.安裝epel軟件源5.安裝lrzsz傳輸工具6.安裝高版本gcc/g編譯器7.安裝gdb調試器8.安裝git9.安裝cmake10.安裝boost庫11.安裝Jsoncpp庫12.…

在coze工作流中將數據回寫到飛書表格

在coze工作流中將數據回寫到飛書表格

并查集(競賽)

一、模型建立 本質就是一個數組&#xff0c;數組的下標對應節點的編號&#xff0c;數組的值對應對應編號的節點的父節點。規定根節點的父節點是自己。 規定三個集合的根節點分別是1 4 6 二、并查集操作并實現 并查集主要操作&#xff1a;查找一個節點的父節點&#xff0c;判…

Leetcode 刷題筆記1 圖論part04

leetcode 110 字符串接龍 def judge(s1, s2):count 0for i in range(len(s1)):if s1[i] ! s2[i]:count 1return count 1if __name__ __main__:n int(input())begin_str, end_str map(str, input().split())if begin_str end_str:print(0)exit()strlist []for _ in ran…

從擴展黎曼澤塔函數構造物質和時空的結構-7

有了先前關于電荷之間吸引和排斥關系的頻率分析圖&#xff0c;我們可以按照類似的方法&#xff0c;對磁場做一樣的分析&#xff0c;即分析磁體同極相斥&#xff0c;異極相吸的本質。 我們知道上圖得以成立的原因在于磁感線&#xff0c;如下圖所示的排布方式&#xff0c; 磁體的…

AI比人腦更強,因為被植入思維模型【18】萬物系統思維模型

把事物看成鏈&#xff0c;看成網&#xff0c;看成生態。 定義 萬物系統思維模型是一種將宇宙萬物視為一個相互關聯、相互作用的整體系統的思維方式。它強調從系統的角度去認識、分析和解決問題&#xff0c;認為系統中的各個要素之間存在著復雜的相互關系&#xff0c;這些關系不…

Qt-Q_ENUM宏和QMetaEnum類

Q_ENUM是一個宏定義&#xff0c;它的作用是將一個枚舉類型注冊到元對象系統&#xff0c;從而能夠通過QMetaEnum類獲得一些關于enum類型的一些信息&#xff0c;例如獲取enum類型的名稱字符串&#xff0c;enum值和字符串互相轉換&#xff0c;enum類型保存在QVariant中&#xff0c…

MongoDB 配合python使用的入門教程

MongoDB 入門教程 1. 安裝 MongoDB 首先&#xff0c;你需要在你的機器上安裝MongoDB。你可以從 MongoDB官網 下載并安裝 Community 版本。安裝完成后&#xff0c;啟動MongoDB服務。 # 在Linux/Mac上啟動MongoDB mongod# 在Windows上&#xff0c;你可以通過Windows服務啟動Mo…