前沿:前半年微前端火得一踏糊涂,刚好业务需求上有这样的应用场景,针对目前的微前端解决方案做了技术选型,qiankun作为蚂蚁金服内部孵化出来的微前端解决方案,经过线上应用充分检验及打磨最后开源,最终选择qiankun作为我们云产品架构入口。不过官方文档上关于上线部署文档较少,很多童鞋也可能只是在本地玩玩,没有到真正走通整个闭环,于是结合自身,在将qiankun落地过程中遇到的“那些坑”做个梳理。希望对你有所帮助

1. 茶前点心

本文不大篇幅介绍关于qiankun的“前世今生”,更多的设计理念介绍请看文档如果有想了解其他微前端解决方案的童鞋,也可以回顾下之前树酱分享的微前端那些事

举个例子:我们有个这样的场景,我有个门户Portal的登陆界面(主应用基座),登陆成果后可以切换不同的子应用,如下有两个子应用A和B,且都在之前是独立部署的,单独可以访问,但是我们现在想借助qiankun把他们“嵌”到基座来加载,往下看实操

你可能会问直接用iframe不香吗?真不香,主要几个局限问题

  • 父子应用之间通信问题

  • cookie共享问题(可做单点登陆SSO)

  • 交互视图效果不佳

上面是一个通过域名访问子应用的示意图,接下来我们看看一个view视图,header头部和sideMenu左侧菜单是属于portal门户的,而右侧区域则是显示切换子应用的视图,预期效果:当我们访问dev.portal.com/a该域名时(即切换到子应用A),左侧菜单也会根据不同应用切换不同数据

1.1 注册子应用时应该注意哪些问题?

???? 啊明同学:qiankun是如何注册子应用的呢?

qiankun是通过registerMicroApps(apps, lifeCycles)API来注册子应用的,详细文档请看点我????  用来实现当浏览器 url 发生变化时,自动加载相应的子应用的功能,结合上面的例子我们试着在基座main.js注册子应用

主要包括:

  • entry: 子应用的 entry 地址,比如我们现在有两个子应用A和B,那么这里配置的就是他们的资源访问域名或ip

  • render:本质上是container的转换,container用来定义子应用的容器节点的选择器或者 Element 实例,这里使用的是实际例子

  • activeRule:子应用的激活规则,即什么路由访问才会去fetch entry配置的域名或ip,我们用了getActiveRule来完成匹配,我们看看getActiveRule的实现,该函数通过传入当前 location 作为参数,然后根据函数返回数值来看,若返回值为 true 时则表明当前子应用会被激活,则去调用entry入口配置

匹配如下

✅ https://dev.portal.com/a✅ https://dev.portal.com/a/anything/everything???? https://dev.portal.com/c

匹配成功后,qiankun 通过 fetch 去获取所匹配子应用的静态资源

1.2 资源访问跨域如何解决?

啊呆同学:你这样不会跨域吗?基座 https://dev.portal.com/ 获子应用a的资源 https://dev.monitor.com/a的资源 ,根据浏览器同源策略(浏览器采用同源策略,禁止页面加载或执行与自身来源不同的域的任何脚本)应该获取不到吧,明显跨域

答案:是,由于 qiankun 是通过 fetch 去获取子应用注册时配置的静态资源url,所有静态资源必须是支持跨域的,那就得设置允许源了,简单的设置可以看下面

  • Access-Control-Allow-Origin:跨域在服务端是不允许的。只能通过给Nginx配置Access-Control-Allow-Origin *后,才能使服务器能接受所有的请求源(Origin)

  • Access-Control-Allow-Headers: 设置支持的Content-Type

1.3 子应用加载失败是什么问题?

啊明同学:跨域解决了,可还是fetch不到子应用a的静态资源?是什么问题咋搞?

出现这个报错:Application died in status LOADING_SOURCE_CODE: You need to export the functional lifecycles in xxx entry

答案:你的打包姿势不对

