微前端之qiankun的使用

2024-01-08 16:10
文章标签 使用 前端 frontend qiankun

本文主要是介绍微前端之qiankun的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

微前端之qiankun的使用

在之前的文章中谈到了single-spa的使用,为了多了解微前端的各类架构,在新的项目中使用了qiankun,接下来就说一说qiankun的使用

安装

1、使用vue cli 快速创建基座(vue-portal)和子应用1(vue-supervise)、子应用2(vue-threen)
2、基座应用 npm install qiankun --save

准备工作做好后,我们开始分别对基座和子项目进行配置

基座应用(vue-portal)的配置

1、main.js 同级创建micro-app.js

import store from './store'
import store1 from './vuex'
const microApps = [{name: 'vthreen',// entry: `http:XXXXXXX/vthreen/`, //测试环境地址entry: '//localhost:8500/vthreen/', //本地运行地址activeRule: '/vthreen',container: '#yourContainer',},{name: 'vsupervise',// entry: `http:XXXXXXX/vsupervise/`, //测试环境地址entry: 'http://localhost:8999/vsupervise/', //本地运行地址activeRule: '/vsupervise',container: '#yourContainer',},
]const apps = microApps.map(item => {return {...item,container: '#yourContainer', // 子应用挂载的divprops: {routerBase: item.activeRule, // 下发基础路由getGlobalState: store.getGlobalState, // 下发getGlobalState方法(主应用的一些信息)store1: store1.router || []}}
})
export default apps

2、main.js中使用

import Vue from 'vue'
import App from './App.vue'
import './assets/css/main.scss'
import {  registerMicroApps, start } from 'qiankun'
import ElementUI from 'element-ui'
import './router/engine'
import './utils/directive.js'
import * as components from './components'
import '@/assets/iconfont/iconfont.css' // fontclass使用
import '@/assets/iconfont/iconfont.js' //svg方式使用
import {  encrypt, decrypt } from '@/utils/encryp.js';import store from './vuex'
import Vuex from 'vuex'
import router from './router'
Vue.config.productionTip = false
Vue.prototype.encrypt = encrypt
Vue.prototype.decrypt = decryptVue.use(ElementUI)Vue.use(Vuex)
import api from './api'
Vue.prototype.$api = apiObject.keys(components).forEach(key => {const component = components[key]if (['Col', 'Form', 'Input'].includes(key)) {Vue.component(`I${key}`, component)} else {Vue.component(key, component)}if (['Modal', 'Message', 'Notice'].includes(key)) {Vue.prototype[`$${key}`] = component}
})const instance = new Vue({router,store,render: h => h(App)
}).$mount('#app')import microApps from './micro-app'
// 定义loader方法,loading改变时,将变量赋值给App.vue的data中的isLoading
function loader(loading) {if (instance && instance.$children) {// instance.$children[0] 是App.vue,此时直接改动App.vue的isLoadinginstance.$children[0].isLoading = loading}
}// 给子应用配置加上loader方法
const apps = microApps.map(item => {return {...item,loader}
})registerMicroApps(apps, {beforeLoad: app => {},beforeMount: [app => {}],afterMount: [app => {}],afterUnmount: [app => {}]
})
start()

3、 页面挂载设置

在那个页面挂载就在该页面的mounted

<template><div id="app"><el-container class="layout" v-if="!$route.meta.showAll"><el-header><common-header :config="config"></common-header><ul class="header-nav"><li class="menu-btn pointer" @click="goPortal"><i class="el-icon-arrow-left"></i>返回首页</li><li v-for="(sys, key) in sysList" class="pointer" :class="{'active': activeId == sys.appId}":key="key" @click="toggleSys(sys)">{{sys.appName}}</li></ul></el-header><router-view v-if="$route.meta.isSingle"></router-view><!-- yourContainer 挂载容器 --><div id="yourContainer" v-else></div> </el-container><router-view v-else></router-view></div>
</template><script>
import { mapGetters } from "vuex";
import { CommonHeader } from "vue-common";
import { start } from "qiankun";
import parser from 'vue-common/dist/router/parser'
import asyncRouter from '@/router/map/async.js'
export default {name: 'App',components: {CommonHeader,},data() {return {modulesMenu: [],sysList: [],config: this.$config,breadcrumbShow: false,activeId: ""};},computed: {...mapGetters({getSysList: 'getSysList',}),},watch: {getSysList(val) {this.sysList = val},// 切换路由时监听导航渲染'$route.path'(val) {this.updateActiveRouter()}},// 页面刷新时如果不是首页要加载侧边栏mounted() {if (!window.qiankunStarted) {window.qiankunStarted = true;start(); // 启动}},methods: {goPortal() {this.$router.push({ name: 'home' })}},created() {// this.getConfigJson()}
};
</script>

4、vue.config.js设置

module.exports = {transpileDependencies: ['common'],assetsDir: 'static',lintOnSave: false, // 是否使用eslintproductionSourceMap: false, // 关闭生产源映射加速生产构建devServer: {port: 9999, // 在.env中VUE_APP_PORT=7788,与父应用的配置一致headers: {'Access-Control-Allow-Origin': '*' // 主应用获取子应用时跨域响应头},proxy: {'/api': {target: 'http://192.162.130.141:9001',// target: 'http://172.160.1.4:9001',changeOrigin: true, //开启代理pathRewrite: {'^/api': ''}},},https: false, // 不支持https协议open: true, // 配置自动启动浏览器},chainWebpack: config => {const oneOfsMap = config.module.rule('scss').oneOfs.storeoneOfsMap.forEach(item => {item.use('sass-resources-loader').loader('sass-resources-loader').options({// 全局变量文件路径,只有一个时可将数组省去resources: ['./src/assets/css/main.scss']}).end()})config.plugin('html').tap((args) => {args[0].title = 'qiankun-example'return args})}
}

5、路由设置

基座应用也是history模式,但是base不需要设置
在这里插入图片描述

子应用的配置

1、vue.config.js同级创建一个.env文件,端口号要与基座micro-app.js中的配置一致

在这里插入图片描述

2、main.js同级创建public-path.js

(function () {if (window.__POWERED_BY_QIANKUN__) {if (process.env.NODE_ENV === 'development') {// eslint-disable-next-line__webpack_public_path__ = `//localhost:${process.env.VUE_APP_PORT}${process.env.BASE_URL}`return}// eslint-disable-next-line__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__// __webpack_public_path__ = `${process.env.BASE_URL}/`}
})()

3、main.js配置

import './public-path'
let instance = nullfunction render(props = {}) {const {container,routerBase} = props// const router = new VueRouter({//   base: window.__POWERED_BY_QIANKUN__ ? routerBase : process.env.BASE_URL,//   mode: 'history',//   routes// })//路由配置instance = new Vue({router,store,render: (h) => h(App)}).$mount(container ? container.querySelector('#vcatalog') : '#vcatalog')
}
if (!window.__POWERED_BY_QIANKUN__) {// 这里是子应用独立运行的环境,实现子应用的登录逻辑// 独立运行时,也注册一个名为global的store module// commonStore.globalRegister(store)// 模拟登录后,存储用户信息到global modulerender()
}export async function bootstrap() {}export async function mount(props) {render(props)
}export async function unmount() {instance.$destroy()instance.$el.innerHTML = ''instance = null
}

4、路由配置放在router index.js中了

所有子项目必须是history模式,base设置与基座micro-app.js中的配置一致
在这里插入图片描述

这篇关于微前端之qiankun的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/584023

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没