阿里qiankun微服務搭建

主服務 chat
vue3 ts vite 子服務 ppt
react 18 vite 子服務 agent

主服務

npm i vite-plugin-qiankun 

mian.ts


import './style/base.scss'
import 'virtual:svg-icons-register'
import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import router from './router'
import Axios from '@/utils/request.js';
import { registerMicroApps, start } from 'qiankun';
// 引入ui 庫
// import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'// 引入ui icon// 將自動注冊所有組件為全局組件
// import dataV from '@jiaminghi/data-view'const app = createApp(App)
// for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
//   app.component(key, component)
// }app.config.globalProperties.$http = Axiosapp.use(createPinia())
app.use(router)
// app.use(ElementPlus)
app.mount('#app')
registerMicroApps([{name: 'agent',entry: 'http://localhost:83/',container: '#agentContainer',activeRule: '/agent',props: {// 傳遞給子應用的數據data: {name: 'agent',age: 18,},},},{name: 'ppt',entry: 'http://localhost:5173/',container: '#pptContainer',activeRule: '/ppt',props: {// 傳遞給子應用的數據data: {name: 'ppt',age: 18,},},},
], {beforeLoad: [(app: any): any => {console.log('before load', app);// 掛載前回調}],beforeMount: [(app: any): any => {console.log('before load', app);// 掛載后回調}],afterUnmount: [(app: any): any => {console.log('before load', app);// 掛載后回調}]
})
setTimeout(() => {start({prefetch: 'all', // 預加載子應用sandbox: { experimentalStyleIsolation: true }, // 樣式隔離});// start();
}, 1);

router/index.ts

    { path: '/ppt', component: () => import('@/views/ppt/index.vue') },{ path: '/ppt/home', component: () => import('@/views/ppt/index.vue') },{ path: '/agent', component: () => import('@/views/agent/index.vue') },

agent/index.vue

<template><div id="agentContainer" style="width: 100%;height: 100%;">react</div>
</template>
<script lang="ts" setup>
</script>
<style>
#pptContainer {width: 100vw;height: 100vh;
}
</style>

ppt/index.vue

<template><div id="pptContainer" style="width: 100%;height: 100%;">zzzzzzzzz</div>
</template>
<script lang="ts" setup>
import { registerMicroApps, start } from 'qiankun';
import { onMounted } from 'vue';onMounted(() => {})</script>
<style>
#pptContainer {width: 100vw;height: 100vh;
}
</style>

vue3 ts服務
vite.cong.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import qiankun from 'vite-plugin-qiankun'// https://vite.dev/config/
export default defineConfig({base: '/ppt/', plugins: [vue(),qiankun('ppt', { // 子應用名稱,與package.json的name一致useDevMode: true // 開發模式下需要設置為true})],server: {host: "0.0.0.0",port: 5173, // 設置子應用端口cors: true, // 允許跨域headers: {'Access-Control-Allow-Origin': '*' // 允許跨域}},css: {preprocessorOptions: {scss: {// additionalData: '@import "./src/style/index.scss";' // 修復:改為單個字符串// charset: false}}}
})

main.ts

import { createApp } from 'vue'
// import './style.css'
import App from './App.vue'
import './style/base.scss'
import router from './router/index.ts'// const app =  createApp(App)
// app.use(router)
// app.mount('#app')let instance: any = nullfunction render(props?: {} | undefined) {console.log(props)instance = createApp(App)instance.use(router)instance.mount('#app')}// 獨立運行時
if (!window.__POWERED_BY_QIANKUN__) {render()
}// qiankun 生命周期鉤子
export async function bootstrap() {console.log('[vue] vue app bootstraped')
}export async function mount(props: {} | undefined) {console.log(props,"props")console.log('[vue] props from main framework', props)render(props)
}export async function unmount() {instance.unmount()instance._container.innerHTML = ''instance = null
}

router/index.ts

import { createRouter, createWebHistory } from 'vue-router'const router = createRouter({history: createWebHistory(window.__POWERED_BY_QIANKUN__ ? '/ppt' : '/ppt'),routes: [// 你的路由配置{path: '/',name: 'home',component: () => import('../views/home/index.vue'),},{path: '/home',name: 'home1',component: () => import('../views/home/index.vue'),},]
})export default router

react 18

package.json

    "qiankun": "^2.10.16","react": "^18.2.0","react-dom": "^18.2.0","react-router-dom": "^7.5.2","vite-plugin-qiankun": "^1.0.15"

vite.config.ts

import { defineConfig, loadEnv } from 'vite'
import react from '@vitejs/plugin-react'
// 1. vite環境下安裝qiankun插件
import qiankun from "vite-plugin-qiankun";// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {console.log(mode);  const isDev = mode === 'development'const env = loadEnv(mode, process.cwd());console.log(env); return {plugins: [// 2. 引用qiankun插件,需要注意,這里的microReact是子應用名稱,需要和主應用中注冊的子應用名稱一致qiankun(env.VITE_APP_NAME, {useDevMode: true,}),// 3. react()插件會跟vite-plugin-qiankun插件沖突,所以需要判斷是否是開發環境!isDev && react(),],// 4. 同域配置二級域名,異域配置不需要可修改為:isDev ? "/" : 'http://xxx.com/'base: isDev ? "/"+env.VITE_APP_NAME : '/'+env.VITE_APP_NAME,server: {host: "0.0.0.0",port: 83,headers: {'Access-Control-Allow-Origin': '*'},proxy: {'^/reactApi': {target: 'http://localhost:9528/',rewrite: path => path.replace(/^\/reactApi/, ''),changeOrigin: true}}},}
})

.env.development 和 .env.production

VITE_APP_BASE_API='/gateway'
VITE_APP_NAME='agent'

main.tsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'// 1. 引用vite-plugin-qiankun
import { renderWithQiankun, qiankunWindow, QiankunProps } from 'vite-plugin-qiankun/dist/helper'
let root: ReactDOM.Root | null = null// 2. qiankun渲染函數
function render(props: QiankunProps) {console.log(props,"xxxxxxxxx")const { container } = propsconst root = ReactDOM.createRoot((container? container.querySelector('#root'): document.querySelector('#root')) as HTMLElement)root.render(<React.StrictMode><App /></React.StrictMode>)return root
}renderWithQiankun({mount(props) {root = render(props)},bootstrap() {console.log('bootstrap')},unmount() {root?.unmount()},update() {},
})if (!qiankunWindow.__POWERED_BY_QIANKUN__) {root = render({})
}

router/index.tsx

// src/router/index.tsx
import React, { Suspense } from 'react'
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { qiankunWindow } from "vite-plugin-qiankun/dist/helper";// 路由懶加載
const Home = React.lazy(() => import('../views/home'))
// const List = React.lazy(() => import('../views/list'))
// const NotFound = React.lazy(() => import('../views/notFound'))export default function Router() {return (// 同域:判斷是否為qiankun引用,給出不同路由;異域分別修改為 '/micro-react' : '/'<BrowserRouter basename={qiankunWindow.__POWERED_BY_QIANKUN__ ? "/"+import.meta.env.VITE_APP_NAME : "/"+import.meta.env.VITE_APP_NAME}><Routes><Route path='/' element={<Suspense><Home /></Suspense>}></Route><Route path='/home' element={<Suspense><Home /></Suspense>}></Route>{/* <Route path='/list' element={<Suspense><List/></Suspense>}></Route> */}{/* 定義404路由*/}{/* <Route path='/404' element={<Suspense><NotFound/></Suspense>}></Route> */}{/* 未匹配的路由使用Navigate重定向到此頁面 這里即notFound.jsx */}{/* <Route path='/*' element={<Navigate to='/404' />}></Route>  */}</Routes></BrowserRouter>)
}

轉載

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

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

相關文章

安裝WSL2,配置Ubuntu圖像化界面

目錄 一、前言二、安裝WSL三、安裝圖像化界面四、參考 一、前言 Windows 子系統下的 Linux 子系統&#xff08;WSL&#xff0c;Windows Subsystem for Linux&#xff09;是微軟推出的一項功能&#xff0c;允許用戶在 Windows 系統中原生運行 Linux 環境&#xff0c;無需安裝虛…

圖像畸變-徑向切向畸變實時圖像RTSP推流

實驗環境 注意&#xff1a;ffmpeg進程stdin寫入兩張圖片的時間間隔不能太長&#xff0c;否則mediamtx會出現對應的推流session超時退出。 實驗效果 全部代碼 my_util.py #進度條 import os import sys import time import shutil import logging import time from datetime i…

Redis Sentinel 和 Redis Cluster 各自的原理、優缺點及適用場景是什么?

我們來詳細分析下 Redis Sentinel (哨兵) 和 Redis Cluster (集群) 這兩種方案的原理和使用場景。 Redis Sentinel (哨兵) 原理: Sentinel 本身是一個或一組獨立于 Redis 數據節點的進程。它的核心職責是監控一個 Redis 主從復制 (Master-Slave) 架構。多個 Sentinel 進程協同…

基于機器學習的電影票房預測

目錄 摘 要(完整下載鏈接附在文末) Abstract 1 緒 論 1.1 研究背景概述 1.2 國內外相關領域研究進展 1.3 電影票房預測技術概覽 1.3.1 利用人口統計學特征的方法 1.3.2 基于機器學習的預測模型 2 機器學習相關理論介紹與分析 2.1 機器學習算法理論 2.1.1卷積…

SVMSPro平臺獲取HTTP-FLV規則

SVMSPro平臺獲取HTTP-FLV規則 HTTP-FLV的服務端口為&#xff1a;53372&#xff0c;如需要公網訪問需要開啟這個端口 這里講的是如何獲取長效URL&#xff0c;短效&#xff08;時效性&#xff09;URL也支持&#xff0c;下回講 一、如何獲取HTTP-FLV實時流視頻 http://host:po…

ARM架構的微控制器總線矩陣

在 ARM 架構的微控制器&#xff08;MCU&#xff09;中&#xff0c;總線矩陣&#xff08;Bus Matrix&#xff09; 是總線系統的核心互連結構&#xff0c;負責協調多個主設備&#xff08;如 CPU、DMA、以太網控制器等&#xff09;對多個從設備&#xff08;如 Flash、SRAM、外設等…

AI賦能金融:智能投顧、風控與反欺詐的未來

AI賦能金融&#xff1a;智能投顧、風控與反欺詐的未來 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 AI賦能金融&#xff1a;智能投顧、風控與反欺詐的未來摘要引言一、智能投顧&#xff1a;從經驗驅動到人機協同…

【機器學習】樸素貝葉斯

目錄 一、樸素貝葉斯的算法原理 1.1 定義 1.2 貝葉斯定理 1.3 條件獨立性假設 二、樸素貝葉斯算法的幾種常見類型 2.1 高斯樸素貝葉斯 (Gaussian Naive Bayes) 【訓練階段】 - 從數據中學習模型參數 【預測階段】 - 對新樣本 Xnew? 進行分類 2. 2 多項式樸素貝葉斯 (…

鴻蒙 ArkTS 組件 通用事件 通用屬性 速查表

ArkTS 組件 組件 通用事件 速查表 通用事件事件名稱簡要說明點擊事件onClick(event: Callback<ClickEvent>, distanceThreshold: number): T相較于原有 onClick 接口&#xff0c;新增 distanceThreshold 參數作為點擊事件移動閾值&#xff0c;當手指的移動距離超出所設…

Java云原生+quarkus

一、Java如何實現云原生應用&#xff1f; 傳統的 Java 框架&#xff08;如 Spring Boot&#xff09;雖然功能強大&#xff0c;但在云原生場景下可能顯得笨重。以下是一些更適合云原生的輕量級框架&#xff1a; Quarkus(推薦) 專為云原生和 Kubernetes 設計的 Java 框架。支持…

C語言教程(二十三):C 語言強制類型轉換詳解

一、強制類型轉換的概念 強制類型轉換是指在程序中手動將一個數據類型的值轉換為另一種數據類型。在某些情況下,編譯器可能不會自動進行類型轉換,或者自動轉換的結果不符合我們的預期,這時就需要使用強制類型轉換來明確指定要進行的類型轉換。 二、強制類型轉換的語法 強制類…

Spring Boot × K8s 監控實戰-集成 Prometheus 與 Grafana

在微服務架構中&#xff0c;應用的可觀測性至關重要。Kubernetes 已成為容器化部署的標準&#xff0c;但其自身的監控能力有限&#xff0c;需要與其他工具集成才能實現詳細的運行數據采集與分析。 本文將通過 Spring Boot Kubernetes Prometheus Grafana 實戰&#xff0c;打…

phpstudy修改Apache端口號

1. 修改Listen.conf文件 本地phpstudy安裝目錄&#xff1a; 2.其他問題 ① 修改httpd.conf不起作用 ② 直接通過控制面板配置好像有延遲緩存

(done) 吳恩達版提示詞工程 6. 轉換 (翻譯,通用翻譯,語氣風格變換,文本格式轉換,拼寫檢查和語法檢查)

視頻&#xff1a;https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 別人的筆記&#xff1a;https://zhuanlan.zhihu.com/p/626966526 6. 轉換任務&#xff08;Transforming&#xff0…

什么是靜態住宅ip,跨境電商為什么要用靜態住宅ip

在數字時代&#xff0c;IP地址不僅是設備聯網的“ID”&#xff0c;更是跨境電商運營中的關鍵工具。尤其對于需要長期穩定、安全操作的場景&#xff0c;靜態住宅IP逐漸成為行業首選。 一、什么是靜態住宅IP&#xff1f; 靜態住宅IP&#xff08;Static Residential IP&#xff0…

Qemu-STM32(十七):STM32F103加入AFIO控制器

概述 本文主要描述了在Qemu平臺中&#xff0c;如何添加STM32F103的AFIO控制器模擬代碼&#xff0c;AFIO是屬于GPIO引腳復用配置的功能。 參考資料 STM32F1XX TRM手冊&#xff0c;手冊編號&#xff1a;RM0008 添加步驟 1、在hw/arm/Kconfig文件中添加STM32F1XX_AFIO&#x…

QuecPython+audio:實現音頻的錄制與播放

概述 QuecPython 作為專為物聯網設計的開發框架&#xff0c;通過高度封裝的 Python 接口為嵌入式設備提供了完整的音頻處理能力。本文主要介紹如何利用 QuecPython 快速實現音頻功能的開發。 核心優勢 極簡開發&#xff1a;3行代碼完成基礎音頻錄制與播放。快速上手&#xf…

企業架構之旅(3):TOGAF ADM架構愿景的核心價值

一、引言&#xff1a;為什么架構愿景是企業架構的「導航圖」 在企業數字化轉型的浪潮中&#xff0c;TOGAF ADM&#xff08;架構開發方法&#xff09;作為公認的企業架構「方法論圣經」&#xff0c;其首個關鍵階段 —— 架構愿景&#xff08;Architecture Vision&#xff09;&a…

C++:Lambda表達式

C&#xff1a;Lambda表達式 C中lambda的基本語法1. 捕獲列表&#xff08;Capture List&#xff09;2. 示例代碼示例 1&#xff1a;簡單的lambda示例 2&#xff1a;捕獲變量示例 3&#xff1a;按引用捕獲示例 4&#xff1a;捕獲所有變量示例 5&#xff1a;作為函數參數 3. lambd…

被關在idea小黑屏里寫spark程序

一、先在idea中添加Scala插件 二、使用Maven創建新項目 1.啟動idea,選擇新建項目。之后的設置如下&#xff1a; 2.將Scala添加到全局庫中&#xff08;注意&#xff1a;Scala的版本不宜太高&#xff0c;最好是2-12.否則后面會報下面這個錯誤 E:\tool接口\SparkCore_01\src\mai…