采用微前端架构

原文

考虑到关于微前端的第一篇文章的大量反馈,以及我们在 DAZN 采用的方式收到的问题,我决定分享更多有关这个话题的内容。

在这篇文章中,我将一一介绍微前端架构各种可能的实现。

尽管微前端是我们前端应用的新模型,但许多公司都已经试图接受它们背后的原则,并且已经缔造了多种实现方式,来解决它们的前端和组织上的挑战。

在开始考虑我们如何设计我们的实现之前,我认为值得一提的有一些方式,这不是一个详尽的列表,但有趣的是,它们可以被用来了解可用的不同可能性:

  • Spotify

在桌面端中使用微前端,利用 iframe 将同一视图的不同部分拼接在一起。

iframe 之间的通信是通过事件总线进行的,该事件总线很好地分离了应用的不同部分,允许它们在不知道谁将要收听消息或事件的情况下进行通信。 此外,这种方法可以节省大量的时间来管理应用内存,因为每次我们更改 iframe 位置时,所有对象都可以自动进行垃圾回收。

  • 宜家

决定采用不同方式实施微前端,他们使用的是 Edge Side Includes(ESI)与 Client Side Includes(CSI)混合,我不想在这个技术上赘述,因为它在Gustaf的帖子中被广泛提及,不过,它绝对是另一种动态生成我们页面内容,并在 CDN 级别或客户端缓存结果的机会,这取决于我们想采取的方法。

  • OpenComponents

它是 Skyscanner、OpenTable 等几家公司使用的有意思的框架。

OpenComponents 是一个以自我为中心(opinionated)的框架,它利用端到端组件(前端+后端)的概念,把这些组件提交给一个寄存器,然后用来组合一个应用。

还有,在这种情况下,我们可以在 OpenComponents 项目网站上找到更多的信息。

在这 3 个实现之间,我们可以找到相似的地方,但其中的一些差异,会被中大型规模的组织用来创建独立和技术不可知的微前端。这方面值得一提的是 Zalando 或 BuzzFeed 也是作为这个思想流派中的另一种贡献者。

如果我们想总结一下到目前为止讨论的实现,我们可以列出 3 种不同的方法:

。使用iframes + 事件总线 。使用 ESI 结合(或不结合)CSI 。使用 OpenComponents 或类似的运行时/编译时模板系统

“DAZN 采用的方式”

正如我在本文开头所提到的,还有另一个实现要讨论:DAZN 采用的方法。

DAZN 是一种 OTT 服务,可在多个国家/地区提供实时和点播内容。我们的应用不仅可以在网络和移动设备上使用,还可以在智能电视,机顶盒和控制台上使用,这一点非常重要,因为我们经常遇到独特的挑战,我们需要开箱即用地来解决它们。

通常,当我们开始一个微前端项目时,我们应该问自己几个问题,并基于与我们的决策面临的相关挑战的答案,例如:

  • 我们想在同一视图中使用多个微前端吗?
  • 我们如何在页面之间切换路由?
  • 我们如何在微前端之间共享数据?
  • 我们如何生成微前端?运行时还是编译时?

让我们尝试回答所有的这些问题,以便理解我们采用的方法......

我们想在同一个视图中使用多个微前端吗?

不,我们希望每次加载 1 个微前端,这样我们就没有微前端之间的共享依赖关系,每个微前端都足够小但不太小,我们完全控制最终的结果,它是独立的技术和良好的封装。

我们可以使用同一框架的不同版本,而不会影响其他微框架甚至不同的技术,从而不会对整个应用产生任何影响。

我们遵循领域驱动设计(DDD)实践来切割我们的子域,并使它们真正独立地映射产品团队结构,并在由产品人员+前端开发人员+后端开发人员+功能测试+测试开发组成的大型组织内创建垂直,这对于快速迭代非常有用,在大公司需要时,团队之间的速度会有所不同。

请记住,比你想象的更频繁,我们的应用并非完全地被用户使用,例如,当用户通过身份验证时,将不会加载登录/注册微前端的所有代码和依赖项,因为我们只加载经过验证的区域的微前端。 同时,当用户未经过身份验证时,并不是 100% 确定她将完成登录的流程,并成功访问应用的经过身份验证的区域,请检查你的用户与你的用户交互方式的统计信息应用,如果你没有使用它们,请使用 Google Analytics,Sentry,LogRocket 等工具投入适当的时间来创建正确的可观察性。 请记住,微前端的目标是帮助实现加载仅仅是用户需要的 而不是更多

我们如何在页面之间切换路由?如何在微前端之间共享数据?

我们可以通过多种方式在后端,边缘或客户端实现这一点。我们选择客户端创建一个名为 Bootstrap 的 协调器(orchestrator),它有 4 个主要目标:

  • 微前端之间的路由
  • 加载和卸载微前端(每次 1 个,从不多个)
  • 初始化检索配置的应用
  • 公开 API 层以在微前端之间共享数据

