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

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

相关文章

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js