对比多种微前端方案

转自团队掘金原文:https://juejin.cn/post/6898268972178178061

 

一、写在前面

在之前的文章中,我们已经深入剖析了微前端究竟是什么,可以带来什么收益,现在让我们复习一下微前端的概念:

Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently.

中文释义:

可以由多个团队独立开发的现代web应用程序的技术、策略和方案。

本文则是在此基础上对现有的微前端解决方案进行对比总结,废话少说,让我们开始今天的课题。 对比多种微前端方案_第1张图片

二、现有微前端解决方案

查找了大量的资料后,我总结了以下主流的能够真正实现微前端概念的解决方案,如有遗漏,欢迎小伙伴们补充~

1、iframe

众所周知,iframehtml提供的标签,能加载其他web应用的内容,并且它能兼容所有的浏览器,因此,你可以用它来加载任何你想要加载的web应用

iframe最大的特性就是提供了浏览器原生的硬隔离方案,不论是样式隔离、js 隔离这类问题统统都能被完美解决。读到这时,相信小伙伴们跟我一样,觉得iframe与微前端概念中提到的独立开发独立维护相互隔离非常的吻合,有种直接上ifame就完事儿了的想法,但为何它到现在也不是微前端主要的实现方式呢,后来有幸拜读了qiankun技术圆桌中一篇关于微前端Why Not Iframe的思考,总结的很到位,现复述其中的一段描述

iframe虽然基本能做到微前端所要做的所有事情,但它的最大问题也在于他的隔离性无法被突破,导致应用间上下文无法被共享,随之带来开发体验、产品体验的问题。

以下是我对该文中总结部分的总结:

  1. 不是单页应用,会导致浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。
  2. 弹框类的功能无法应用到整个大应用中,只能在对应的窗口内展示。
  3. 由于可能应用间不是在相同的域内,主应用的 cookie 要透传到根域名都不同的子应用中才能实现免登录效果。
  4. 每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程,占用大量资源的同时也在极大地消耗资源。

经过以上思考,我个人也有了一些拓展总结:

  1. iframe的特性导致搜索引擎无法获取到其中的内容,进而无法实现应用的seo

我猜,以上原因便是iframe没能作为官方微前端方案的原因吧。

2、Web Components

或许很多小伙伴对Web Components不是很了解,它是由google推出的浏览器的原生组件,MDN对Web Components的定义是这样的:

作为开发者,我们都知道尽可能多的重用代码是一个好主意。这对于自定义标记结构来说通常不是那么容易 — 想想复杂的HTML(以及相关的样式和脚本),有时您不得不写代码来呈现自定义UI控件,并且如果您不小心的话,多次使用它们会使您的页面变得一团糟。

Web Components旨在解决这些问题 — 它由三项主要技术组成,它们可以一起使用来创建封装功能的定制元素,可以在你喜欢的任何地方重用,不必担心代码冲突。

它的三项主要技术是指:

  • Custom elements(自定义元素):一组JavaScript API,允许您定义custom elements及其行为,然后可以在您的用户界面中按照需要使用它们。
  • Shadow DOM(影子DOM):一组JavaScript API,用于将封装的“影子”DOM树附加到元素(与主文档DOM分开呈现)并控制其关联的功能。通过这种方式,您可以保持元素的功能私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突。
  • HTML templates(HTML模板):