微前端不是一门具体的技术,而是整合了技术、策略和方法,可能会以脚手架、辅助插件和规范约束这种生态圈形式展示出来,是一种宏观上的架构。这种架构目前有多种方案,都有利弊之处,但只要适用当前业务场景的就是好方案。
1. iframe
iframe 是 html 提供的标签, 可以加载其他web应用的内容 ,还能兼容所有的浏览器,所以它可以加载全部你想要加载的web应用 。它最大的特点就是提供了浏览器原生的硬隔离方案,无论是样式隔离、js 隔离这类问题全部都能完美解决。
iframe虽然能基本做到微前端所该做的所有事情,但它的隔离性无法被突破,导致应用间上下文无法被共享,会带来开发体验、产品体验的问题。不是单页应用,会导致浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。
2. ES Module
微前端无外乎三大特性, 无技术栈限制 、 应用单独开发 , 多应用整合 。
- 无技术栈限制: ESM 加载的只是js内容,无论哪个框架,最终都要编译成js,所以等于ESM 都能加载。
- 应用单独开发:ESM只是js的一种规范,不会影响应用的开发模式。
- 多应用整合:只要将微应用以 ESM 的方式暴露出来,就能正常加载。远程加载模块: ESM 能够直接请求 cdn 资源。ESM 也存在着兼容性这个弊端,大部分老版的浏览无法直接使用,不过他可以通过 webpack 、 rollup 、 esbuild 、 snowpack 等编译工具成为兼容性的代码。
3. qiankun
在微前端界, qiankun 称得上是最早成型且知名度最广的框架了,qiankun 的特点在其官网中是这样说的:
基于 single-spa 封装,提供了更加开箱即用的 API技术栈无关,任意技术栈的应用均可使用,不论是React/Vue/Angular/JQuery 还是其他等框架HTML Entry 接入方式,让你接入微应用像使用 iframe 一样简单样式隔离,保证微应用之间样式互相不干扰JS 沙箱,微应用之间全局变量/事件不冲突资源预加载。
4. EMP
Federation 实现,达到第三方依赖共享,减少不必要的代码引入的目的。每个微应用独立部署运行,并通过cdn的方式引入主程序中,所以只要部署一次,即可提供给任何基于 Module Federation 的应用使用。而且这部分代码是远程引入,不必参加应用的打包。
EMP 通过 cdn 加载微应用,所以每个微应用中的代码有变动时,不用重新打包发布就能加载到最新的微应用。每个微应用间都可以引入其他的微应用,没有中心应用的概念。跨技术栈组件式调用,提供了在主应用框架中可以调用其他框架组件的能力。
开发者可以按需加载,选择加载微应用中需要的部分,不强制将整个应用全部加载。每一个应用都可以进行状态共享,就像使用npm模块进行开发一样,十分方便。EMP 除了具备微前端的能力外,也有跨应用状态共享、跨框架组件调用的能力,这是它优秀的地方!