微前端-qiankun

react作为主应用
npx create-react-app react-main
npm i react-router-dom qiankun

registerApp.js

import { registerMicroApps, start } from 'qiankun'
registerMicroApps([{name: 'reactApp',entry: '//localhost:10000',container: '#container',activeRule: '/react'},{name: 'vueApp',entry: '//localhost:5173',container: '#container',activeRule: '/vue'}
], {beforeLoad() {},beforeMount() {},afterMount() {},beforeUnmount() {},afterUnmount() {}
})start()

index.js

import './registerApp'

App.js

import './App.css';
import { BrowserRouter, Link } from 'react-router-dom'function App() {return (<div className="App"><BrowserRouter><Link to="/react" >react</Link><Link to="/vue" >vue</Link></BrowserRouter><div id='container'></div></div>);
}export default App;

子应用
react

npm i rescripts/cli

index.js

import './public-path'
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';function render(props) {const container = props.containerconst root = ReactDOM.createRoot(container?container.querySelector('#root') : document.getElementById('root'));root.render(<React.StrictMode><App /></React.StrictMode>);
}if(!window.__POWERED_BY_QIANKUN__) {render({})
}export async function bootstrap() {}
export async function mount(props) {render(props)
}
export async function unmount() {}

public-path.js

if(window.__POWERED_BY_QIANKUN__) {// eslint-disable-next-line no-undef__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

.env

PORT=10000
WDS_SOCKET_PORT=10000

.rescriptsrc.js

module.exports = {webpack: (config) => {config.output.libraryTarget = 'umd'config.output.library = 'react-f'return config},devServer: config => {config.headers = {"Access-control-Allow-Origin": "*"}return config}}
<BrowserRouter basename={window.__POWERED_BY_QIANKUN__ ? '/child-one' : '/'}>

package.json

"start": "rescripts start",
"build": "rescripts build",
"test": "rescripts test",
"eject": "rescripts eject"

vite 安装的vue3

npm create vue@latest
npm i vite-plugin-qiankun

main.ts

import './public-path'
import './assets/main.css'import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import routes from './router'
import { createRouter, createWebHistory } from 'vue-router'
import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
let app: any
let history: any
let router
function render(props: any) {app = createApp(App)app.use(createPinia())history = createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/vue' : '/')router = createRouter({history,routes})app.use(router)const container = props.containerapp.mount(container ? container.querySelector('#app') : '#app')
}renderWithQiankun({mount(props) {render(props)},bootstrap() {console.log('props')},update() {},unmount() {app.unmount()history.destroy()app = nullrouter = null}
})
if (!qiankunWindow.__POWERED_BY_QIANKUN__) {render({})
}

vite.config.ts

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import qiankun from 'vite-plugin-qiankun'export default defineConfig({plugins: [vue(),vueJsx(),qiankun('vueApp', {useDevMode: true})],server: {// 开发阶段静态资源加载问题origin: '//localhost:5173'},resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})

vue-cli创建vue3项目
vite.config.ts

  devServer: {port: 20000,headers: {"Access-Control-Allow-Origin": "*"},},configureWebpack: {output: {libraryTarget: 'umd',library: 'vue-f'}},

public-path.js

if(window.__POWERED_BY_QIANKUN__) {// eslint-disable-next-line no-undef__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
}

main.ts

import './assets/main.css'import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import routes from './router'
import { createRouter, createWebHistory } from 'vue-router'
let app: any
let history: any
let router
function render(props: any) {app = createApp(App)app.use(createPinia())history = createWebHistory(window.__POWERED_BY_QIANKUN__ ? '/vue' : '/')router = createRouter({history,routes})app.use(router)const container = props.containerapp.mount(container ? container.querySelector('#app') : '#app')
}if(!window.__POWERED_BY_QIANKUN__) {render({})}export async function bootstrap() {}export async function mount(props) {render(props)}export async function unmount() {app.unmount()history.destroy()app = nullrouter = null}

static

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="static"></div><script entry>const app = document.getElementById('static')function render() {app.innerHTML = 'static-f'}if(!window.__POWERED_BY_QIANKUN__) {render({})}window['static-f'] = {bootstrap: async () => {},mount: async () => {render({})},unmount: async () => {app.innerHTML = ''},}</script>
</body>
</html>

http-server --port 3000 --cors
app.js

import './App.css';
import { BrowserRouter, Link } from 'react-router-dom'
import { loadMicroApp } from 'qiankun'
import React from 'react'function App() {const containerRef = React.createRef()React.useEffect(() => {loadMicroApp({name: 'static-f',entry: '//localhost:30001',container: containerRef.current})})return (<div className="App"><BrowserRouter><Link to="/react" >react</Link><Link to="/vue" >vue</Link></BrowserRouter><div ref={containerRef}></div><div id='container'></div></div>);
}export default App;

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

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

相关文章

微信小程序:限制表单多次提交(变量限制+防抖)

方法一&#xff1a;变量限制 设置一个变量&#xff0c;在提交表单前设置为false&#xff0c;当表单开始提交时设置为true&#xff08;禁用按钮&#xff09;&#xff0c;成功请求或者失败再设置为false 代码 wxml <form bindsubmit"formSubmit"><view cl…

Leetcode 3113. Find the Number of Subarrays Where Boundary Elements Are Maximum

Leetcode 3113. Find the Number of Subarrays Where Boundary Elements Are Maximum 1. 解题思路2. 代码实现 题目链接&#xff1a;3113. Find the Number of Subarrays Where Boundary Elements Are Maximum 1. 解题思路 这一题多少有些惭愧&#xff0c;也是一开始没想到&…

FebHost:为什么注册.BE比利时域名?

.be 是比利时的国家代码顶级域名&#xff08;ccTLD&#xff09;&#xff0c;通常用于与该国有关的网网站。这个域名为那些希望在线上建立与比利时有关联系的个人、公司和组织提供了一个重要的网络标识。 .be 域名于1988年创建&#xff0c;由.BE域名注册机构管理&#xff0c;这…

【k8s】:深入理解 Kubernetes 中的污点(Taints)与容忍度(Tolerations)

【k8s】&#xff1a;深入理解 Kubernetes 中的污点&#xff08;Taints&#xff09;与容忍度&#xff08;Tolerations&#xff09; 1、污点&#xff08;Taints&#xff09;2、容忍度&#xff08;Tolerations&#xff09;3、示例演示-测试污点的具体应用场景3.1 给节点打污点&…

HarmonyOS开发案例:【智能煤气检测】

样例简介 智能煤气检测系统通过实时监测环境中烟雾浓度&#xff0c;当一氧化碳浓度超标时&#xff0c;及时向用户发出警报。在连接网络后&#xff0c;配合数字管家应用&#xff0c;用户可以远程配置智能煤气检测系统的报警阈值&#xff0c;远程接收智能煤气检测系统报警信息。…

【QT教程】QT6信号与槽

QT6信号与槽 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费QT视…

思路弱密码比较

weakpass之类的网址下载密码本存入数据库&#xff0c;比如叫做password字段&#xff0c;每次比较SELECT * FROM users WHERE LOCATE(example, password) > 0;

多轴机械臂/正逆解/轨迹规划/机器人运动学/Matlab/DH法 学习记录02——机械臂几何法与DH表示法

系列文章目录 本科毕设正在做多轴机械臂相关的内容&#xff0c;这里是一个学习机械臂运动学课程的相关记录。 如有任何问题&#xff0c;可发邮件至layraliufoxmail.com问询。 1. 数学基础 2. 机械臂几何法与DH表示法 文章目录 系列文章目录一、手臂几何法1.机械手臂2.机械手臂…

vue3+vite+superMap(超图)实现淹没分析

<template><div><el-dialog draggable destroy-on-close v-if="changeInundAtionState" :modal="false" v-model="changeInundAtionState"close-icon="" title="淹没分析" width="20%" :before-cl…

4.配置USART串口实现printf打印

通过TTL转USB实现电脑和单片机连通,是我们调试必不可少的工具 查看原理图,使用USART1,它们的TX和RX分别在PA9和PA10 新建Usart.c存放串口模块的初始化 这段代码是复制了正点原子的工程,添加到前面 #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos 使用 …

Docker安装Kong网关

文章目录 一、kong是什么?二、搭建步骤1.搭建PostgreSQL2.搭建Kong网关2.1、制作镜像2.2、数据库初始化2.3、启动Kong网关一、kong是什么? Github地址:https://github.com/Kong/kong Kong是一个可扩展、开源的云原生API网关,可以在分布式环境中管理、监控和安全地发布API…

每日两题 / 15. 三数之和 73. 矩阵置零(LeetCode热题100)

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 先确定一个数t&#xff0c;对于剩下的两个数&#xff0c;要求两数之和为t的负数 三数之和就退化成了两数之和&#xff0c;两数之和可以用双指针 先排序&#xff0c;左右两个指针&#xff0c;指向的数之和大于目标值&…

AI启示录:既是企业安全利器,也是内部隐藏炸弹

目录 发现潜在威胁->成为内部威胁 精准检测威胁->扰乱正常业务 深度学习->数据中毒 随着网络威胁的迅速发展&#xff0c;专家预计&#xff0c;到 2024 年网络犯罪将给美国公司带来高达 4520 亿美元的损失&#xff0c;且这一数字在未来几年还会迅速增长。除了网络安全措…

鱼哥推荐书籍第18期:《推荐系统》算法 案例与大模型

鱼哥推荐书籍第18期&#xff1a;《推荐系统》算法 案例与大模型 什么是推荐系统&#xff1f;推荐系统解决了哪些问题&#xff1f;推荐系统的应用领域常用的推荐算法&#xff1a;基于内容的推荐算法协同过滤算法&#xff1a; 如何系统学习推荐系统&#xff1a;第一部分&#xff…

IO流-IO框架

简介 java的IO流操作提供了最简单的操作&#xff0c;第三方基于日常使用习惯&#xff0c;写了很多IO框架&#xff0c;更加方便操作避免重复造轮子&#xff0c;提高开发效率 Commons-io 简介 Commons-io是apche提供的IO操作的小框架 部分常用的API 引入依赖 <dependency>…

天工杂志社《天工》杂志社2024年第5期目录

业界翘楚 巍巍者昆仑 煌煌者华夏 乔彦鹏; 6-8 工美史话 日月之光照澈幽冥——墓葬铜镜中柿蒂纹意象辨析 周昕怡;刘春芽; 9-11 西藏传统手工艺技能教育发展历程研究 吕元菊; 12-14 探索研究《天工》投稿&#xff1a;cn7kantougao163.com 传统装饰艺术设计美学的…

HashMap的扩容看这一篇足够

在Java中&#xff0c;对于HashMap这样的实现&#xff0c;put方法是用来将一个键值对插入到Map中的核心方法。以下是HashMap类中put方法的大致执行流程&#xff1a; 计算Hash值&#xff1a; 首先&#xff0c;put方法会接收一个键&#xff08;Key&#xff09;和一个值&#xff0…

局域网管理软件哪个好?局域网电脑管理系统实践案例

之前有一个公司案例&#xff0c;是这样的&#xff1a; 公司名称&#xff1a;智慧科技有限公司 背景&#xff1a; 智慧科技有限公司是一家拥有数百名员工的中型企业&#xff0c;随着业务的快速发展&#xff0c;公司面临着网络管理上的挑战。 员工在日常工作中需要频繁地访问…

探索性测试

探索性测试 探索性测试是一种动态、灵活的软件测试方法&#xff0c;与传统的计划驱动测试相对。在探索性测试中&#xff0c;测试人员不是依靠事先制定的详尽测试计划&#xff0c;而是根据其经验和直觉&#xff0c;通过探索软件应用的功能、界面、性能等方面来发现缺陷和问题。…

微信小程序使用iconfont

进入iconfont&#xff0c;添加至项目 进入项目&#xff0c;点击生成代码&#xff0c;或更新代码 点击打开样式 复制内容到小程序的style文件夹下 最后引入到app.wxss