qiankun:vite/webpack项目配置

相关博文:
https://juejin.cn/post/7216536069285429285?searchId=202403091501088BACFF113F980BA3B5F3

https://www.bilibili.com/video/BV12T411q7dq/?spm_id_from=333.337.search-card.all.click

qiankun结构:

主应用base:vue3+history+vite
子应用sub-react:react+history+webpack
子应用sub-vue:vue3+history+vite
子应用sub-vue2:vue2+base+webpack
在这里插入图片描述



❀ 主应用base

1、安装qiankun

yarn add qiankun # 或者 npm i qiankun -S

2、存放子应用信息

/src/utils/qiankun-config.js

export default {subApps: [{name: 'sub-react', // 子应用名称,跟package.json一致entry: process.env.NODE_ENV === 'development'? '//localhost:3101': '//react.qk.com', // 子应用入口,本地环境下指定端口container: '#sub-app', // 挂载子应用的domactiveRule: '/sub-react', // 路由匹配规则props: {} // 主应用与子应用通信传值},{name: 'sub-vue',entry: process.env.NODE_ENV === 'development'? '//localhost:3100': '//vue3.qk.com',container: '#sub-app',activeRule: '/sub-vue',props: {}},{name: 'sub-vue2',entry: process.env.NODE_ENV === 'development'? '//localhost:3103': '//vue2.qk.com',container: '#sub-app',activeRule: '/sub-vue2',props: {}}]}

3、开启qiankun

/src/utils/qiankun

import { registerMicroApps, initGlobalState } from 'qiankun'
import config from './qiankun-config'const { subApps } = configexport function registerApps() {try {registerMicroApps(subApps, {beforeLoad: [app => {console.log('before load', app)return Promise.resolve()}],beforeMount: [app => {console.log('before mount', app)return Promise.resolve()}],afterUnmount: [app => {console.log('before unmount', app)return Promise.resolve()}]})const actions = initGlobalState(state);// 主项目项目监听和修改actions.onGlobalStateChange((state, prev) => {// state: 变更后的状态; prev 变更前的状态console.log('主项目项目监听变化:',state, prev);});actions.setGlobalState(state);} catch (err) {console.log('qiankunError',err)}
}

4、新建一个组件,用于加载子应用

/src/page/container.vue

<template><div id="sub-app"></div>
</template><script lang="ts">
import { start } from 'qiankun'
import { registerApps } from '@/utils/qiankun'export default {mounted() {if (!window.__POWERED_BY_QIANKUN__) {window.qiankunStarted = trueregisterApps();start({sandbox: {experimentalStyleIsolation: true // 样式隔离}})}else{window.__POWERED_BY_QIANKUN__.on('mount', loadMicroApps);  如果一个页面同时展示多个微应用,需要使用 loadMicroApp 来加载。}}}
</script>

5、配置路由

export const router = createRouter({history: createWebHistory(),routes: [{path: '/',redirect: '/home',meta: {show: false}},{path: '/home',name: 'home',meta: {cnName: '首页',show: true},component: () => import('@/page/home.vue')},{path: '/about',name: 'about',meta: {cnName: '关于',show: true,keepAlive: true},component: () => import('@/page/about.vue')},{path: '/news/:id/:title/:content',name: 'news',meta: {cnName: '新闻',show: true},component: () => import('@/page/news.vue')},{path: '/communication',name: 'communication',meta: {cnName: '练习',show: true},component: () => import('@/page/communication.vue')},{// history模式需要通配所有路由,详见vue-router文档path: '/sub-react/:pathMatch(.*)*',name: 'sub-react',meta: {path:'/sub-react', // 注意:meta里的这个path是用来供router-link使用的,不用上面的path是因为点击主应用菜单跳转到子应用的时候默认带上了通配符cnName: 'sub-react',show: true,key: 'sub-react',},component: () => import('@/page/container.vue'),},{// history模式需要通配所有路由,详见vue-router文档path: '/sub-vue/:pathMatch(.*)*',name: 'sub-vue',meta: {path:'/sub-vue',cnName: 'sub-vue',show: true,key: 'sub-vue',},component: () => import('@/page/container.vue'),},{path: '/sub-vue2',name: 'sub-vue2',meta: {path:'/sub-vue2/', // 如果不加上最后的“/”,则域名会变成:http://localhost:8080/sub-vue2#/logincnName: 'sub-vue2',show: true,key: 'sub-vue2',},component: () => import('@/page/container.vue'),}]
})

*注意:meta里的这个path是用来供router-link使用的,不用上面的path是因为点击主应用菜单跳转到子应用的时候默认带上了通配符
在这里插入图片描述

6、首页 src/App.vue 放置 router-view

<template><header><router-linkv-for="item in routes":key="item.path":to="item.meta.path ? item.meta.path : item.path"><span>{{ item.meta?.cnName }}</span></router-link><router-view v-slot="{Component}" v-show="!$route.meta.key"><keep-alive><component :is="Component" v-if="$route.meta.keepAlive" /></keep-alive><component :is="Component" v-if="!$route.meta.keepAlive" /></router-view></header>
</template>


❀ vite子应用配置(sub-vue)

一、安装vite-plugin-qiankun(vue项目才需要安装)

npm i vite-plugin-qiankun --save-dev

二、修改vite.config.js

sub-vue 修改vite.config.js

export default defineConfig({// base: '/sub-vue',plugins: [vue(),vueJsx(),qiankun('sub-vue', {   // 配置qiankun插件useDevMode: true}),],server: {host: 'localhost',port: 3100,origin: 'http://localhost:3100/',headers: {'Access-Control-Allow-Origin': '*'}}
})


❀ webpack子应用配置(sub-react、sub-vue2)

一、修改webpack配置文件

sub-react

// 在根目录下新增config-overrides.js文件并新增如下配置
const { name } = require("./package");module.exports = {webpack: (config) => {config.output.library = `sub-react`;config.output.libraryTarget = "umd";config.output.chunkLoadingGlobal = `webpackJsonp_${name}`;return config;},devServer: (_) => {const config = _;// config.publicPath = "http://loaclhost:3101";config.headers = {'Access-Control-Allow-Origin': '*',};return config;},
};

sub-vue2

const { name } = require('./package.json')
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,configureWebpack: {output: {library: `sub-vue2`,libraryTarget: 'umd', // 把微应用打包成 umd 库格式// jsonpFunction: `webpackJsonp_${name}`,  // webpack5没有jsonpFunction这个optionschunkLoadingGlobal: `webpackJsonp_${name}`},},devServer:{host: 'localhost',port: 3103,headers: {'Access-Control-Allow-Origin': '*',}}
})

二、配置public-path(解决子应用图片默认取主应用的路径)

sub-reactsub-vue2 src文件下添加public-path.js

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

并在入口文件的第一行!!!引入它
sub-react——src——index.js
在这里插入图片描述
sub-vue2——src——main.js
在这里插入图片描述

❀ history路由入口规则(sub-vue、sub-react)

sub-vue

import { createRouter, createWebHistory } from 'vue-router'
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'const routes = [{path: '/',redirect: { name: 'List' },meta: { title: '首页' },children: [{path: '/list',name: 'List',component: () => import('../views/List.vue')},{path: '/detail',name: 'Detail',component: () => import('../views/Detail.vue')}]},
]const router = createRouter({history: createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/sub-vue/' : '/'),routes
})export default router

sub-react好像不需要配置,直接在App.js添加router和link

<div className='menu'><Link to={'/'}>list</Link><Link to={'/detail'}>detail</Link><a onClick={goVue}>vue列表页</a>
</div>
<Routes><Route path='/' element={<List />} /><Route path='/detail' element={<Detail />} />
</Routes>

❀ 配置生命周期(所有子组件)

sub-react——src——index.js

import './public-path.js'   // public-path处理子应用里的图片地址默认取主应用的路径
import React from 'react';
import { createRoot } from 'react-dom/client';
import './index.css';import App from './App';
import { BrowserRouter } from 'react-router-dom'
import reportWebVitals from './reportWebVitals';let root;
// 将render方法用函数包裹,供后续主应用与独立运行调用
function render(props) {const { container } = propsconst dom = container ? container.querySelector('#root') : document.getElementById('root')root = createRoot(dom)if(!container){root.render(<BrowserRouter><App/></BrowserRouter>)return}root.render(<BrowserRouter basename='/sub-react'>   // 设置路由base<App/></BrowserRouter>)
}// 判断是否在qiankun环境下,非qiankun环境下独立运行
if (!window.__POWERED_BY_QIANKUN__) {render({});
}// 各个生命周期
// bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
export async function bootstrap() {console.log('react app bootstraped');
}// 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
export async function mount(props) {render(props);
}// 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
export async function unmount(props) {root.unmount();
}// 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();

sub-vue——src——main.js

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import {renderWithQiankun,qiankunWindow
} from 'vite-plugin-qiankun/dist/helper'let app:anyconst render = (container) => {app = createApp(App)app.use(router).mount(container ? container.querySelector('#app') : '#app')
}const initQianKun = () => {renderWithQiankun({mount(props) {const { container } = propsrender(container)},bootstrap() {},unmount() {app.unmount()}})
}qiankunWindow.__POWERED_BY_QIANKUN__ ? initQianKun() : render()

sub-vue2——src——main.js

import './public-path'
import Vue from 'vue'
import App from './App.vue'
import router from './router';Vue.config.productionTip = falselet instance = nullfunction render(props = {}) {const { container } = propsinstance = new Vue({router,render: h => h(App)}).$mount(container ? container.querySelector('#app') : '#app')
}if (!window.__POWERED_BY_QIANKUN__) {render();
}export async function bootstrap() {console.log(' vue2 app bootstraped')
}
export async function mount(props) {console.log(' props from main framework', props);render(props)
}
export async function unmount() {instance.$destroy()instance.$el.innerHTML = ''instance = null
}

❀ 踩坑点:

子应用切换时出现以下警告:(我没遇到)
在这里插入图片描述
主应用增加:

router.beforeEach((to, from, next) => {if (!window.history.state.current) window.history.state.current = to.fullPathif (!window.history.state.back) window.history.state.back = from.fullPath// 手动修改history的statereturn next()
})

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

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

相关文章

Python环境搭建 -- Python与PyCharm安装

一、Python安装 我们先找到Python的官方网站&#xff0c;在浏览器中搜索Python即可&#xff0c;然后进入Python官网 点击Downloads&#xff0c;选择对应匹配的操作系统 点进去之后&#xff0c;Python的版本分为稳定的版本和前置版本&#xff0c;前置的版本就是还没有发行的版本…

爬虫练习:获取某网站的房价信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(房天下数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [名称, 地点,价格,总价,联系电话]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer.writeheader…

力扣串题:字符串中的第二大数字

此题的精妙之处在于char类型到int类型的转化&#xff0c;需要运算来解决 int secondHighest(char * s) {int max1-1;int max2-1;int szstrlen(s);int i 0 ;for(i0;i<sz;i){if(s[i]>0&&s[i]<9){if((s[i]-0)>max1){max2max1;max1s[i]-0;}else if((s[i]-0)&l…

西井科技参与IATA全球货运大会 以AI绿动能引领智慧空港新未来

3月12日至14日&#xff0c;由国际航空运输协会IATA主办的全球货运大会&#xff08;World Cargo Symposium&#xff09;在中国香港成功举办&#xff0c;这是全球航空货运领域最大规模与影响力的年度盛会。作为大物流领域全球领先的“智能化与新能源化”综合解决方案提供商&#…

NLP:HanLP的下载与使用

昨天说到要做一个自定义的训练模型&#xff0c;但是很快这个想法就被扑灭了&#xff0c;因为这个手工标记的成本太大&#xff0c;而且我的上级并不是想要我做这个场景&#xff0c;而是希望我通过这个场景展示出可以接下最终需求的能力。换句话来说&#xff1a;可以&#xff0c;…

C语言之文件操作(万字详解)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言 文件的打开和关闭 流和标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 fputc的使用 fgetc的使用 fput…

嵌入式常用5种通信协议

简介&#xff1a; 嵌入式常用五种通信协议为&#xff1a;UART、RS232、RS485、IIC、SPI。 由于这几种通信协议十分相似又有区别&#xff0c;所以分组记忆&#xff0c;红色的为一组&#xff0c;蓝色的为一组。 ①组都有两条线&#xff0c;且都是异步通信没得时钟线&#xff0c…

C#快速入门基础

本篇文章从最基础的C#编程开始学习&#xff0c;经过非常优秀的面向对象编程思想和方法的学习&#xff0c;为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU&#xff08;建议 4核 4线程或以上 &#xff0…

【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)

微博爬虫记录 写这个主要是为了防止自己忘记以及之后的组内工作交接&#xff0c;至于代码美不美观&#xff0c;写的好不好&#xff0c;统统不考虑&#xff0c;我只能说&#xff0c;能跑就不错了&#xff0c;上学压根没学过python好吧&#xff0c;基本上是crtlc&ctrlv丝滑小…

Linux CentOS系统安装Spug并结合内网穿透实现远程访问本地运维平台

目录 前言 1. Docker安装Spug 2 . 本地访问测试 3. Linux 安装cpolar 4. 配置Spug公网访问地址 5. 公网远程访问Spug管理界面 6. 固定Spug公网地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux CentOS系统安装Spug并结合…

Nodejs 第五十四章(net)

net模块是Node.js的核心模块之一&#xff0c;它提供了用于创建基于网络的应用程序的API。net模块主要用于创建TCP服务器和TCP客户端&#xff0c;以及处理网络通信。 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;用于…

重塑语言智能未来:掌握Transformer,驱动AI与NLP创新实战

Transformer模型 Transformer是自然语言理解(Natural Language Understanding&#xff0c;NLU)的游戏规则改变者&#xff0c;NLU 是自然语言处理(Natural Language Processing&#xff0c;NLP)的一个子集。NLU已成为全球数字经济中AI 的支柱之一。 Transformer 模型标志着AI 新…

【学一点RISC-V】RISC-V IMSIC

IMSIC RISC-V AIA 文档 第三章 Incoming MSI Controller (IMSIC) 传入 MSI 控制器&#xff08;IMSIC&#xff09;是一个可选的 RISC-V 硬件组件&#xff0c;与 hart 紧密相连&#xff0c;每个 hart 有一个 IMSIC。IMSIC 接收并记录 Hart 的传入消息信号中断 (MSI)&#xff0c;并…

【C语言】文件操作篇-----程序文件和数据文件,文件的打开和关闭,二进制文件和文本文件,fopen,fclose【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作篇-----程序文件和数据文件&#xff0c;文件的打开和关闭&#xff0c;二进制文件和文本文件【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 在了解完动态内存管…

QT:用opencv的KNN识别图片中的LED数字(一)

前言 一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。 (正在写,未完成,稍候) 效果一预览: 效果二预览: 效果三预览: 正在写。。。 设计思路 1. 软件UI设计 2. …

leetcode刷题(javaScript)——堆相关场景题总结

堆是什么&#xff1f;堆都能用树表示&#xff0c;并且一般树的实现都是利用链表。平时使用的最多的是二叉堆&#xff0c;它可以用完全二叉树表示&#xff0c;二叉堆易于存储&#xff0c;并且便于索引。在堆的实现时注意&#xff1a;因为是数组&#xff0c;所以父子节点的关系就…

Palworld幻兽帕鲁管理员操作手册

Palworld幻兽帕鲁管理员操作手册 大家好我是艾西&#xff0c;在我们搭建完幻兽帕鲁服务器后肯定会涉及到后期的维护比如&#xff1a;角色修改&#xff0c;帕鲁修改&#xff0c;异常删除&#xff0c;公会修改&#xff0c;清理玩家&#xff0c;清理建筑&#xff0c;存档迁移等数…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

脚手架cli快速创建Vue2/Vue3项目

前言&#xff1a; 本文的nodejs版本是14.21.3 第一步 进入cmd窗口 1、全局安装webpack npm install webpack-g&#xff0c; npm install webpack-g 第二步 2、全局安装vue脚手架 npm install -g vue/cli 第三步 3、初始化vue项目 &#xff08;vue脚手架使用webpack模…

ArcGIS学习(十五)用地适宜性评价

ArcGIS学习(十五)用地适宜性评价 本任务给大家带来的内容是用地适宜性评价。 用地适宜性评价是大家在平时工作中最常接触到的分析场景之一。尤其是在国土空间规划的大背景下,用地适宜性评价变得越来越重要。 此外,我们之前的任务主要是使用矢量数据进行分析。本案例是主讲…