vue-cli 3x项目中需要通过在vue.config.js配置output来配置输出的方式,如下????所示

  • pubilcPath: 主要解决的是子应用动态载入的 脚本、样式、图片 等地址不正确的问题

  • output.library:需要与主应用注册子应用时的name一致且唯一

  • output.libraryTarget:umd : 导出umd格式,可以支持inport、require和script引入

然后创建一个publichPath文件,并在main.js 引入

1.4 子应用的publichPath到底应该怎么配置?

啊明同学:打包output配置改好了,但是为什么publichPath路径配置为/a?

拓展: 沿用上文提到的a应用的访问域名 dev.monitor.com/a

现在浏览器要正确获取a应用的静态资源中的css文件,则会去访问 dev.monitor.com/a/css/common.css

主要分两种情况:

  • publichPath如果默认配置或者配置为/,则生成的index.html 访问的资源是则不正确,因为将访问的是dev.monitor.com/css/common.css并不是a应用的资源

  • 配置为/a,则生成的index.html 访问的资源是 就可以

???? 啊呆同学:那publichPath路径配置为./相对路径可以吗?

答案:也是可以的,跟配置为/a访问一样

1.5 如何保障原来的应用运行正常,但能集成到基座portal中

啊明同学:我之前a应用是单独运行部署的,我通过qiankun集成到基座portal中会有影响吗?

答案:使用这个全局变量来区分当前是否运行在 qiankun 的主应用中

那就是:window.__POWERED_BY_QIANKUN_那可以用来干嘛?请看下面????

  • 独立运行:window.__POWERED_BY_QIANKUN__为false,执行mount创建vue对象

  • 运行在qiankun: window.__POWERED_BY_QIANKUN__为true,则不执行mount

1.6 父应用如何共享util和data给子应用

隔壁老王同学:如果我想把门户登陆应用登陆成功获取到的个人数据共享给子应用还有一些公用的方法,我该怎么做?

答案:可以在注册子应用的时候,把定义好要共享的msg,通过props共享出去

  • msg.data 把store状态管理数据共享给子应用

  • msg.prototype 定义一些原型数据,比如是否为qiankun上下文中

父应用定义完,那子应用是如何获取呢?是通过在子应用挂载前,将props数据导到子应用通过遍历赋值给到子应用vue原型中

1.7 history路由模式,需要如何配置ngnix,才能正常访问?

啊宇同学:我看你访问的路由模式不是hash,而是history模式,那你是怎么解决当页面刷新404问题?

答案:通过nginx配置加入try_files,history 模式同样会有一个问题,就是当页面刷新时,如果没有合适的配置,会出现404错误,针对这种请看,需要额外在nginx配置,对于找不到url的,将首页html返回

  • try_files:用来解决nginx找不到client客户端所需要的资源时访问404的问题

  • proxy_pass:主要是用来配置接口网关反向代理,可以使得父子应用下访问的api是一致的,防止接口跨域问