我们如何生成微观前端?运行时或编译时间?

我们喜欢我们用的人工制品的结果非常可预测,我们希望它们像 SPA 一样高度安全,因此我们没有采取在运行时创建任何东西的路径,但我们比较喜欢在编译时生成微前端,把它们存储在 AWS S3 上,并通过 Cloudfront CDN 提供服务。 通过这种方式,我们不必担心在我们为应用提供服务时扩展我们的基础架构的问题或发生不可预测的边缘情况,我们可以在部署生产环境之前运行端到端测试和性能测试,从而在上线之前对我们部署的内容更有信心。

架构

在我们的案例中,我们决定将应用拆分为多个子域,以便提前研究用户如何与我们的 Web 应用进行交互。对于绿地(green-field)项目,我建议深入了解你的用户如何与你的 UX 和产品团队一起与应用进行交互,并遵循领域驱动设计用于定义子域及其相关的边界上下文。 对于 DAZN 应用,几乎每个子域在技术上都被转换为单页应用,但也有一些例外,例如,由于该子域的广泛范围,视频播放器是一个组件,然后这些组件被导入到微前端内部和任何其他库一样。

微前端由引导程序加载和协调,引导程序是嵌入在主 HTML 页面中的简单的 vanilla javascript 应用,它根据深层链接(deep-link)来请求加载不同的微前端,用户状态或任意请求都来自加载的微前端。

这就是我们的架构的样子:

引导程序在我们的应用的生命周期中始终可用,它负责加载我们的微前端,并在设备和微前端之间暴露一层微小的抽象。

当你的目标是多个设备而不仅仅是浏览器时,也就是我们在许多智能电视,机顶盒和控制台上都可以使用我们的应用时,这个细节变得更加相关,它们通常都有不同的要求和I/O API ,他们被顺延封装在引导程序级别。

通过这种方式,我们可以在多个设备中运行微前端而无需更改一行代码,因为引导程序正在抽象运行微前端的平台。

如果我们想总结应用在浏览器中的加载方式,我们可以说:

  1. 用户在浏览器中输入我们的域名请求我们的 Web 应用
  2. 提供引导程序
  3. 引导程序初始化应用,并从 API 层检索一些配置
  4. 基于初始状态和用户请求(深层链接或默认 URL)加载正确的微前端
  5. 用户沉浸在我们基于微前端的Web应用中!

请记住,每个微前端都是独立的,因此我们不会在微前端之间共享组件或逻辑。

如果你认为这是浪费时间和精力,你就无法想象每个团队在这个决策中获得了多少独立性。

代码重复并不总是一种糟糕的做法,正如我们过去所了解的那样,通常跨团队依赖和代码抽象风险比创建相同组件的 3 到 4 倍更危险和繁琐。

我们注意到,花费适当的时间来分析用户流并识别子域可以减少重复次数。

此外,我们注意到使用微前端的话,由于最初分析项目并创建有意义的子域,因此跨团队的依赖关系并不像其他项目那样经常发生。

如果在你的情况下,它是绝对必须重用的组件,有一种方法可以使用 Web 组件来减轻重复,以标准化组件代码,使用这种技术,它可以与任何框架结合使用,但这个讨论应该在另一篇帖子里?。

当我们开始迈向微前端时,对我来说非常清楚的是必须考虑开发团队的未来,而不仅仅是解决技术问题。

借助微前端,我们能够在不影响交付速度的情况下提供我所寻求的独立性,每个团队都拥有端到端的特定域,保证了添加新功能,修复错误或添加改进的简单方法,没有冒着对我们的多个开发中心传播的其他应用或依赖关系产生影响的风险。

与新开发人员加入公司以及在我的会谈或在线研讨会期间多次分享这些信息后,我知道你可能会有大量关于引导程序的问题,它如何加载微前端,如何共享数据等等。

我将在下一篇文章中回答所有这些问题,这些问题将集中在引导程序上,所以请跟随我,不要错过微前端世界中的深潜。

如果你对微型前端有任何好奇或疑问,请随时与我联系,我总是热衷于尽可能多地帮助社区?!

转载于:https://juejin.im/post/5d04989e5188257a6b40e5c0

