本文将介绍业内各大知名IT公司采用的微前端解决方案,以及它们带来的优缺点。由于这些缺点,我们的团队探索了一套目前认为最好的微前端解决方案。通过本文,您可以快速帮助您梳理微前端解决方案的优缺点,从而做出更好、更明智的选择,让您的团队受益。1、写在上一篇文章中,我们深入分析了什么是微前端,它能带来什么好处。现在让我们回顾一下微前端的概念:构建现代Web应用程序的技术、策略和秘诀,多个团队可以独立发布功能。中文解读:可以由多个团队开发独立开发的现代Web应用的技术、策略和场景。本文在此基础上对现有的微前端方案进行了对比和总结。废话不多说,开始今天的话题吧。2.现有的微前端解决方案在查找了大量资料后,我总结了以下几种能够真正实现微前端概念的主流解决方案。如有遗漏,欢迎小伙伴们补充~1.众所周知,iframe是由html标签提供的,可以加载其他网络应用的内容,它兼容所有的浏览器,所以你可以用它来加载任何你想加载的网络应用。iframe最大的特点就是提供了浏览器原生的硬隔离方案,可以完美解决样式隔离、js隔离等问题。看完这里,相信小伙伴们和我一样,都觉得iframe非常符合微前端概念中提到的独立开发、独立维护、相互隔离。有一种想法,你可以去ifame,然后你就完成了。但为什么会这样到现在为止,它还不是微前端的主要实现方式。后来有幸在乾坤科技圆桌上看到一篇关于微前端WhyNotIframe的文章。总结的很好。现在我将重复其中一个描述。所有的事情都要做,但它最大的问题是它的隔离性无法被打破,导致应用之间无法共享上下文,从而带来开发体验和产品体验上的问题。以下是我对文章总结部分的总结:不是单页应用,会导致浏览器刷新iframeurl状态丢失,后退前进按钮无法使用。弹出框的功能不能应用于整个大型应用,只能在相应的窗口中显示。由于应用可能不在同一个域,所以必须将主应用的cookie透传给不同根域名的子应用,以达到免登录的效果。每次子应用进入,都是一个重建浏览器上下文和重新加载资源的过程,占用资源多,资源消耗大。iframe的特性使得搜索引擎无法获取其中的内容,从而无法实现应用的seo。我猜想,以上原因是iframe不能作为官方微前端解决方案的原因。2.WebComponents可能很多朋友对WebComponents不是很了解。它是谷歌推出的浏览器的原生组件。MDN对WebComponents的定义如下:作为开发人员,我们都知道尽可能多地重用代码是一个好主意。对于自定义标记结构,这通常不是那么容易-想想复杂的HTML(以及相关的样式和脚本),有时您必须编写代码来呈现自定义UI控件,如果您不小心,使用它们可能会把您弄得一团糟页。WebComponents旨在解决这些问题——它由三种主要技术组成,它们可以一起使用来创建自定义元素,这些元素封装了功能,并且可以在您喜欢的任何地方重复使用,而不必担心代码冲突。它的三个主要技术是指:自定义元素(customelements):一组JavaScriptAPI,允许您定义自定义元素及其行为,然后可以在您的用户界面中按需要使用。ShadowDOM:一组JavaScriptAPI,用于将封装的“影子”DOM树附加到元素(与主文档DOM分开呈现)并控制它们的相关功能。这样,您可以将元素的功能保密,这样就可以编写脚本和设置样式,而不必担心与文档的其余部分发生冲突。HTML模板:和元素允许您编写不显示在呈现页面中的标记模板。然后它们可以作为自定义元素结构的基础多次重复使用。通过上面的描述,结合微前端的概念,我们来看看WebComponents是如何实现微前端的:技术栈无关:WebComponents是浏览器原生组件,即可以在任何框架中使用.独立开发:使用WebComponents开发的应用不需要关联其他应用。应用间隔离:ShadowDOM的特性,每个导入的微应用都可以达到相互隔离的效果。综上所述,WebComponents是一种以组件加载的方式将微应用集成为微前端的手段,但不幸的是,WebComponents是浏览器的新特性,所以它的兼容性不是很好。兼容性要求还是不能用,请查看canIuse了解详情。3、ESMESM是ESModule的缩写。它是Ecmascript2015提出的一种前端模块化方法,那么它是如何实现微前端的呢?其实微前端无外乎三大特点,无技术栈限制,独立应用开发,多应用融合。只要掌握了这三个特点,就不难理解ESM是怎么做的了:没有技术栈限制:ESM加载的只是js内容,不管是哪个框架,最终都会被编译成js,所以不管是哪个框架,ESM都可以加载。独立开发应用:ESM只是js的一种规范,不会影响应用的开发方式。多应用集成:只要将微应用以ESM的形式暴露出来,就可以正常加载。远程加载模块:ESM可以直接请求CDN资源,这是它与生俱来的能力。ESM是能够实现微前端的核心思想,但是它也有兼容性的缺点。虽然ESM已经很不错了,但是大部分老浏览器还是不能直接使用。这也是babel等编译工具的出现。好在他可以通过webpack、rollup、esbuild、snowpack等编译工具变成兼容代码。4.乾坤是微前端领域最早也是知名度最高的框架。是真正意义上的单页面微前端框架。那么乾坤有什么特点呢?我在它的官网找到了如下总结:基于single-spa包,提供了更加开箱即用的API技术栈独立,任何技术栈应用都可以使用/接入,无论是React/Vue/Angular/JQuery或其他框架如HTMLEntry访问这种方法可以让您像使用iframe一样轻松访问微应用。样式隔离保证微应用之间的样式不互相干扰JS沙箱,保证微应用之间的全局变量/事件不冲突。资源预加载,浏览器空闲时间预加载加载未打开的微应用资源,加快微应用的打开速度。umi插件提供@umijs/plugin-qiankun用于一键切换umi应用到微前端架构系统。除了最后一点扩展,微前端想要达到的效果都已经达到了。达到。5、EMPEMP是大悦时代业务中心自主研发的最年轻的单页微前端解决方案。那么,它有哪些特点呢,一起来看看吧:基于Webpack5的新特性ModuleFederation,实现第三方依赖共享,减少不必要的代码引入,什么是ModuleFederation,这里不再赘述。每个微应用独立部署运行,通过CDN引入主程序,只需部署一次,即可提供给任何基于ModuleFederation的应用。并且这部分代码是远程引入的,不需要参与应用的打包。动态更新微应用:EMP通过CDN加载微应用,当每个微应用中的代码发生变化时,可以加载到最新的微应用,无需重新打包发布新的集成应用。去中心化,每个微应用都可以引入其他微应用,没有中心应用的概念。跨技术栈组件调用提供调用主应用框架中其他框架组件的能力(目前支持相互调用的框架及使用方法请参考官方文档)。按需加载,开发者可以选择只加载微应用需要的部分,而不是强制加载整个应用。应用间通信,各个应用可以共享状态,就像使用npm模块开发一样方便。生成相应的技术栈模板,可以像cerate-react-app或者create-vue-app,一键搭建开发环境,减轻开发者负担。远程拉取ts声明文件,emp-cli内置拉取远程应用中代码声明文件的能力,让使用ts开发的开发者不再为代码出错而烦恼。细心的朋友应该会发现,EMP除了具备微前端的能力,还实现了跨应用状态共享、跨框架组件调用的能力,这些都是现有框架所不具备的优秀特性!三、小结课程最后五分钟了,来看看今天的分享需要掌握哪些关键知识:1、现有的微前端方案:iframeWebComponentsESMqiankunEMP2、各方案的优缺点:iframe可以直接加载其他应用,但不能是单页,所以很多功能在主应用中无法正常显示。WebComponents和ESM是浏览器提供给开发者的能力。它们可以在单个页面中实现微前端,但是后者需要代码隔离,而且是浏览器的新特性,它们都存在兼容性问题。微前端方面的探索还不成熟,只能作为一种面向未来的微前端方式。qiankun基本可以称得上是单页版的iframe,沙箱隔离和资源预加载的特点,几乎无懈可击。EMP作为最年轻的前端解决方案,在吸收了web的诸多优秀特性后诞生。在实现微前端的基础上,扩展了跨应用状态共享、跨框架组件调用、ts声明文件远程拉取、动态更新等。微应用等功能。同时,细心的朋友应该已经发现,EMP可以共享第三方依赖,尽可能的让代码复用,减少加载的内容。