阿里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.mzph.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…