微前端

64 阅读1分钟

解决痛点

  • 兼容多个技术栈
  • 子应用可以独立构建,运行时动态加载,主应用完全解耦,靠协议接入(子应用必须导出bootstrap\mount\unmount方法)

iframe

  • 存在的问题
  1. 刷新页面状态重置
  • 通信
  1. url传参 2.原生Api CustomEvent实现通信 3.基于props主子应用间通信 4.使用全局变量、Redux进行通信

single-spa

  1. 缺点:
  • 未进行样式隔离、js隔离
  • 不够灵活,不能动态加载js文件
  1. 主应用和子应用之间样式隔离
  • BEM 约定项目前缀
  • css-Modules 打包时生成不冲突的选择器名(样式后生成字符串)
  • Shadow Dom 真正意义上的隔离(微信小程序有shadow样式)
  • css-in-js
  1. js沙箱隔离(应用的运行,切换前后不会改变全局) 1年前拍一张 在拍一张 将区别保存下来 在回到一年前 多个子应用使用es6的proxy
  • SystemJS 模块加载器

image.png

image.png 先加载systemjs-import再加载System.import

  • 手写system模块 image.png image.png

image.png image.png

image.png image.png

image.png

  • single-spa源码 包含的过程状态

image.png

image.png registerApplication方法 image.png reroute方法

image.png 获取getAppChanges返回的数据 image.png 1.对需要加载的列表进行加载,执行对应的方法

2.对需要挂载的列表进行挂载,执行对应的方法 钩子函数内部只能用promise

reroute方法在启动和挂载都需要执行,统一用状态status控制执行的逻辑

qiankun

基于single-spa,默认动态加载子应用js,但是子应用必须解决跨域 qiankun是把子应用所有的模块请求下来,而不是iframe模式

EMP

module Federation,接入成本低,依靠webpack联邦模块的特性