小白笔记-微前端

什么是微前端?

微前端提供了一种技术可以将多个独立的 web 应用聚合到一起,提供统一的访问入口。

微前端的思路把后端微服务的架构引入到前端,其核心是能够已业务为单位构建端到端的垂直架构,使等单个的团队能够独立自主的进行相关的开发。

微前端的核心思路 是 远程应用程序,包含组件/模块/包的运行时加载。对于用户而言,访问的是一个微前端的容器,容器加载运行在远程服务器上的应用,把这些远程应用作为 组件/模块/包 在 本地浏览器中加载。

  • 组件是底层 UI 库的构建单元
  • 模块是相应运行时的构建单元
  • 包 是 依赖性解析器的构建单元
  • 微前端 是 所提出的应用程序的构建快

微服务主要思路:

  • 将应用分解为小的、互相连接的微服务,一个微服务完成某个特定功能
  • 每个微服务都有自己的业务逻辑和适配器,不同的微服务,可以使用不同的技术去实现
  • 使用统一的网关进行配置

为什么需要微前端,优势?

随着业务复制度的上升,保体积越来越大,每个版本小需求功能都会导致项目的全量部署,测试,上线,费时费力,加剧了出错风险。

在微前端中,web 应用被拆分为多个模块,每个模块可独立开发、测试、部署。更改一个模块不会影响到其他模块。

拆分大应用为小应用,方便迭代更新,且兼容历史应用,实现增量开发

特点/优势

  • 松耦合代码、独立部署
  • 增量开发
  • 团队自洽
  • 通过路由进行跨应用程序通信
  • 解决大型项目迭代问题
  • 解决多团队技术栈不同的问题

如何实现微前端架构?

构建的角度来看有两种,编译时构建、运行时构建

  • 编译时微前端,通查将第三方库中的组件作为包,在构建时引入依赖。这种实现引入新的微前端需要重新编译,不够灵活。编译时的微前端可以通过webComponents,Monorepo实现。
  • 运行时微前端, 一次加载或延迟加载 按需动态将微型前端注入到容器应用程序中。不需要构建,可以动态在代码中定义加载。
  • Module Federation (webkpack5)中的新特性,主要用来解决多个应用之间代码共享问题。

具体实现方式?

基于 iframe 完全隔离的方案
  • 简单,无需改造
  • 完美隔离,js、css 都是独立的运行环境
  • 无法保证路由状态,刷新后路由状态丢失
  • 完全的隔离导致与子应用的交互变的困难
  • 整个应用全量资源加载,性能差
基于 single-spa 路由劫持方案
  • 通过劫持路由的方式来做子应用直接的切换,但计入方式需要融合自身路由,有一定的局限性
  • qiankun 是对 single-spa 做了一层封装,通过 import-html-entry 包 解析 HTML 获取资源路径,然后对资源进行解析、加载。
京东 micro-app 方案
  • 借鉴 WebComponet 的思想,通过 CustonmElement结合 自定义的 ShadowDom, 将微前端封装成一个类 webComponent 组件,从而实现微前端的组件化渲染

技术选型

  • single-spa, 第一个微前端框架,其提供较为基础的 api,应用在实际项目中 需要进行大量封装且入侵性强,使用不方便。
  • qiankun,阿里开源的,基于 single-spa 的上层封装,在国内生态较好,有先行者铺路
  • EMP, 基于 module federation 实现的一套可以跨应用共享资源的框架,处理具备微前端的能力外,还实现了跨应用状态共享、跨框架组件调用的能力。