vite+vue3+ts项目搭建之集成qiankun让其成为子应用模板,并能实现主子应用之间跳转切换(新增在线预览地址)

news/2024/5/21 0:14:39/文章来源:https://blog.csdn.net/cwin8951/article/details/127431084

前言

以下操作,是续接之前 第四步 ——即:vite+vue3+ts+pinia+element-plus项目已完成搭建好,可以直接业务开发了
主应用技术栈:vue2+webpack+js

集成qiankun(微前端)

1、安装vite-plugin-qiankun

npm install vite-plugin-qiankun

2、vite.config.ts文件修改,代码如下:

import qiankun from 'vite-plugin-qiankun'
const packName = require('./package').name  // 必须要指定当前子应用命名// 配置NG——这个是与后台、运维约定好的,做NG转发;即主应用地址+子应用base就会直接NG转发base: '/vitedemo',plugins: [// 配置qiankunqiankun(`${packName}`, {useDevMode: true}),...]

注意点:
本地启动测试主子应用切换需要在server:{}里面添加headers: {‘Access-Control-Allow-Origin’: ‘*’ }, 解决主应用跳子应用跨域问题

server: {headers: {'Access-Control-Allow-Origin': '*'},host: '0.0.0.0',port,open: true,https: false,...}

2、main.ts文件修改,完整代码如下:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
// 所有业务api接口
import api from './api'
/*** element-plus*/
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// 因element-plus默认是英文,我们指定一下默认中文
import locale from 'element-plus/lib/locale/lang/zh-cn'
// 图标并进行全局注册
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
// pinia代替vuex
import pinia from './store'
// 权限控制(全局路由守卫)
import './permission'
/*** 样式*/
// 公共样式
import '@/assets/styles/index.scss'
// 初始化样式
import 'normalize.css'
// 统一注册 baseComponents
import baseComponentsInstall from '@/components/baseComponents/install'
// svg渲染
import SvgIcon from '@/components/SvgIcon/index.vue'
/*** 配置qiankun*/
import { renderWithQiankun, qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
let instance: any = null
function render(props: any = {}) {const { container } = propsinstance = createApp(App)instance.use(router)instance.use(pinia)// 注册全局api方法instance.config.globalProperties.$api = api// 注册所有图标for (const [key, component] of Object.entries(ElementPlusIconsVue)) {instance.component(key, component)}// 注册ElementPlusinstance.use(ElementPlus, {locale // 语言设置// size: Cookies.get('size') || 'medium' // 尺寸设置})// 自动注册全部本地组件instance.use(baseComponentsInstall)// 全局组件祖册instance.component('SvgIcon',// 如果这个组件选项是通过 `export default` 导出的,那么就会优先使用 `.default`,否则回退到使用模块的根SvgIcon.default || SvgIcon)instance?.mount(container ? container.querySelector('#app') : '#app')console.log('开始加载相关内容')
}
renderWithQiankun({mount(props: any) {render(props)},bootstrap() {console.log('%c', 'color:green;', ' ChildOne bootstrap')},update() {console.log('%c', 'color:green;', ' ChildOne update')},unmount(props: any) {console.log('unmount', props)instance.unmount()instance._container.innerHTML = ''instance = null}
})
if (!qiankunWindow.__POWERED_BY_QIANKUN__) {console.log('并不是qiankun渲染')render()
}

3、index.ts文件修改,完整代码如下:

import { createRouter, createWebHistory } from 'vue-router'
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
import Layout from '@/layout/index.vue'
import login from '@/views/login.vue'
export const constantRoutes: any = qiankunWindow.__POWERED_BY_QIANKUN__? [{path: '/login',name: 'login',component: login,hidden: true,meta: {rootPage: true,noCache: true}},{path: '/redirect',component: Layout,hidden: true,children: [{path: '/redirect/:path(.*)',component: () => import('@/views/redirect.vue')}]},{path: '',component: Layout,redirect: 'index',hidden: true,children: [{path: '/index',component: () => import('@/views/index.vue'),name: 'index',hidden: true,meta: { title: '首页', icon: 'monitor', noCache: true, affix: true }}]}]: [{path: '/redirect',component: Layout,hidden: true,children: [{path: '/redirect/:path(.*)',component: () => import('@/views/redirect.vue')}]},{path: '/login',component: login,hidden: true,meta: {noCache: true}},{path: '/404',component: () => import('@/views/error/404.vue'),hidden: true},{path: '/401',component: () => import('@/views/error/401.vue'),hidden: true},{path: '',component: Layout,redirect: 'index',hidden: true,children: [{path: '/index',component: () => import('@/views/index.vue'),name: 'index',hidden: true,meta: { title: '首页', icon: 'monitor', noCache: true, affix: true }}]}]const router = createRouter({history: createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/' : '/vitedemo/'),routes: constantRoutes,
})
export default router

3、全局路由守卫permission.ts文件修改,完整代码如下:

import router from './router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/cookies'
import { ElMessage } from 'element-plus'
import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'
import useUserStore from '@/store/modules/user'
import usePermissionStore from '@/store/modules/permission'
NProgress.configure({ showSpinner: false })
const whiteList = ['/login']
router.beforeEach((to: any, from: any, next: Function) => {NProgress.start()if (getToken()) {if (to.path === '/login') {next({ path: '/' })NProgress.done()} else {if (usePermissionStore().sysMenu.length === 0) {// 路由信息是不是组装完useUserStore().GetInfo()usePermissionStore().generateRoutes().then((accessRoutes: any) => {accessRoutes.forEach((rout: any) => {router.addRoute(rout) // 动态添加可访问路由表})next({ ...to, replace: true })}).catch(err => {useUserStore().FedLogOut()ElMessage.error(err.message || err.msg || '出现错误,请稍后再试')next({ path: '/' })})} else {// 进入页面前设置菜单if (!qiankunWindow.__POWERED_BY_QIANKUN__) {// 子应用单独运行,直接进入该系统const add_routes = toRaw(usePermissionStore().sysMenu)if (to.path === '/index') {let lastChild =add_routes[0]?.children?.length > 0? add_routes[0].children[0]: add_routes[0]if (to.path === lastChild.path) return falsenext(lastChild)NProgress.done()} else {console.log('子项目的next')next()}} else {console.log('主应用进入')next()}}}} else {if (whiteList.indexOf(to.path) !== -1) {next()} else {next(`/login`)NProgress.done()}}
})
router.afterEach(() => {NProgress.done()
})

4、其他文件修改,如下:

在这里插入图片描述

5、到此子应用已经配置完成

在这里插入图片描述

主应用跳转到子应用

主应用技术栈: vue2+js+element-ui

1、main.js修改,代码如下:

因为子应用是接口获取的,无效在单个注册

import { registerMicroApps, start } from "qiankun";
// 获取所有子应用
import childrenApp from './children.json'
// console.log('clientType=B', res)
const res = childrenApp
if (res.code == 200) {if (window.__POWERED_BY_QIANKUN__) {__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;}console.log('获取所有子应用', res.data)const apps = res.data.children && res.data.children.map((item) => {return {name: item.packageName,// 微应用package.json的name字段entry: item.entry,// 微应用访问地址,默认加载这个html页面并解析其中的js动态执行container: '#app', // 容器名activeRule: item.activeRule,// 激活路径,微应用路由}})apps && registerMicroApps(apps, {beforeLoad: async (app) => {console.log('before load', app)document.title = 'vue3+vite+ts'},beforeMount: [async (app) => {console.log('before mount', app.name)}]})// 启动 qiankunstart()
} else {Element.Message.warning('加载微应用失败,将无法访问子系统')
}
new Vue({router,store,render: h => h(App)
}).$mount("#app")

2、最终效果

在这里插入图片描述

组件地址

gitHub组件地址

gitee码云组件地址

在线预览地址

相关文章

基于ElementUi再次封装基础组件文档


vue3+ts基于Element-plus再次封装基础组件文档

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

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

相关文章

Gradle 入门说难也不难,说简单吧也不简单~

在学习过程中最痛苦的事,并不是认为自己坚持不下去学不会,而是对某块知识点的碎片信息学习了很多,仍然无法窥其门径,处于懵懂状态。 就拿Gradle来说,我之前就是这种状态,不管怎么去查阅文档和视频&#xf…

联邦学习(Federated Learning):技术角度的理解

联邦学习(Federated Learning):技术角度的理解 学习笔记 B站学习链接:https://www.bilibili.com/video/BV1YK4y1G7jw/?p7&vd_source7def3d3fc89c6921c7aeadf5e4023d35 1.背景与动机 例子 Example >> 问题&#xff1a…

AES加密解密算法设计(C++)

目 录 1. 背景与意义 4 2. 系统设计 5 2.1系统主要目标 5 2.2主要软件需求(运行环境) 5 2.3功能模块与系统结构 6 3 系统功能程序设计 8 3.1基本要求部分 8 3.1.1 字节替换 8 3.1.2行移位 9 3.1.3列混合 11 3.1.4密钥加 13 3.1.5密钥扩展 14 …

神经网络训练多少次合适,神经网络训练时间多长

1、tensorflow 训练一个神经网络 需要多长时间 基本使用 使用 TensorFlow, 你必须明白 TensorFlow: 使用图 (graph) 来表示计算任务. 在被称之为 会话 (Session) 的上下文 (context) 中执行图. 使用 tensor 表示数据. 通过 变量 (Variable) 维护状态. 使用 feed 和 fetch 可以…

【附源码】计算机毕业设计SSM实验室设备明细管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【自监督论文阅读笔记】Simmim: A simple framework formasked image modeling

本文介绍了 SimMIM,这是一个用于 掩码图像建模 的简单框架。本文简化了最近提出的相关方法,无需特殊设计,例如通过离散 VAE 或聚类 进行 block-wise 分块级的掩码 和 tokenization。为了研究 是什么让掩码图像建模任务学习良好的表示&#xf…

nginx----(1)nginx的单机安装

文章目录Nginx卸载开源版Nginx安装默认简单安装Nginx的源码复杂安装防火墙问题nginx启停安装成系统服务Nginx卸载 步骤一:需要将nginx的进程关闭 ./nginx -s stop步骤二:将安装的nginx进行删除 rm -rf /usr/local/nginx步骤三:将安装包之前编译的环境清除掉 mak…

opc client 客户端软件测试工具

一、概述: 本软件一款OPC客户端测试工具,使用本软件连接到OPC server服务端,获取server数据,简单好上手,软件也很小巧,操作便利,也是绿色软件,免安装。 二、软件基础环境保证&#x…

期货交易结算信息(期货结算系统)

期货中的结算价是怎么计算出来的? 最近常有新手投资者问:为什么期货账户收盘时年持仓是盈利的,怎么当天结算单上却是亏损的? 之所以会有这个疑问,是因为投资者没有明白期货收盘价、结算价、成交价三者之间的关系。今天…

dockerfile编写构建镜像

文章目录一、dockerfile1、什么是dockerfile2、原理二、docker镜像的创建1、创建镜像的三种方法①基于已有镜像创建②基于本地模板创建③基于dockerfile创建三、镜像分层的原理1、docker镜像结构的分层2、bootfs内核空间3、rootfs内核空间4、AUFS与overlay/overlay2overlay结构…

【ViT 微调时关于position embedding如何插值(interpolate)的详解】

目录1. 问题描述2. positional embedding如何interpolate3. 输入的sequence length改变了ViT还能正常前向推断?本文适合对Vision Transformer有一定了解(知道内部结构和一些实现细节,最好是精读过ViT这篇论文)的读者阅读&#xff…

八种可以简单判断否属于过敏体质的表现,符合四条就是了

最早感知春天的不是鸭子,而是过敏的人,最近门诊荨麻疹的人数逐渐增多。近20年来,随着过敏性鼻炎、湿疹、荨麻疹和哮喘的发病率越来越高,过敏体质开始越来越出名。在西医中,容易患上这种过敏性疾病的人被称为过敏体质。…

JVM(九) —— 运行时数据区之堆的详细介绍(四)

JVM(九)—— 运行时数据区之堆的详细介绍(四)TLAB堆空间常用的参数设置HandlePromotionFailure逃逸分析和栈上分配代码优化栈上分配同步省略分离对象或标量替换TLAB 堆区是线程共享区域,任何线程都乐意访问到堆区的共…

智能钢琴-第12届蓝桥杯Scratch省赛1真题第4题

[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第52讲。 第12届蓝桥杯青少年组省赛分两次进行,这是2020年10月19日举行的第一次省赛考试初级组,形式为在线考试。Scratch分为初级组和…

java实验报告3:数组和字符串案例练习

目录 内容 利用随机1~9整数生成3*3的二维数组,使二维数组每行,每列、以及斜线上的数字之和均为15,并输出这个二维数组 按自然数从小到大的标准为顺序,对以下数组求其逆序数,并列出逆序对: 实验小结 一、…

眼科考研院校排名及考研难度分析

眼科考研院校排名及考研难度分析 文章目录眼科考研院校排名及考研难度分析基础信息专业介绍学科范围和课程眼科学专业研究方向考研分析学校排名分数线学校推荐就业方向学习材料参考链接基础信息 专业介绍 眼科学(学科代码:100212)是临床医学…

Aptos 域名服务 (ANS) 上线主网

我们很高兴正式推出 Aptos 名称服务 (ANS)。我们正在通过使用 Aptos 构建一流的区块链体验来铺平道路,这就是我们在第一天推出域名服务的原因。 ANS 现在允许所有 Aptos 用户使用人类可读的 .apt 域名作为他们的 Aptos 钱包地址,而不是他们的公钥。 我们…

美化mac系统自带的Terminal.app工具

命令行工具对于开发人员来说,使用还是比较频繁的,但是mac自带Terminal.app工具的样式和功能实在一言难尽. 默认的样式 美化后的样式 下面为大家介绍如何操作. 我们使用的是oh-my-zsh 项目地址 我喜欢自己去安装, 不使用自动化脚本, 这样可以记录修改了哪些文件, 安装的文件…

黑盒测试-场景法

黑盒测试-场景法 1.场景法 1.1简介 1.简介:软件系统要想获得用户的认可,必须站在用户的角度, 以用户的使用逻辑及操作习惯为出发点,设计测试用例时 考虑用户使用软件的流程。然后,依据这些流程设计用例 设计才能更贴…

Day09-尚品汇-购物车静态组件与修改

一:把购物车成功页面的两个按钮完善一下(第一个) 1.在AddCartSuccess组件里面: 1.的后续 1》点这个 2》跳转会购物车的页面 二:把购物车成功页面的两个按钮完善一下(第二个) 1.先在文档里面找到…