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

解密微前端:浅谈微前端生态

解密微前端:浅谈微前端生态玩弄心里的鬼发布于 2021-07-21 English这篇文章算是我对在阿里做微前端的一个总结吧,没有写的事无巨细,更像是一个对自己的备忘录,很多地方因

解密微前端:浅谈微前端生态
玩弄心里的鬼发布于 2021-07-21
 
English

这篇文章算是我对在阿里做微前端的一个总结吧,没有写的事无巨细,更像是一个对自己的备忘录,很多地方因为做的比较久了记忆也比较模糊了我也会慢慢补充。


我对微前端的理解

当我们在谈论微前端的时候,往往提到的是一个前端的架构模式:一种瓦解前端“巨石应用”的分治方案。但是在我看来,随着微前端在企业级中后台应用的广泛使用,我们在谈论微前端的时候已经衍生到一整套前端生态闭环(加载器、路由、发布系统、应用插件等等),甚至当这套生态跑流畅之后可以落地出一整套微前端的解决方案。

因此,我对微前端的理解就是:



  • 前端架构

  • 生态闭环

  • 解决方案

而抛去以上架构层面的认知,我觉得微前端首要解决的问题是团队合作 / 效能所带来的前端工程化问题。


架构背景

我一直认为当我们谈论生态闭环或者解决方案的时候配合架构背景会更有说服力,也能让大家理解我们很多地方为什么要这么做。

之前微前端系列的第一篇文章已经详细介绍了我们的项目架构背景,这里在简单回顾下,详情见《解密微前端:"巨石应用"的诞生》


模版架构

弊端:



  • 后端解析模版,挂载模版;

  • 后端管控路由,前端失去了对路由的掌控权,并且多个团队路由规则管控较难;

  • 主子应用作用域不隔离;

  • 每一次前端发布需要先发布静态资源再发布模版,发布繁琐容易出错;


iframe 架构

诉求:



  • 需要不依赖后端模版;

  • 需要管控路由并制定统一的路由规则;

  • 主子应用的沙箱隔离;

  • 尽量对子业务的改动做到最小化,很多业务包袱很重;

  • 快速落地并实现高可用;

弊端:



  • 通信方式简单,简单的 postmessage API 并不能满足业务的需求;

  • 样式割裂,iframe 会导致诸如 Dialog 这样子的全局蒙层仅在 ifame 区块内展示,使我们系统更像是“拼凑”出来的;

  • 性能瓶颈,路由的切换会导致 iframe 内子应用的重新加载,性能堪忧;

  • 跨域问题,chrome80 的 samesite 策略会导致 iframe 方案的跨域 COOKIE 无法带给后端;


微前端架构

诉求:



  • 改动成本;

  • 沙箱隔离;

  • 兼容 iframe;

  • 路由不变性;

  • 通信不变性;

  • 灰度控制、容灾降级;

  • 适配三端:pc、桌面端、POS 机;

  • 子应用存在投放不同平台的场景,尽可能让子应用对投放平台无感知,宿主环境无感知;

  • 兼容搭建平台;


业界痛点

这里我在搭建微前端生态的时候和阿里的其他的团队做了交流,收集了其他团队在微前端生态搭建过程中的遇到的痛点:



  • 微前端生态需要适配搭建系统;

  • 需要具有兼容 icestark、qiankun、singleSPA 的能力;

  • 兼容已有的 iframe 架构以及 iframe 生态;

  • 业务体量大,稳定性要求高;

  • 适配已有的前端基建(发布系统、埋点系统、监控系统);


我们在微前端生态相关的建设


微前端框架

微前端框架在我们的技术选型是 qiankun,当时的选型目标比较简单粗暴:



  • 接入简单侵入少:我不想接入一套新的方案直接对老系统重构;

  • 兼容 iframe 生态:已经存在比较成熟的生态体系,并且已经累计接入了近百个子应用;

  • 没有足够的人力自建 / 维护自由的微前端框架:只有我一个人力,并且不鼓励重复造轮子;

而在我看来作为微前端生态中最终要的一环,微前端款框架应该集成了最核心的功能:



  • 子应用加载

  • 沙箱隔离

  • 路由劫持

  • 应用间通信

前三点都是采用的框架本身提供的能力,而应用间通信我们采用了自建的方案。


为什么自建通信模型?

其实框架侧提供的通信方案基本上能满足大部分业务场景,但是我们再次基础上有着更高的诉求:



  • 已有比较成熟的 iframe 通信方案,能否兼容 iframe 方案,降低 iframe 应用改造成本;

  • 能否支持在 iframe 和微前端两套接入方案下自由切换而子应用无感知;

为此,我们在 iframe 通信模型的基础上,基于宿主环境判断封装了微前端的发布订阅模型,采取完全相同的 API,子应用不再关心自己的接入方式和宿主环境。


应用管理


路由管理