【译】采用微前端架构相关推荐

  1. 聊一聊关于微前端架构的几种技术选型

    背景 随着SPA大规模的应用,紧接着就带来一个新问题:一个规模化应用需要拆分. 一方面功能快速增加导致打包时间成比例上升,而紧急发布时要求是越短越好,这是矛盾的.另一方面当一个代码库集成了所有功能时, ...

  2. 聊一聊关于微前端架构的几种技术选型(转载,侵权必删)

    背景 随着SPA大规模的应用,紧接着就带来一个新问题:一个规模化应用需要拆分. 一方面功能快速增加导致打包时间成比例上升,而紧急发布时要求是越短越好,这是矛盾的.另一方面当一个代码库集成了所有功能时, ...

  3. 【微前端】1404- 常用微前端架构的几种技术选型

    原文: https://juejin.cn/post/7113503219904430111?share_token=a2d6b49c-d8ce-4448-acd3-d71bbc6e228d 作者:小 ...

  4. 广州蓝景分享—目前微前端架构的几种技术选型,你了解吗?

    各位编程的小伙伴,今天广州蓝景继续跟大家分享前端技术相关文章:微前端架构的几种技术选型,你了解吗?随着SPA大规模的应用,紧接着就带来一个新问题:一个规模化应用需要拆分. 一方面功能快速增加导致打包时 ...

  5. 乾坤 微前端_微前端架构初探以及我的前端技术盘点

    前言 最近几年微前端一直是前端界的热门议题, 它类似于微服务架构, 主要面向于浏览器端,能将一个复杂而庞大的单体应用拆分为多个功能模块清晰且独立的子应用,且共同服于务同一个主应用.各个子应用可以独立运 ...

  6. 生产可用:是时候来一个微前端架构了!

    微前端的场景域 在选择一个微前端方案之前,常常需要思考这样一个问题,我们为什么需要微前端.通常对微前端的诉求有两个方面,一是工程上的价值,二是产品上的价值. 对于工程上的价值,可以从一个三年陈的项目来 ...

  7. 微前端架构在容器平台的应用

    源宝导读:随着业务的发展,天际-星舟平台未来需要解决与其他云共创共建,跨团队高效协作等诸多问题,而星舟现有的技术架构将难以支撑.本文将介绍星舟平台如何通过向更先进的"微前端"架构演 ...

  8. 什么时候不要采用微服务架构

    微服务不能"包治百病". 时下微服务是一个不错的架构,它具备模块化.可伸缩和高容错这些优点.许多公司都采用微服务架构并取得了巨大的成功,自然而然地,如果你正开始一个新项目,微服务似 ...

  9. 网页上的微服务—微前端架构实践

    作者:郭凌波 恒生LIGHT云社区 一.什么是微前端? "微前端"一词最早于2016年底在<ThoughtWorks Technology Radar>中提出,它将微服 ...

  10. qiankun 微前端_看滴普大前端是如何玩转基于“qiankun”(乾坤)的微前端架构的...

    前言 「微前端」可以算是 2019年前端技术领域中最热门的话题.各个大厂也纷纷贡献出了自己的解决方案和实践分享.滴普科技作为一家致力于为企业提供数字化转型服务的技术公司,前端也需要灵活聚合,快速复用, ...

最新文章

  1. nodejs mysql 异步_Gearman + Nodejs + MySQL UDF异步实现 MySQL 到 Redis 的数据同步
  2. 使用jquery合并表格中相同文本的相邻单元格
  3. AI真的会杀人?DeepMind开发了二维网格游戏来做测试
  4. tomcat设置监听端口以及设置运行环境
  5. iOS - 获取安装所有App的Bundle ID
  6. ajax的url怎么将后缀补上_蜂蜜杏仁怎么做?杏仁和蜂蜜腌制方法
  7. REVERSE-PRACTICE-CTFSHOW-4
  8. 搞计算机,还是需要高配且专业的笔记本(这个名字好像是有点像广告贴了哈)...
  9. 杰里之AC897N_AD697N_earphone_release_ V2.0.1 开立体声左右声道数据对调【篇】
  10. vSphere ESXI 7.0部署详细安装指南
  11. E-mail计算机实验报告,邮件发送实验报告
  12. 爬虫 requests User-Agent池 FakeUserAgent URL传参
  13. 移动开发利器-Bmob后端云使用体验
  14. 直播 | Apache Kylin × Apache Hudi Meetup
  15. 微信输入法,终于来了。。。
  16. oracle-win10-11g-R2 安装步骤
  17. 【输入一个数并判断是质数还是合数】
  18. 判断是否符合 USD 格式
  19. 软工实践第三次作业-结对项目1
  20. github团队开发--组建自己的组织(Organization)

热门文章

  1. ssh登录很慢,登录上去后速度正常问题的解决方法
  2. Spring配置属性文件
  3. 【转】C++实用技巧(三)
  4. 代码的执行效率(3)--缓存与局部性 摘自赵劼老师的博客
  5. 【图像处理】【去模糊】代码资源汇总
  6. 简单区块链Python实现
  7. 组合模式与职责链模式编程实现
  8. 智能优化算法:绯鲵鲣优化算法-附代码
  9. 《剑指offer》面试题23——从上往下打印二叉树
  10. Java之 final关键字