我在公司项目上用了微前端,差点被开除

2023-11-03 01:10

本文主要是介绍我在公司项目上用了微前端,差点被开除,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

故事的开头
  • 从微前端的qiankun去年开始火的时候,我就注意到了,我们公司的Saas系统是可以用这个去解决UI、体验上的一些问题,以及让技术栈平滑过渡迁移,但是奈何时机不够成熟

  • 今年抓住了时机,感觉是时候推进微前端了,加上公司内部的星舟平台(Devops平台)也开始推广,我开始寻思改造这个事

改造不为了炫技,仅仅为了提升开发、用户体验!当你需要微前端的时候,再用它

我在公司内部做了一个技术分享
  • 我的微前端改造是利用k8s + qiankun + ingress(path)的配置,达到快速部署的目的,完全无跨域问题

改造背景
  • 目前存在几个站点,但是站点之间的UI展现不一样,我们看起来很不专业

  • 不同站点明明都所属于我们部门的系统,但是跳转时却需要整体的跳转并且出全部的白屏,用户体验很差

  • 无法承接全局性的需求,例如:多个站点技术栈版本不一样,这里要做一个需求,需要去几个不同的版本技术栈中实现一次,还很难保持效果一致

why not iframe
  • 为什么不用 iframe,这几乎是所有微前端方案第一个会被 diss 的问题。

  • 但是大部分微前端方案又不约而同放弃了 iframe 方案,自然是有原因的,并不是为了 "炫技" 或者刻意追求 "特立独行"。

  • 如果不考虑体验问题,iframe 几乎是最完美的微前端解决方案了。

  • iframe 最大的特性就是提供了浏览器原生的硬隔离方案,不论是样式隔离、js 隔离这类问题统统都能被完美解决。但他的最大问题也在于他的隔离性无法被突破,导致应用间上下文无法被共享,随之带来的开发体验、产品体验的问题。

  • url 不同步。浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。UI 不同步,DOM 结构不共享。想象一下屏幕右下角 1/4 的 iframe 里来一个带遮罩层的弹框,同时我们要求这个弹框要浏览器居中显示,还要浏览器 resize 时自动居中..

  • 全局上下文完全隔离,内存变量不共享。iframe 内外系统的通信、数据同步等需求,主应用的 cookie 要透传到根域名都不同的子应用中实现免登效果。慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程。

  • 其中有的问题比较好解决(问题1),有的问题我们可以睁一只眼闭一只眼(问题4),但有的问题我们则很难解决(问题3)甚至无法解决(问题2),而这些无法解决的问题恰恰又会给产品带来非常严重的体验问题, 最终导致我们舍弃了 iframe 方案。

上面抄的阿里的对于qiankun的介绍,我觉得挺好,已经拿小本本记下来默默背诵了

微前端对我来说它的核心价值
  • 技术栈无关 -  解构巨石应用

  • 方案上跟使用 iframe 做微前端一样简单,同时又解决了 iframe 带来的各种体验上的问题。理想状态下,以此为目标的微前端应用,是自动具备流通能力的,且这个流通能力不会因为主应用的实现升级而丧失(也就是说在 21 年能接入主应用的微前端应用,到了 2025 年也应该能正常接入正常运行,并同样保有在不同主应用间流通的能力)

  • B端产品生命周期长,确保我们的祖传代码能平滑的迁移,以及如何确保我在若干年后还能用上时下热门的技术栈

  • 加强我们平台、产品的集成能力,企业级项目非常需要这个


正式开始
什么是微前端?

微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略

  • 微前端架构旨在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用后,随之而来的应用不可维护的问题。

  • 这类问题在企业级 Web 应用中尤其常见

微前端原理

子应用通信机制

多方考虑,选择了业内主流成熟的 微前端框架:qiankun
qiankun 的核心设计理念
  • ???? 简单 由于主应用微应用都能做到技术栈无关,qiankun 对于用户而言只是一个类似 jQuery 的库,你需要调用几个 qiankun 的 API 即可完成应用的微前端改造。同时由于 qiankun 的 HTML entry 及沙箱的设计,使得微应用的接入像使用 iframe 一样简单。

  • ???? 解耦/技术栈无关 微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用,而 qiankun 的诸多设计均是秉持这一原则,如 HTML entry、沙箱、应用间通信等。这样才能确保微应用真正具备 独立开发、独立运行 的能力。

改造前的部署
  • 改造前的部署,解析域名的path,根据path的不同,例如:myfuwu.com.cn/A 就指向了 项目1

改造后的部署
  • 由于k8s有配置多个ingress path的能力,所以我将之前的A B C Dpath全部指向了微前端的基座项目,这样用户访问的时候,只会先访问到基座项目

  • 基座项目再解析url,根据url去匹配加载真正的子应用。(此时有一个维护的注册表,例如当pathA的时候,就去请求部署在F的项目)

这样就做到了,微前端不跨域,不改任何代码里面的跳转路径,就实现了部署。

  • 从开始部署到部署成功,我仅仅用了20分钟,所以专业的Devops平台很重要

遇到的问题
  • 微前端模式再去通过iframe嵌套某个微前端模式下子应用页面的时候,写在子应用里面的window.xx方法会找不到,这个时候需要写在基座的window里面

  • 建议通过script等加载的依赖统一放到oss或者自己的文件服务上,这样方便设置跨域等

  • 如果有可能加载两次的script,要加上ignore属性,不然会报错

  • 样式隔离很重要,建议用class区分

  • 开发模式不用开启预加载,生产模式开启预加载体验好很多

总结
  • 整体来说,微前端的难点在于最低成本的实现改造,像我这样不改项目里面的代码,做到最低的成本,让其他小伙伴既能单独开发部署子应用,也可以被集成到微前端模式下

  • 当时我遇到最奇葩的问题是OSS,阿里云的OSS经常返回不带跨域的cors头,导致用户可能白屏,我直接把OSS去掉,自己做了一个文件服务,专门存放静态资源(这个问题,真的很严重,我们是企业级应用,白屏可以说是超级严重的问题,但是还好及时把流量切走了,后面解决了这个问题)

顺便吐槽一下今天客户使用我们的系统,一个小姐姐,电话里面我跟她说:您好,我是xxx的研发,请问您今天是登录不了了吗?可以远程帮您看看吗?

  • 结果小姐姐让我们排查了一天,最后发现,她的账号是小写,结果她填了大写导致登录不上,差点让我们连夜买火车站票跑路

如果感觉写得不错,帮我点个星标/在看/赞/关注/转发

或者你需要微前端更多资料也可以加我微信关注公众号菜单栏有联系我的方式

这篇关于我在公司项目上用了微前端,差点被开除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334519

相关文章

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项