位置: IT常识 - 正文

微前端架构-qiankun在vue3的应用(微前端架构实现)

编辑:rootadmin
微前端架构-qiankun在vue3的应用

推荐整理分享微前端架构-qiankun在vue3的应用(微前端架构实现),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:微前端架构框架,微前端架构框架,微前端架构qiankun-vue,微前端架构有哪些,微前端架构qiankun-vue,微前端架构实现,微前端架构qiankun-vue,微前端架构qiankun-vue,内容如对您有帮助,希望把文章链接给更多的朋友!

本文章介绍了qiankun在vue3的应用,其中子应用有vue2、vue3、react、angular

介绍

qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 其他几款([single-spa]、[micro-app]、[百度emp]])

使用 iframe 整合系统时,假设我们有系统 A, 当我们想把系统 B 引入 A 系统时,只需要 B 系统提供一个 url 给 A 系统引用即可,这里我们把 A 系统叫做父应用,把 B 系统叫做子应用。同样的,微前端也延续了这个概念,微前端在使用起来基本和使用 iframe 一样平滑。

结构

主应用(父),微应用(子)

案例一、主应用主应用不限技术栈,只需要提供一个容器 DOM,然后注册微应用并 start 即可。创建主应用项目 -vue3npm install @vue/cli -gvue create qiankun-tast在主应用中安装qiankun框架$ yarn add qiankun # 或者 npm i qiankun -S在 主应用 中注册微应用

main.js:

import { createApp } from 'vue'import App from './App.vue'import router from './router/index'import ElementPlus from 'element-plus'import 'element-plus/dist/index.css'import 'zone.js';import { registerMicroApps } from 'qiankun';registerMicroApps([ // { // name: "vue2App", // props: { age: 10 }, //给子应用传数据 // entry: "//localhost:3001", //默认会加载这个html,解析里面的js,动态执行(子应用必须支持跨域)里面,是用fetch去请求的数据 // container: "#out-main", //挂载到主应用的哪个元素下 // activeRule: "/vue2", //当我劫持到路由地址为/vue2时,我就把http://localhost:3000这个应用挂载到#app-main的元素下 // }, { name: "vueChildOne", entry: "//localhost:3001", container: "#child-vue3-one-content", activeRule: "/child-one", }, { name: "vueChildTwo", entry: "//localhost:3002", container: "#child-vue3-two-content", activeRule: "/child-two", }, { name: "vue2Child", entry: "//localhost:3003", container: "#child-vue2-one-content", activeRule: "/child-vue2-one", }, { name: "reactApp1", entry: "//localhost:4001", container: "#child-react-one-content", activeRule: "/child-react-one", }, { name: "angularApp1", entry: "//localhost:4200", container: "#child-angular-one-content", activeRule: "/child-angular-one", },]);// setDefaultMountApp('/child-one')// 启动 qiankun// start();createApp(App).use(ElementPlus).use(router).mount('#app-base')

App.vue

<template> <div class="common-layout"> <el-container> <el-aside width="200px"> <el-menu> <el-menu-item index="1"> <el-icon><icon-menu /></el-icon> <span @click="goHome">首页</span> </el-menu-item> <el-menu-item index="2"> <el-icon><icon-menu /></el-icon> <span @click="$router.push('/child-one')">child-vue3-one</span> </el-menu-item> <el-menu-item index="3"> <el-icon><document /></el-icon> <span @click="$router.push('/child-two')">child-vue3-one</span> </el-menu-item> <el-menu-item index="4"> <el-icon><document /></el-icon> <span @click="$router.push('/child-vue2-one')">child-vue2-one</span> </el-menu-item> <el-menu-item index="5"> <el-icon><document /></el-icon> <span @click="$router.push('/child-react-one')">child-react-one</span> </el-menu-item> <el-menu-item index="6"> <el-icon><document /></el-icon> <span @click="$router.push('/child-angular-one')">child-angular-one</span> </el-menu-item> </el-menu> </el-aside> <el-main> <router-view></router-view></el-main> </el-container> </div></template><script>export default { name: "App", components: {}, methods: { // 跳转页面方法 goHome() { this.$router.push("/"); }, },};</script><style>.bens { width: 100%; display: flex; justify-content: center; position: absolute; top: 15px; left: 0; z-index: 9999999;}#app-base { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px;}</style>

index.html:

// 将id:app 改为 app-base 自定义就行,只要与main.js对应起来,切不与微应用重复<div id="app-base"></div>

router.js

import { createRouter, createWebHistory } from "vue-router";// 2. 配置路由const routes = [ { path: "/", name: "home", component: () => import("@/views/home/index.vue"), }, { path: "/child-one", component: () => import("@/views/childOne/index.vue"), }, { path: "/child-two", component: () => import("@/views/childTwo/index.vue"), }, { path: "/child-vue2-one", component: () => import("@/views/childVue2One/index.vue"), }, { path: "/child-react-one", component: () => import("@/views/childReactOne/index.vue"), }, { path: "/child-angular-one", component: () => import("@/views/childAgOne/index.vue"), },];// 1.返回一个 router 实列,为函数,里面有配置项(对象) historyconst router = createRouter({ mode: 'history', history: createWebHistory(), routes,});// 3导出路由 然后去 main.ts 注册 router.tsexport default routervue3子应用创建项目// 选择vue3这个版本vue create child-one

在 src 目录新增 public-path.js

解决静态文件跨域

// src/public-path.jsif(window.__POWERED_BY_QIANKUN__) { __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;}修改路由文件,建议使用history 模式的路由,并设置路由 base,值和它的 activeRule 是一样的。import { createRouter, createWebHashHistory, createWebHistory } from "vue-router";// 2. 配置路由const routes = [ { path: '/', component: () => import('@/views/home/index.vue'), }, { path: '/about', component: () => import('@/views/about/index.vue'), },];// 1.返回一个 router 实列,为函数,里面有配置项(对象) historyconst router = createRouter({ mode: 'history', base: window.__POWERED_BY_QIANKUN__ ? "/child-one" : "/", history: createWebHashHistory('/child-one'), routes,});// 3导出路由 然后去 main.ts 注册 router.tsexport default router入口文件 main.js 修改,为了避免根 id #app 与其他的 DOM 冲突,需要限制查找范围。并导出三个生命周期函数。import { createApp } from 'vue'import App from './App.vue'import router from './router/index'import './public-path'// createApp(App).mount('#app')let instance = null;function render(props = {}) { if (instance) return; const { container } = props; console.log(container); instance = createApp(App) .use(router) .mount(container ? container.querySelector("#app-child-one") : "#app-child-one");}// 独立运行时if (!window.__POWERED_BY_QIANKUN__) { render();}export async function bootstrap() { console.log("[vue] vue app bootstraped");}export async function mount(props) { console.log("[vue] props from main framework", props); render(props);}export async function unmount() { //可选链操作符 instance.$destroy?.(); instance = null;}主应用容器子应用 qiankun-test/src/views/childOne/index.vue<template> <h2>我是子应用 vue3-one</h2> <div id="child-vue3-one-content"></div></template><script>import { start } from "qiankun";export default { name: "childOne", components: {}, mounted() { if (!window.qiankunStarted) { window.qiankunStarted = true; start(); } },};</script><style></style>运行效果如下:

vue2子应用-child-vue2

微前端架构-qiankun在vue3的应用(微前端架构实现)

childVue2One/index.vue

<template> <h2>我是微应用vue2项目</h2> <div id="child-vue2-one-content"></div></template><script>import { start } from "qiankun";export default { name: "vueChild", components: {}, mounted() { this.$nextTick(() => { if (!window.qiankunStarted) { window.qiankunStarted = true; start(); } }); },};</script><style></style>微应用配置child-vue2

src下创建public-path.js

if (window.__POWERED_BY_QIANKUN__) { __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__}

main.js

// src/main.jsimport Vue from 'vue'import App from './App'import router from './router'import "./public-path";Vue.config.productionTip = false// 定义一个Vue实例let instance = null// 渲染方法function render(props = {}) { const { container } = props instance = new Vue({ router, render: (h) => h(App) }).$mount(container ? container.querySelector('#app'): '#app')}// 独立运行时if(!window.__POWERED_BY_QIANKUN__) { render()}//暴露主应用生命周期钩子/** * bootstrap : 在微应用初始化的时候调用一次,之后的生命周期里不再调用 */export async function bootstrap() { console.log('vue2-app bootstraped');}/** * mount : 在应用每次进入时调用 */export async function mount(props) { console.log('vue2-app mount', props); render(props);}/** * unmount :应用每次 切出/卸载 均会调用 */export async function unmount() { console.log("vue2-app unmount") instance.$destroy(); instance.$el.innerHTML = ''; instance = null;}

vue.config.js

module.exports = { lintOnSave: false, devServer: { port: "3003", headers: { "Access-Control-Allow-Origin": "*", //所有人都可以访问我的服务器 }, }, configureWebpack: { output: { // library: `${name}-[name]`, library: `vueChildOne`, libraryTarget: "umd", // 把微应用打包成 umd 库格式 // jsonpFunction: `webpackJsonp_${name}`, }, },};

router.js

import { createRouter, createWebHashHistory, createWebHistory } from "vue-router";// 2. 配置路由const routes = [ { path: '/', component: () => import('@/views/home/index.vue'), }, { path: '/about', component: () => import('@/views/about/index.vue'), },];// 1.返回一个 router 实列,为函数,里面有配置项(对象) historyconst router = createRouter({ mode: 'history', base: window.__POWERED_BY_QIANKUN__ ? "/child-one" : "/", history: createWebHashHistory('/child-one'), routes,});// 3导出路由 然后去 main.ts 注册 router.tsexport default routervue2错误问题

路由版本不对

下载指定版本在3*的就行

react子应用

问题当修改入口文件index.tsx之后,主要是添加了qiankun的生命周期之后,报错

– You need to export lifecycle functions in reactApp1 entry

明明我已经写了生命周期但是没有生效。 问题出在:官方问题使用的js语法,我使用的是ts语法。 解决:用react-app-rewired方案复写webpack就可以了。作用:通过react-app-rewired插件,react-app-rewired的作用就是在不eject的情况下,覆盖create-react-app的配置.

angular子应用

angular由于在国内用的不多所以我是按照官方教程完成的,当然中间出了很多狗血的错误

官方:以 Angular-cli 9 生成的 angular 9 项目为例,其他版本的 angular 后续会逐渐补充。 这句话就是一个坑,首先我自己原有的angular版本是12,用 ng 命令安装的项目就是最新的了。这个导致我安装官方操作一直没有成功,不断报错。------我放弃了,做个乖孩子,用angular9

由于不能降低电脑全局版本,于是我在本项目中安装了一个angular-cli9

npm install @angular/cli@9.0.1ng new child-angular1

版本搞成了9那就好办了

根据要求配置好主应用的main.js与App.vue文件在主应用views创建anguale的容器.vue文件配置主应用路由然后就是根据qiankun的文档配置文件了

注意:在qiankun的文档中第二步,child-angular-one这个是和主应用配置路由一致 设置 history 模式路由的 base,src/app/app-routing.module.ts 文件:

import { NgModule } from '@angular/core';import { Routes, RouterModule } from '@angular/router';import { APP_BASE_HREF } from '@angular/common';const routes: Routes = [];@NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule], // @ts-ignore // child-angular-one 必须和主路由向对应 providers: [{ provide: APP_BASE_HREF, useValue: window.__POWERED_BY_QIANKUN__ ? '/child-angular-one' : '/' }]})export class AppRoutingModule { }

gitee地址:qiankun-vue3

本文链接地址:https://www.jiuchutong.com/zhishi/289602.html 转载请保留说明!

上一篇:拍摄于二连浩特恐龙博物馆中的英仙座流星雨,中国内蒙古 (© bjdlzx/Getty Images)(二连浩特老照片)

下一篇:GWO灰狼优化算法综述(Grey Wolf Optimization)(灰狼算法的改进)

  • 淘宝店铺如何做推广 迅速成为淘宝皇冠店铺(淘宝店铺如何做账)

    淘宝店铺如何做推广 迅速成为淘宝皇冠店铺(淘宝店铺如何做账)

  • 爱山东怎样注册(爱山东怎样注册账号和密码)

    爱山东怎样注册(爱山东怎样注册账号和密码)

  • 微信如何撤回发错的消息(微信如何撤回发出的好友申请)

    微信如何撤回发错的消息(微信如何撤回发出的好友申请)

  • 抖音字体可以设置大小吗(抖音字体可以设置特定的人看吗怎么设置)

    抖音字体可以设置大小吗(抖音字体可以设置特定的人看吗怎么设置)

  • 微信分身怎么登录2个(微信分身怎么登录王者荣耀)

    微信分身怎么登录2个(微信分身怎么登录王者荣耀)

  • 屏幕晃动怎么回事(屏幕晃来晃去)

    屏幕晃动怎么回事(屏幕晃来晃去)

  • 微信加入黑名单还能看到朋友圈吗(微信加入黑名单怎么拉出来)

    微信加入黑名单还能看到朋友圈吗(微信加入黑名单怎么拉出来)

  • jmm-tl10什么型号(jmm_al10什么机型)

    jmm-tl10什么型号(jmm_al10什么机型)

  • iphone7刷新率(iphone7刷新率多少hz)

    iphone7刷新率(iphone7刷新率多少hz)

  • 通常微机中所指的80486是(在常见微机中cpu的主要作用是)

    通常微机中所指的80486是(在常见微机中cpu的主要作用是)

  • gpk是什么文件(gpg是什么格式的文件)

    gpk是什么文件(gpg是什么格式的文件)

  • 通话中断是什么意思(什么叫通话中断)

    通话中断是什么意思(什么叫通话中断)

  • access数据库中可以定义格式属性的字段类型是(access数据库可以包含几个数据表)

    access数据库中可以定义格式属性的字段类型是(access数据库可以包含几个数据表)

  • 收款小助手怎么添加成员(收款小助手怎么删除成员)

    收款小助手怎么添加成员(收款小助手怎么删除成员)

  • 如何解绑手机号(如何解绑手机号绑定的QQ号)

    如何解绑手机号(如何解绑手机号绑定的QQ号)

  • 怎么删除表格里的文字(怎么删除表格里的空白行)

    怎么删除表格里的文字(怎么删除表格里的空白行)

  • 微信跟拍是什么意思啊(微信上的跟拍有什么用)

    微信跟拍是什么意思啊(微信上的跟拍有什么用)

  • 抖音关注5000已满怎么办(抖音关注5000已满怎么办能不能扩大)

    抖音关注5000已满怎么办(抖音关注5000已满怎么办能不能扩大)

  • 联动云押金退款进度在哪看(联动云押金退款多久到账)

    联动云押金退款进度在哪看(联动云押金退款多久到账)

  • 手机如何将图片转文字(手机如何将图片压缩打包发送)

    手机如何将图片转文字(手机如何将图片压缩打包发送)

  • vivo怎样取消锁屏壁纸  (vivo怎样取消锁屏)

    vivo怎样取消锁屏壁纸 (vivo怎样取消锁屏)

  • 怎样查询宽带是否欠费(怎样查询宽带是否正常连接)

    怎样查询宽带是否欠费(怎样查询宽带是否正常连接)

  • Vue+EleMentUI实现el-table-colum表格select下拉框可编辑(element ui+vue)

    Vue+EleMentUI实现el-table-colum表格select下拉框可编辑(element ui+vue)

  • 2022年如何在Windows11和Windows10上录制内部音频播放器5种免费方式-OK教程(2022年如何在股室工作中落实党风见证)

    2022年如何在Windows11和Windows10上录制内部音频播放器5种免费方式-OK教程(2022年如何在股室工作中落实党风见证)

  • 小规模缴纳企业所得税会计分录
  • 退休金合并其他收入缴纳个税
  • 海关进口增值税专用缴款书如何抵扣
  • 个人社保由单位承担的可以进福利费吗
  • 应付利润的核算内容
  • 应收票据怎么写
  • 低值易耗品摊销方法
  • 非在职员工是什么意思
  • 应付账款多付了会计分录
  • 减少实收资本会引起资产和所有者权益发生变化吗
  • 厂房出租税收分类
  • 商业企业取得农产品税收
  • 增值税缴纳地方怎么填
  • 股东个人借款用于公司怎么处理
  • 分公司分税
  • 其他资本公积如何花掉
  • 发票密码区是干啥的
  • 因为质量问题
  • 小规模纳税人如何开专票
  • 税金及附加包括所得税费用吗
  • 员工的罚款计入什么科目
  • 公司多缴税款超过3年怎么办
  • 专用发票怎样申报
  • Linux下使用quota命令管理磁盘空间的实例教程
  • php的数据类型主要有哪几种
  • 企业类型变更是什么意思
  • 固定资产终止确认的会计处理
  • 外购商品转为自用洧费税计算
  • php解析xml数据
  • 基于微信小程序制作
  • nyud数据集
  • 经费支出的定义
  • 利息收入的纳税调整
  • 购买茶叶怎么入账
  • 工资如何记账
  • phpcms v9 getshell
  • 长期股权投资的交易费用计入哪里
  • 增值税专用发票的税率是多少啊
  • 一般整形医院的药在哪进货
  • microsoft SQL server 2008有什么用
  • 兼营和混合销售怎么区分
  • 现代服务业进项抵扣新政策
  • 应交税金及附加怎么计算
  • 申请财产损失会计分录
  • 借款利息收入开发票
  • 季节性停工损失计入存货成本吗
  • 募捐建议
  • 净利润为负数还计提盈余公积吗
  • 成本发票未到如何结转成本
  • 出售固定资产已开票未收款账务处理
  • 收到公益性捐赠计入什么科目
  • 美国支票名字不一致
  • 开发票时如何添加商品编码?
  • truncate可以删除部分数据
  • 用命令创建文件夹
  • macos怎么操作
  • 清理c盘清理
  • win7系统权限设置
  • win2008 R2 与SP1 PS2无法安装操作系统补丁的解决办法
  • ubuntu中如何设置克隆屏
  • ubuntu简单的命令
  • 虚拟机怎么安装exe文件
  • zmweb.exe是什么进程
  • centos下安装gcc
  • win7无法双击打开软件
  • win7的收藏夹在哪里
  • linux的特殊权限
  • win10预览版21277
  • dmg是啥文件
  • win7如何卸载打印机驱动程序
  • ie6浏览器兼容模式怎么设置在哪里
  • mare的用法
  • 深入理解新发展理念
  • android/data/wifipwd
  • jQuery height()、innerHeight()、outerHeight()函数的区别详解
  • 2023年新农合缴费
  • 四川省国家电子税务局网上申报
  • 湖北省税务局网站授权
  • 佛山市国家税务局科长陈科长
  • 企业租入房子用交税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设