基于qiankun落地部署微前端爬”坑“记相关推荐

  1. qiankun 微前端_基于qiankun落地部署微前端爬”坑“记

    ❝ 前沿:前半年微前端火得一踏糊涂,刚好业务需求上有这样的应用场景,针对目前的微前端解决方案做了技术选型,qiankun作为蚂蚁金服内部孵化出来的微前端解决方案,经过线上应用充分检验及打磨最后开源,最 ...

  2. 基于qiankun搭建ng-alain15微前端项目示例实践

    基础环境 实践日期:2023-03-04 ng versionAngular CLI: 15.2.1 Node: 18.14.2 Package Manager: npm 9.5.0 OS: win3 ...

  3. 基于qiankun搭建ng-alain15微前端项目入门实践

    基础环境 实践日期:2023-02-22 ng versionAngular CLI: 15.1.6 Node: 18.14.2 Package Manager: npm 9.5.0 OS: win3 ...

  4. 基于qiankun.js的微前端应用实战

    背景:在项目开发中,有这样的需求,多个项目要通过统一的门户网站加载出来,该统一门户网站只显示相应按钮进行菜单导航切换 qiankun.js介绍: qiankun 是一个基于 single-spa 的微 ...

  5. qiankun 部署微前端-vue2(一)

    自从前后端分离以来,一直都有个困惑,就是随着项目的功能的不断拓展,项目变得不断臃肿,每次打包编译,都要把整个项目编译,非常耗时.如果前端也能像后端一样,在项目搭建初期,有类似微服务的功能,那就好了.现 ...

  6. 基于Git子模块的微前端项目管理和公用组件库方案

    基于Git子模块的微前端项目管理方案 1. 媒体项目从单一项目到多项目的转变及问题 随着前端媒体业务的急剧扩大,传统的单体应用已经变得难以维护,由此,这几年我们一直在探索对大型复杂项目的拆分工作. 一 ...

  7. 基于 iframe 的全新微前端方案

    作者:damyxu,腾讯 PCG 前端开发工程师 iframe是一个天然的微前端方案,但受限于跨域的严格限制而无法很好的应用,本文介绍一种基于 iframe 的全新微前端方案,继承iframe的优点, ...

  8. 小小甜菜深度学习爬坑记

    小小甜菜深度学习爬坑记 主要目的是整理一路学习的技术分享贴.我的电脑是笔记本联想拯救者R720,显卡是GTX1050Ti.其它环境仅供参考. 安装ubuntu+win10双系统 详情见技术贴用 Eas ...

  9. 小小甜菜百度AI爬坑记

    小小甜菜百度AI爬坑记 作为国内较好的深度学习平台,我是在2018百度开发者大会拉入坑的.其可分为语音识别,语音合成,文字识别,图像识别,人体分析,人脸识别,理解与互交技术,AR增强现实等多个方向.我 ...

最新文章

  1. LeetCode 8 字符串转整数 (atoi)
  2. python中与时间有关的对象-datetime、time、date
  3. 后台开发人员面试内容——计算机网络(五)
  4. 网上看的几点人生建议
  5. 内核态和用户态的区别
  6. 软工大二下半年第四周学习进度
  7. python词云乱码_python词云库wordCloud使用方法详解(解决中文乱码)
  8. [Study Notes][001][gstreamer] memory
  9. 使用JDBC完成数据的增删改查
  10. sql 键查找 索引查找_残留谓词对SQL Server索引查找操作的影响
  11. 蓝桥杯——阿尔法乘积
  12. C++ vector和stack入门习题(采用排序)
  13. linux tar命令将压缩包解压到指定位置,用tar命令把目标压缩包解压到指定位置
  14. SAS笔记#通过TABULATE过程制作汇总报表
  15. Photoshop教程:10秒闪电搞定照片构图
  16. 高校三维地图校内导航系统解决方案
  17. 彻底清除VMware快照的方法
  18. ARM与Intel芯片性能不严谨比较
  19. C语言是一个什么样的语言
  20. SSM项目图书馆管理系统,适合新人练手和毕设参考,功能首页展示 系统注册登录登出 用户管理 权限控制管理 书籍管理 图书借阅管理 个人借阅记录管理 书籍详细信息展示等

热门文章

  1. C语言的enum枚举类型
  2. 如何部署多云环境下VR快艇开奖号码采集官网的IT基础架构?
  3. WinForm使用百度AI识别文字(OCR)
  4. 在Makefile中无缝连接字符串
  5. live555源码分析----mpg文件的处理(续)
  6. 腰带“兄弟”事实上,投资
  7. 联想收购IBM,谁是最大的输家?
  8. 【持续更新】一些PS的快捷键使用(看敬伟老师网课)
  9. 自动装箱、拆箱了解多少?
  10. 【异常】前端提示npm ERR! enoent ENOENT: no such file or directory, open ‘xxx/package.json‘