热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微前端乾坤(qiankun)初尝试

介绍qiankun是一个基于single-spa的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。公司有一个门户网站需要嵌入其他系统&#

介绍

qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。

公司有一个门户网站需要嵌入其他系统,使用iframe会有很多的兼容性问题,如果使用qiankun框架,不仅可以绕过这些iframe的坑,还可以进行很多的“骚操作”。

快速上手

qiankun官网的快速上手很简单,不是因为他们懒得写,而是引入qiankun的确是非常简单。

只需要在主应用中引入qiankun,微服务做相应的配置,就可以,下面就介绍我在项目中如何引入。

主应用


  • 安装

    npm install -S qiankun

  • 在main.js入口文件

    import { registerMicroApps, start } from 'qiankun';
    const getActiveRule = (hash) => (location) => location.hash.startsWith(hash);registerMicroApps([{name: 'TPP', entry: 'http://localhost:7000/',// 主应用挂载的节点container: '#TPP',// 主应用使用的hash模式activeRule: getActiveRule('#/TPP'),},{name: 'PTP', entry: 'http://localhost:7001/',// 主应用挂载的节点container: '#PTP',// 主应用使用的hash模式activeRule: getActiveRule('#/PTP'),},
    ]);
    start();


微服务配置( vue/cli3创建应用)


仅针对开发环境


  • 微服务入口文件

qiankun会在微应用注入一个全局变量,用于针对此变量来做一些配置

if (window.__POWERED_BY_QIANKUN__) {
// 如果是正常访问,则为undefined,如果是qiankun访问,则为true__webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
function render(props = {}) {/** props 参数container: 主应用挂载微应用的节点mountParcel: ƒ ()name: "TPP" 微应用nameonGlobalStateChange: ƒ onGlobalStateChange(callback, fireImmediately)setGlobalState: ƒ setGlobalState()singleSpa*/const { container } = props;const mountPath = container ? container.querySelector('#TPPAPP') : '#TPPAPP';window.sfopenpc = new Vue({render: (h) => h(App),store,router,}).$mount(mountPath);
}// 如果正常访问,则传入空对象,用于正常的配置
if (!window.__POWERED_BY_QIANKUN__) {render({});
}
// qiankun的生命周期回调
export async function bootstrap() {console.log('[vue] vue app bootstraped');
}
export async function mount(props) {console.log('[vue] props from main framework', props);// 如果qiankun框架引入,则会在页码加载完成之后调用此方法render(props);
}
export async function unmount() {window.sfopenpc.$destroy();window.sfopenpc.$el.innerHTML = '';window.sfopenpc = null;// router = null;
}

  • webpack配置(开发环境)
    由于是不同端口,所以会出现跨域的问题,所以需要在代理服务器进行配置headers,支持微服务的Access-Control-Allow-Origin

const { name } = require('./package.json');
module.exports = {configureWebpack: {devServer: {headers: {// 本地服务器接受跨域'Access-Control-Allow-Origin': '*',},},},output: {library: `${name}-[name]`,libraryTarget: 'umd', // 把微应用打包成 umd 库格式,不配置的话,主应用导入会报错jsonpFunction: `webpackJsonp_${name}`,},
}

效果

在这里插入图片描述
点击上面的菜单栏进行跳转
在这里插入图片描述
已经成功引入。

其他问题


主应用与微应用跳转问题

如果主应用和微应用同时使用hash模式的话,如果不做特殊处理的话,就会出现跳转异常。
我这里简单写了一个简单的中间件,原理是在微应用的入口文件新增一个前缀处理,使得如果是qiankun框架访问的时候,自动添加路由跳转前缀的同时,点击时也会自动重定向对应的前缀。

微应用配置


  • 中间件QiankunRouter

import Router from 'vue-router';function handleRouter(router, prefix = '') {if (router.path) {if (router.path === '/') {router.path = `${prefix}`;} else {router.path = `${prefix}${router.path}`;}}if (router.children && router.children.length) {for (const r of router.children) {handleRouter(r, prefix);}}
}// eslint-disable-next-line no-unused-vars
function decorate(router, { isQiankun, prefix }) {if (isQiankun) {for (const r of router) {handleRouter(r, prefix);}}return router;
}
export default class QiankunRouter extends Router {constructor(props) {decorate(props.routes, {isQiankun: props.isQiankun,prefix: props.prefix,});super(props);this.isQiankun = !!props.isQiankun;this.prefix = props.prefix || '';if (this.isQiankun) {// 注册跳转路由前置,跳转时自动新增前缀this.qiankunbeForeEach();}}// eslint-disable-next-line no-unused-varsqiankunbeForeEach() {super.beforeEach((to, from, next) => {if (this.isQiankun && !to.path.includes('/microApp')) {if (to.path === '/') {next({path: this.prefix,});} else {next({path: `${this.prefix}${to.path}`,});}}next();});}
}

  • 使用QiankunRouter替换Vue-router

/* eslint-disable no-unused-vars */
import Vue from 'vue';
// import router from 'Vue-router'
import QiankunRouter from '../qiankun/decorateRouter';
// 路由信息
const routes = [{path:'/',component: () => import('./qiankun/index')
}]Vue.use(QiankunRouter);
const router = new QiankunRouter({mode: 'hash',routes: vuexHoc(routes),// eslint-disable-next-line no-underscore-dangleisQiankun: !!window.__POWERED_BY_QIANKUN__,// 路由跳转前缀prefix: '/microApp/TPP',
});export default router;

主应用配置修改

只需要修改路由信息和qiankun主路由检测路径即可

  • qiankun主路由检测路径

const qiankunConfig = [{name: 'TPP',// 访问微应用的跳转首页路径 新增#/microApp/TPP,匹配的是原来的/entry: 'http://localhost:7001/#/microApp/TPP',container: '#microApp',// 主应用hash配置前缀activeRule: getActiveRule('#/microApp/TPP'),}]

  • 路由信息

{// 给微应用配置一个固定前缀path: '/microApp/*',name: '微应用',component: () => import('../views/microApp.vue'),},

微应用的弹出新窗口

弹出新窗口是可以使用相对路径,浏览器会自动获取当前的路由信息,但是如果使用主应用打开的时候打开新窗口就会异常了。
解决方案有如下:

  1. 封装一个跳转窗口的方法,统一使用该方法进行跳转
  2. 如果使用的是标签跳转新窗口的话,就不能使用相应路径,而改用URL的绝对路径替换。

js文件的预加载问题

在开发环境中,跳转路由的时候,会出现一个明显的“白屏时间”,这可能是因为请求多次导致加载时间变长,目前暂时还没有确定的解决方案,可能需要在主应用中加一个loading优化显示。


推荐阅读
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • springboot项目引入jquery浏览器报404错误的解决办法
    本文介绍了在springboot项目中引入jquery时,可能会出现浏览器报404错误的问题,并提供了解决办法。问题可能是由于将jquery.js文件复制粘贴到错误的目录导致的,解决办法是将文件复制粘贴到正确的目录下。如果问题仍然存在,可能是其他原因导致的。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了为什么在main.js中写import不会全局生效的问题,并提供了解决方案。在每一个vue文件中都需要写import语句才能使其生效,而在main.js中写import语句则不会全局生效。本文还介绍了使用Swal和sweetalert2库的示例。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
author-avatar
手机用户2502885897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有