qiankun:react18主应用 + 微应用 react18 + vue3

一:主应用
搭建react项目

npx create-react-app react-qiankun-main

安装Antd

npm install antd –save

在 index.js中引入

import { ConfigProvider } from "antd";
import zhCN from "antd/locale/zh_CN";
import "antd/dist/reset.css";
// ...
root.render(<ConfigProvider locale={zhCN}><React.StrictMode><App /></React.StrictMode></ConfigProvider>
);

安装react-router :

npm i react-router-dom

在 index.js中引入

import { BrowserRouter } from "react-router-dom";// …<BrowserRouter><ConfigProvider locale={zhCN}><React.StrictMode><App /></React.StrictMode></ConfigProvider></BrowserRouter>

安装 qiankun :

 npm i qiankun -S

在主应用中注册微应用,在 index.js中引入

// …
import { registerMicroApps, start } from "qiankun";registerMicroApps([{name: "react app", // 子应用的名称,必须唯一。entry: "//localhost:3004", // 子应用项目本地运行地址container: "#lyContainer", //  子应用的容器(子应用嵌入到主项目id为lyContainer的地方)activeRule: "/react-app", // 子应用激活时的路由规则(子应用路由)},{name: "vue app",entry: "//localhost:5173",container: "#lyContainer",activeRule: "/vue-app",},
]);start();
// …

注:子应用嵌入到主应用的地方,id要跟index.js下registerMicroApps里面的container设置一致
在这里插入图片描述

修改App.js文件,将如下代码放入App.js

import React, { useState } from "react";
import "./App.css";
import {MenuFoldOutlined,MenuUnfoldOutlined,UserOutlined,VideoCameraOutlined,
} from "@ant-design/icons";
import { Layout, Menu, Button } from "antd";
import { NavLink } from "react-router-dom";
const { Header, Sider, Content } = Layout;function App() {const [collapsed, setCollapsed] = useState(false);return (<div className="App"><Layout className="layout-container"><Sider trigger={null} collapsible collapsed={collapsed}><div className="logo">logo</div><Menutheme="dark"mode="inline"defaultSelectedKeys={["1"]}items={[{key: "1",icon: <UserOutlined />,label: <NavLink to="/vue-app">vue应用</NavLink>,},{key: "2",icon: <VideoCameraOutlined />,label: <NavLink to="/react-app">react应用</NavLink>,},]}/></Sider><Layout className="layout-main"><Header className="header"><Buttontype="text"icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}onClick={() => setCollapsed(!collapsed)}className="collapse-btn"/></Header><Content id="lyContainer" className="layout-content">Content</Content></Layout></Layout></div>);
}export default App;

修改App.css样式如下:

#root,
.App,
.layout-container {width: 100%;height: 100%;
}
.logo {height: 64px;line-height: 64px;color: #fff;text-align: center;
}
.layout-main {overflow-y: auto;
}
.header {padding: 0;background-color: #fff;
}
.header .collapse-btn {font-size: 16px;width: 64px;
}
.layout-content{padding: 24px;
}

效果如下:
在这里插入图片描述
二、react微应用

npx create-react-app react-qiankun-sub
cd react-qiankun-sub
npm start

修改index.html下的id
在这里插入图片描述
在src下新建public-path.js,将如下代码放进去

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

安装react-router :

npm i react-router-dom

设置 history 模式路由的 base,并在index.js中导入public-path.js,修改index.js中代码如下:

import { BrowserRouter } from "react-router-dom";import "./public-path";let root = null;
function render(props) {const { container } = props;root =root ||ReactDOM.createRoot(container? container.querySelector("#subRoot"): document.getElementById("subRoot"));root.render(<BrowserRouterbasename={window.__POWERED_BY_QIANKUN__ ? "/react-app" : "/"}><React.StrictMode><App /></React.StrictMode></BrowserRouter>);
}if (!window.__POWERED_BY_QIANKUN__) {render({});
}export async function bootstrap() {console.log("[react16] react app bootstraped");
}export async function mount(props) {console.log("[react16] props from main framework", props);render(props);
}
// https://github.com/kobeyk/micro-app-react-template/blob/main/config-overrides.js
export async function unmount(props) {// const { container } = props;root.unmount();root = null;
}// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

修改webpack配置,安装craco:

npm i @craco/craco

根目录新增 craco.config.js,将如下代码放进去:

const { name } = require("./package");module.exports = {webpack: {configure: (webpackConfig) => {webpackConfig.output.library = `${name}-[name]`;webpackConfig.output.libraryTarget = "umd";webpackConfig.output.chunkLoadingGlobal = `webpackJsonp_${name}`;return webpackConfig;},},devServer: (devServerConfig) => {devServerConfig.historyApiFallback = true;devServerConfig.open = false;devServerConfig.hot = false;devServerConfig.watchFiles = [];devServerConfig.headers = {"Access-Control-Allow-Origin": "*",};return devServerConfig;},
};

修改package.json里面启动的命令,因为安装了craco

 "scripts": {"start": "craco start","build": "craco build","test": "craco test","eject": "react-scripts eject"},

在这里插入图片描述

三、vue3微应用

npm init vue@latest

在这里插入图片描述

cd vue-qiankun
npm install
npm run format
npm run dev

在这里插入图片描述
安装vite-plugin-qiankun:

npm i vite-plugin-qiankun

https://www.npmjs.com/package/vite-plugin-qiankun
在vite.config.js加入如下配置

import qiankun from 'vite-plugin-qiankun'// https://vitejs.dev/config/
export default defineConfig({// 生产环境需要指定运行域名作为base// base: 'http://xxx.com/'plugins: [vue(),qiankun('vue-app', {//  'vue-app' 是子应用名,与主应用注册时保持一致useDevMode: true // 如果是在主应用中加载子应用vite,必须打开这个,否则vite加载不成功, 单独运行没影响})],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}},server: {port: '5173',cors: true,origin: 'http://localhost:5173',  // 子应用引入到主应用之后,子应用中的图片在主应用下加载不出来、找不到,需要将origin设置成子应用本地运行地址}
})

在main.js中修改代码,如下:

import './assets/main.css'import { createApp } from 'vue'
import { createPinia } from 'pinia'import App from './App.vue'
import routes from './router'import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
import { createRouter, createWebHistory } from 'vue-router'let router = null
let instance = null
let history = nullfunction render(props = {}) {const { container } = propshistory = createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/vue-app' : '/')router = createRouter({history,routes})instance = createApp(App)instance.use(router)instance.use(createPinia())instance.mount(container ? container.querySelector('#app') : '#app')if (qiankunWindow.__POWERED_BY_QIANKUN__) {console.log('我正在作为子应用运行')}
}// some code
renderWithQiankun({bootstrap() {console.log('bootstrap')},mount(props) {console.log('viteapp mount')render(props)// console.log(instance.config.globalProperties.$route,333);},unmount() {console.log('vite被卸载了')instance.unmount()instance._container.innerHTML = ''history.destroy() // 不卸载  router 会导致其他应用路由失败router = nullinstance = null}
})if (!qiankunWindow.__POWERED_BY_QIANKUN__) {render()
}

效果如下:

在这里插入图片描述
在这里插入图片描述

问题:

  1. 应用间的样式隔离:
    在最新的 qiankun 版本中,你也可以尝试通过配置{ sandbox : { experimentalStyleIsolation: true } } 的方式开启运行时的 scoped css 功能,从而解决应用间的样式隔离问题

在主应用的index.js下的start中加入sandbox配置 ,代码如下:


start({ sandbox : { experimentalStyleIsolation: true }});

在这里插入图片描述

  1. 主应用中切换到子应用对应的页面,子应用空白,控制台也不报错
    元素检查看主应用中是否有子应用的元素,如果有,那可能是样式原因导致的

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

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

相关文章

DDOS百科:什么是 DDoS 攻击及如何防护DDOS攻击

一、什么是 DDoS 攻击&#xff1f; 当多台机器一起攻击一个目标&#xff0c;通过大量互联网流量淹没目标或其周围基础设施&#xff0c;从而破坏目标服务器、服务或网络的正常流量时&#xff0c;就会发生分布式拒绝服务(DDoS)攻击。 DDoS允许向目标发送指数级更多的请求&#…

【大数据之Hadoop】三十七、Hadoop HA高可用

1、HA概述 实现高可用最关键的策略是消除单点故障。HA分成各个组件的HA机制&#xff1a;HDFS的HA和YARN的HA。   Hadoop2.0之前&#xff0c;在HDFS集群中NameNode存在单点故障&#xff08;SPOF&#xff09;。 NameNode主要在以下两个方面影响HDFS集群&#xff1a; &#xff…

AI时代图像安全“黑科技”如何助力人工智能与科技发展?

〇、前言 7月7日下午&#xff0c;2023世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代AIGC新浪潮—可信AI”论坛在上海世博中心红厅举行。人工智能等技术前沿领域的著名专家与学者、投资人和领军创业者汇聚一堂&#xff0c;共同探索中国科技创新的驱动力量。 在…

4. 设计(黑盒)测试用例 (一) 等价类 边界值 判定表

本篇文章我们将详细介绍如何来测试用例。 1. 设计测试用例的基本要素 1.1 测试用例概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 1.2 测试用例要素 测试环境、测试步骤、测试数据、预期结果。 1.3 测试用例的重要性 提…

【美团面试】软件测试面试题

一、设计登录界面测试用例 功能测试(Function test) 0. 什么都不输入&#xff0c;点击提交按钮&#xff0c;看提示信息。&#xff08;非空检查&#xff09; 1.输入正确的用户名和密码&#xff0c;点击提交按钮&#xff0c;验证是否能正确登录。&#xff08;正常输入&#xff0…

【启发式算法】灰狼优化算法【附python实现代码】

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

江南大学轴承数据故障诊断(利用连续小波变换转换为二维图像,再利用CNN进行故障诊断)

1.江南大学轴承数据集介绍 采样频率&#xff1a;50khz&#xff0c;采样时间&#xff1a;10s 转速&#xff1a;600 800 1000/rpm 内圈&#xff1a;ib 外圈&#xff1a;ob 滚动体&#xff1a;tb 正常&#xff1a;N 以600转速下的内圈故障数据为例展示&#xff1a; 开始数据…

第46节:cesium 水面效果(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><vc-viewer @ready="ready" :logo="false"><!

C 知识积累 替换gets函数 Linux C 语法分析 switch和if else的比较

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 回车与换行一.知其然二.知其所以然 关键字&#xff0c;操…

怎样优雅地增删查改(五):按组织架构查询

文章目录 原理实现应用测试 之前我们实现了Employee&#xff0c;Alarm管理模块以及通用查询应用层。 Employee的集合查询业务&#xff0c;是通过重写CreateFilteredQueryAsync方法&#xff0c;来实现按组织架构查询的过滤条件。 我们将这段逻辑代码提取到通用查询应用层中&…

供应链管理系统有哪些?

1万字干货分享&#xff0c;国内外 20款 供应链管理软件都给你讲的明明白白。如果你还不知道怎么选择&#xff0c;一定要翻到第三大段&#xff0c;这里我将会通过8年的软件产品选型经验告诉你&#xff0c;怎么样才能快速选到适合自己的软件工具。 &#xff08;为防后续找不到&a…

IOS与Android APP开发的差异性

iPhone和 Android是全球最流行的两种移动平台&#xff0c;有许多不同的开发者开发了应用程序&#xff0c;并将它们发布到市场上。虽然大多数开发者都使用了这两个平台&#xff0c;但您仍然需要了解它们的差异。 虽然 iOS和 Android两个平台都是基于 Linux&#xff0c;但它们却…

(1)ADS-B接收机

文章目录 前言 1.1 所需硬件 1.2 连接到自动驾驶仪 1.3 设置 1.4 ADSB输出配置 1.5 启用载人飞行器避障功能 1.6 飞行器数据库 1.7 开发者信息包括模拟 前言 本文介绍了如何安装和配置 ADS-B 模块&#xff0c;以便你的飞机能够知道附近的其他飞机和空中交通管制&#x…

MyBatis 的架构

MyBatis 的架构 MyBatis 是一个基于 Java 的持久层框架&#xff0c;可以将 SQL 语句和 Java 代码进行分离&#xff0c;通过 XML 或注解的方式配置 SQL 语句并执行&#xff0c;从而实现数据访问的功能。MyBatis 的架构包括以下几个部分&#xff1a; SqlSessionFactory&#xff…

学习opencv.js之基本使用方法(读取,显示,灰度化,边缘检测,特征值点检测)

opencv.js是什么 OpenCV.js 是 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;的 JavaScript 版本。OpenCV 是一个广泛使用的计算机视觉和图像处理库&#xff0c;提供了一系列功能强大的算法和工具&#xff0c;用于处理图像、视频、特征提取、对象识别等…

Storage、正则表达式

1 LocalStorage 2 SessionStorage 3 正则表达式的使用 4 正则表达式常见规则 5 正则练习-歌词解析 6 正则练习-日期格式化 Storage-Storage的基本操作 // storage基本使用// 1.token的操作let token localStorage.getItem("token")if (!token) {console.log(&q…

python开发项目基于语音识别的智能垃圾分类系统的设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

详解c++---特殊类设计

目录标题 设计一个不能被拷贝的类设计一个只能从堆上创建对象的类设计一个只能在栈上创建对象的类设计一个无法被继承的类什么是单例模式饿汉模式饿汉模式的缺点懒汉模式懒汉模式的优点懒汉模式的缺点特殊的懒汉 设计一个不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能&#xff0c;来源&#xff0c;选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及…

自学网络安全究竟该从何学起?

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入行…