# 微前端的几种解决方案
# iframe
html提供的标签, 能兼容所有的浏览器
iframe 最大的特性就是提供了浏览器原生的硬隔离方案,不论是样式隔离、js 隔离这类问题统统都能被完美解决。但他的最大问题也在于他的隔离性无法被突破,导致应用间上下文无法被共享,随之带来的开发体验、产品体验的问题
缺点:
- url 不同步。浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用
- UI 不同步,DOM 结构不共享
- 全局上下文完全隔离,内存变量不共享。
- 慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程
# web Components
google推出的浏览器原生组件
参考mdn的概念, 它由三项主要技术组成,它们可以一起使用来创建封装功能的定制元素,可以在你喜欢的任何地方重用,不必担心代码冲突
Custom elements(自定义元素): 一组JavaScript API,允许您定义custom elements及其行为,然后可以在您的用户界面中按照需要使用它们
Shadow DOM(影子DOM): 一组JavaScript API,用于将封装的“影子”DOM树附加到元素(与主文档DOM分开呈现)并控制其关联的功能。通过这种方式,您可以保持元素的功能私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突
HTML templates(HTML模板):
<template>和<slot>元素使您可以编写不在呈现页面中显示的标记模板。然后它们可以作为自定义元素结构的基础被多次重用
根据这些描述, web Components是以组件的形式将微应用整合为微前端的
缺点: 兼容性
- Firefox(版本63)、Chrome和Opera都默认支持Web组件。
- Safari支持许多web组件特性,但比上述浏览器少。
- Edge正在开发一个实现。(edge 这个指的是旧edge, 新的使用
Chromium)
可以通过polyfill来解决兼容问题
webcomponents.js (v1 spec polyfills) (opens new window)
npm install @webcomponents/webcomponentsjs
# ES Module
估计你会很好奇着不是es2015中提到的一种前端模块化手段吗 跟微前端有什么关系呢
回忆一下微前端的特性:
- 无技术栈限制
- 应用独立开发
- 多应用整合
再看看es module
- 无技术栈限制: esM加载的只是js, 但是无论哪个框架,最终都要编译js
- 应用独立开发: esM只是一种规范, 不影响开发模式
- 多应用整合: 只需要将应用以esM的方式暴露出来, 就能正常加载
- 远程加载模块: esM能直接请求远程(一般是cdn)资源,
<script type="module" src='xxx'>
# qiankun
最早成型且知名度最广的单页微前端框架
特点(这里就直接引用官方):
- 基于
single-spa封装, 提供了开箱即用的api - 技术栈无关, 任意技术栈的应用均可 使用/接入
html entry接入方式,让你接入微应用像使用 iframe 一样简单- 样式隔离, 确保微应用之间样式互相不干扰
- JS 沙箱, 确保微应用之间 全局变量/事件 不冲突
- 资源预加载, 在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度
- umi 插件,提供了
@umijs/plugin-qiankun供 umi 应用一键切换成微前端架构系统
# EMP
新起之秀(第一次听到这个框架是在某个大会上), 除了具备微前端的能力外, 还实现了跨应用状态共享, 跨框架组件到能力,这些是qiankun没有的
特点:
- 基于webpack5的
Module Federation, 达到第三方依赖共享,减少不必要的代码引入 - 每个微应用独立部署运行, 通过cdn的方式引入主程序中, 因此每个微应用中的代码有变动时,无需重新打包发布新的整合应用便能加载到最新的微应用
- 去中心化(区别于qiankun), 每个微应用间都可以引入其它微应用, 无基座概念
- 跨技术栈组件式调用,提供了在主应用框架中可以调用其他框架组件的能力
- 按需加载,开发者可以选择只加载微应用中需要的部分,而不是强制只能将整个应用全部加载
- 应用间通信,每一个应用都可以进行状态共享,就像在使用npm模块进行开发一样便捷
- 生成对应技术栈模板,它能像cerate-react-app一样,也能像create-vue-app一样,通过指令一键搭建好开发环境,减少开发者的负担
- 远程拉取ts声明文件,emp-cli中内置了拉取远程应用中代码声明文件的能力,让使用ts开发的开发者不再为代码报错而烦恼
# 其它
Why Not Iframe (opens new window)
Web Components 官网 (opens new window)
Web Components mdn (opens new window)
11 Micro Frontends Frameworks (opens new window)
早早聊大会 微前端专场 (opens new window)