在聊应用管理之前我想先聊一下路由管理,对于大型的 B 端系统,一套合理的路由规则是极其重要的,尤其我们的系统是对外使用的:



  • 前期需要定好规则,不能随着性子随便改变,用户很多都直接保存了对应页面链接;

  • 子应用间存在跨应用间路由跳转的场景,合理的路由规则也便于跨应用层级的路由控制和路由管理;

  • 我们也需要基于路由做粗力度的权限控制;

这里首先在路由约束下,我是采取了下面的规则:/:platform/:privilegeKey/:childHash



  • platform:平台:pc、desktop、pos;

  • priviateKey:权限点,和子应用 microKey 有 n - n 关系;

  • childHash:子应用实际 hash,注册为微前端子应用时需要以/:platform/:privilegeKey 作为 basePath;


子应用版本控制

对于国内主流的微前端方案来说都提供了两种方式的接入:



  • entry:直接配置子应用的 html 链接,框架测分析解析子应用 html 并实现资源注入;

  • 资源配置:配置 js、css 等 cdn 资源从而实现资源注入;

这两种方式决定了发布系统如何配合我们的微前端生态,这里我们采取的是第一种方案。


为什么采用 entry 模式?


  • 子应用存在投放多个业务平台的场景,不能因为接入一套方案而放弃其他,entry 形式也给了子应用作为应用独立运行的能力-;

  • 子应用灰度:html entry 在发布平台天然存在版本控制;


容灾(应急策略)

在容灾降级这边,因为我们已经有了一套比较成熟的 iframe 生态,并且微前端方案在我设计的时候就多处做好了向下兼容的策略,因此我们对于容灾降级就是降级成 iframe 方案,对于 iframe 依旧异常的场景就只能通过监控报警来兜底了。



  • 降级 iframe



    • 热降级:捕获挂载错误自动降级 iframe;

    • 冷降级:手动移除微前端配置降级 iframe;



  • 监控



    • 微前端配置加载监控;

    • 子应用挂载成功率监控;

    • 子应用内部异常捕获监控;




子应用赋能

在我看来,子应用赋能是微前端中不可或缺的一环,下面主要向大家介绍下我在子应用赋能方面所做的一些事。


通信模型

通信模型上面已经简单提过了,这里就不过多赘述了。


自动埋点

主子应用同时挂载埋点 SDK 的话是没有意义的,设置会增加数据“噪音”,因此仅需要主应用挂载 SDK 即可。我这里基于集团的埋点 SDK 做了二次封装,在主应用 ready 的时候挂载埋点 SDK,并以当前的 microKey 作为埋点的 id 聚合子应用的埋点,并且对子应用开放埋点调用事件。

总结起来就是:



  • 聚合埋点 SDK;

  • 自动采集 PV / UV;

  • 手动触发埋点事件;

  • 埋点扩展:业务级全埋点自动采集;


异常监控

和埋点一样,异常监控我们也采用主应用挂载的形式,并以 microKey 做监控聚合。但是不同的是,监控这块我们暴露了卸载主应用监控的事件给子应,接入的不同团队的不同应用可能采取了完全不同的监控体系,而监控 SDK 的底层远离都是劫持 fetch 等原生事件去做的,不同的 sdk 间很可能出现污染。


路由中台

在路由规则和权限点的基础上,我们也落地了自己的路由管控配置平台,我们收口了全部子应用间路由跳转的 url,替换为按照路由事件 + schema 的形式让子应用调用,这样在子应用自有链接随着业务迭代的时候只需要同步到路由中台,便不需要其他子应用同步更新路由链接了。


其他赋能

这里还有很多根据我们业务域定制的一些能力,我就不一一细说了:



  • 单子业务域多实例挂载;

  • 子应用后台挂起、keepalive、保活;

  • 不同的浏览器访问行为:打开新页、重定向(无刷)、重定向(刷新);

  • 不同平台的适配层:pos、桌面端、浏览器;

  • ...


最后

最后简单说下我个人认为的微前端最佳实践吧:



  • 大型 B 端系统,涉及多业务域,多团队维护,子业务间耦合度较低,业务边界清晰;

  • 不能要求子应用要多,但是不能太少,一两个子应用微前端失去了该有的价值,或者说有更合适的替代方案;

  • 团队内已经无法忍受 iframe 或其他替代方案带来的痛点;

  • 微前端会伴随着配套周边的生产,考虑好 ROI;



推荐阅读
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 解决 Fetch 请求扇贝 API 时遇到的跨域问题及优化方案 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 本文详细探讨了MySQL并发参数的优化与调整方法,旨在帮助读者深入了解如何通过合理配置这些参数来提升数据库性能。文章不仅介绍了常见的并发参数及其作用,还提供了实际操作中的调整策略和最佳实践,适合希望提高数据库管理技能的技术人员阅读。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • Web自动化测试:表单提交与页面跳转的高效实现
    Web自动化测试:表单提交与页面跳转的高效实现 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
author-avatar
军校招生顾问天使
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有