vite+vue3+ts项目搭建之集成qiankun让其成为子应用模板(vite+vue3+ts+qiankun项目)

news/2024/4/27 18:37:04/文章来源: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、router.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_404405.aspx

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

相关文章

在Eclipse 中使用 Maven 创建雅加达 EE 应用程序

在本教程中,我将指导大家如何在 Eclipse 中创建新的雅加达 EE 应用程序支持 Maven。 首先,在 Eclipse 中,转到“文件”,选择“新建”,然后选择“Maven 项目”: 要使用 Maven 创建雅加达 EE 项目&#xff0…

操作系统闲谈01——IO多路复用

IO多路复用 同步异步IO问题 select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读…

贴片电阻的读数方法

贴片电阻图 今天讲一下贴片电阻的阻值、精度与贴片电阻丝印之间细微的关系。 大家经常见到的贴片电阻上的丝印有纯数字、数字与R组合、数字与除R之外的字母组合的,但大家知不知道这样的标注与贴片电阻的i精度相关?同一个阻值因为精度不同,标…

【Git】Git基本配置和常用命令

💭💭 ✨: git基本配置和命令   💟:东非不开森的主页   💜:学习的过程就是不断接触错误,不断提升自己,冲鸭💜💜   🌸: 如有错误或不…

从前端到全栈

你会学到什么? 掌握 Node.js 开发必备基础知识;理解 HTTP 协议核心原理与实践;基于 Node.js 实现自己的工程脚手架;从 0 打造在线绘图 Web 应用。 作者介绍 月影,字节跳动 ByteTech 负责人,资深 JavaScript 程序员&am…

GeoDetector --- 最优参数离散化

安装R包 (直接在RStudio安装GD包) install.packages("GD")加载数据 library(GD) #加载GD包 setwd("X:\\work\\GD") #设置工作路径 data1<-read.csv("data_raw.csv") #读取数据(未经离散化处理的原始数据) head(data1) #可以查看数…

(附源码)计算机毕业设计SSM基于的英语学习网站的设计与实现

&#xff08;附源码&#xff09;计算机毕业设计SSM基于的英语学习网站的设计与实现 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

ZK集群搭建和Hadoop单机版及Java API简单操作

一、背景 作为软件界最为复杂度的软件代表&#xff0c;当时操作系统、数据库、中间件。而学习中间件&#xff0c;分布式系统&#xff0c;必然绕不开zookeepr、Hadoop的学习。以下做个人搭建zookeeper和Hadoop的搭建的简单记录。相关的代码操作放在github上。 二、搭建过程 1、…

Markdown使用方法

Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版。它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML、PDF 以及本身的 .md 格式的文件。因简洁、高效、易读、易写,Markdown被大量使用,如Github、Wikipedia、简书等。 基本语法…

【ffmpeg】YUV实践

【ffmpeg】YUV实践前言生成YUV使用摄像头采集到YUV数据从现有的视频文件中提取YUV数据播放YUV播放Y分量提取各分量参考资料个人简介 &#x1f4e6;个人主页&#xff1a;一二三o-0-O的博客 &#x1f3c6;技术方向&#xff1a;C/C客户端资深工程师&#xff08;直播音视频剪辑&…

Spring 6.0 要来了,太强了

Spring Framework 6.0 发布了首个 RC 版本。 发布公告写道&#xff0c;Spring Framework 6.0 作为重大更新&#xff0c;目前 RC1 要求使用 Java 17 或更高版本&#xff0c;并且已迁移到 Jakarta EE 9&#xff08;在 jakarta 命名空间中取代了以前基于 javax 的 EE API&#xff…

HTML零基础入门(上)

一、什么是HTML html是一门标记性语言 全称是超文本标记语言(Hyper Text Markup Language)&#xff0c;它是用来描述网页的一种语言。 HTML 不是一种编程语言&#xff0c;而是一种标记语言 (markup language)。 html只是用来制作网页的一种语言&#xff0c;由各种各样的标签…

Visual Code配置C/C++

1. 前言 VS Code和以前的Visual studio 开发环境不一样,只是代码编辑器,如果需要运行代码C/C++,需要额外安装编译器。在Linux环境下,一般系统自带了gcc编译器,但是windows环境没有,所以要额外安装编译器,选择MinGW。总体参考资料: C/C++ for Visual Studio Code2. MinG…

ZnCdTe/ZnS三元/Cu2MoS4荧光量子点/MoS2QDs二硫化钼量子点的制备

瑞禧小编这里给大家准备了ZnCdTe/ZnS三元/Cu2MoS4荧光量子点/MoS2QDs二硫化钼量子点的制备步骤与方法&#xff0c;一起来学习吧&#xff01; MoS2QDs二硫化钼量子点的制备 以钼酸钠提供钼源,谷胱甘肽提供硫源,通过"自下而上"一步水热法制备MoS2 QDs,并以其荧光强度作…

Oracle——行转列与列转行

文章目录行转列创建表和增加测试数据方式一&#xff1a;先分组&#xff0c;再统计平铺方式二&#xff1a;使用Oracle11g自带函数PIVOT实现列转行创建表和增加测试数据方式一&#xff1a;union all 单个合并方式二&#xff1a;unpivot 函数实现总结资料参考行转列 把某一个字段…

Js中六种拖拽(拉)事件(drag 和 drop)

拖拽事件 今天同事问有没有实现过表格的拖拽功能&#xff0c;我当时想的是应该跟图片的拖拽代码逻辑是一样的主要是使用了浏览器中的以下几个事件 例如&#xff1a; 一、dragstart 二、dragend 三、dragover 四、dragenter 五、drop 等 文章目录拖拽事件前言(各个浏览器的兼容性…

基于matlab的神经网络设计,深度神经网络代码matlab

为什么谈论深度学习工具时&#xff0c;很少有人讨论matlab的神经网络工具包 首先深度学习不光是在学术界非常火热, 在工业界也有着大量的运用, 这就要求深度学习框架要方便在服务器上部署, 而这个恰恰是Matlab的软肋, 想象一下你前端用个Django做个页面接受用户输入的图像, 后…

【Linux驱动开发】并发控制机制:原子操作、自旋锁、信号量、互斥锁详解

并发控制机制 首先我们来了解一下 “操作系统的并发性” 这个概念&#xff1a; 操作系统的并发性(concurrence)&#xff1a;指的是两个或者两个以上事件在同一时间间隔内发生&#xff0c;即这个设备一会执行这个事件一会执行那个事件&#xff0c;多个事件共同使用一个设备。 操…

yolov5和yolov7之实例分割训练

还没来得及实验&#xff0c;我在这里就给出几个参考的链接 1、How to train your segmentation data with seg in U7? What is the data set format?Thanks&#xff01;&#xff01; Issue #732 WongKinYiu/yolov7 GitHub 2、JSON2YOLO/general_json2yolo.py at master …

南大通用GBase8s 常用SQL语句(287)

UPDATE 语句 使用 UPDATE 语句来更改表或视图中一个或多个现有的行的一个或多个列中的值。 语法 Target WHERE 选项 元素 描述 限制 语法 alias 您在此为本地表或远程表声明的临时的名称 如果 SET 是 alias 的标识符&#xff0c;则 AS 关键字必须在 alias 之前 …