微前端架构解析:核心概念与主流方案特性对比

背景

首先我们可以先来想一下,日常工作中我们是如何进行代码复用的?

  • 复制粘贴 Ctrl cv
  • 抽离封装模块
  • 打npm包

但是,以上方法,会存在哪些问题呢?

1.复制粘贴

  • 增加重复的代码
  • 复用代码逻辑发生变动时需要处处修改
  • 违反 Don’t Repeat Yourself 原则

2.抽离封装模块

  • 仅适用于当前项目,无法兼容多个项目要使用同一个模块的情况

3.打npm包或库

  • 还蛮通用的…
  • 但是也有其他问题:发布效率低下。
  • 当迭代npm包内的逻辑业务:发布npm包 -> 告诉其他使用的伙伴更新npm ->再各自构建发布一次 (繁琐极了)

于是微前端诞生了,用来将大型项目进行拆分和解耦

二、微前端

微前端概念是从微服务概念扩展而来的,摒弃大型单体方式,将前端整体分解为小而简单的块,这些块可以独立开发、测试和部署,同时仍然聚合为一个产品出现在客户面前。

微前端架构旨在解决单体应用在一个相对长的时间跨度下,由于参与人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用后,随之而来的应用不可维护的问题。这类问题在企业级 Web 应用中尤其常见。

、三大特性

  • 无技术栈限制
  • 应用单独开发、测试和部署、交付
  • 多应用整合

四、微前端解决方案

iframe

iframe是html提供的标签,能加载其他web应用的内容,而且它能兼容所有的浏览器

缺点:

  • 不是单页应用,会导致浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。
  • 弹框类的功能无法应用到整个大应用中,只能在对应的窗口内展示。由于可能应用间不是在相同的域内,主应用的 cookie要透传到根域名到不同的子应用中,才能实现免登录效果。
  • 每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程,占用大量资源的同时也在极大地消耗资源。

经过以上思考,拓展总结:iframe的特性导致搜索引擎无法获取到其中的内容,进而无法实现应用的seo。

Web Components

它是由google推出的浏览器的原生组件: Web Component - Web API | MDN

Web Components具备微前端的几个特性

  • 技术栈无关:Web Components是浏览器原生组件,即是在任何框架中都可以使用。
  • 独立开发:使用Web Components开发的应用无需与其他应用间产生任何关联。
  • 应用间隔离:借助Shadow DOM的特性,各个引入的微应用间可以达到相互隔离的效果。

微前端实践:从概念到解决方案-优快云博客

ESM

ESM是ES Module的缩写,是Ecma script 2015中提出的一种前端模块化手段。

ESM 同样具备微前端架构的核心特性:

  • 无技术栈限制:ESM加载的只是js内容。无论哪个框架,最终都要编译成js,因此,无论哪种框架,ESM都能加载。
  • 应用单独开发:ESM只是js的一种规范,不会影响应用的开发模式。
  • 多应用整合:只要将微应用以ESM的方式暴露出来,就能正常加载。
  • 远程加载模块:ESM能够直接请求cdn资源,这是它与生俱来的能力。

ESM是能做到微前端的核心思想,但是它也存在着兼容性这一大弊端 "esm" | Can I use... Support tables for HTML5, CSS3, etc

EMP

EMP是由欢聚时代业务中台自主研发的最年轻的单页微前端解决方案,除了具备微前端的能力外,还实现了跨应用状态共享跨框架组件调用的能力。

具备以下几大特点:

  • 每个微应用独立部署运行,支持跨技术栈组件式调用。
  • 每一个应用都可以进行状态共享,就像在使用npm模块进行开发一样便捷

Fronts

Fronts 是一个基于 Webpack 的 Module Federation API 设计的渐进式微前端框架。它强调颗粒间的去中心化依赖管理,并支持多种运行模式来满足不同的微前端架构需求。

  • 支持非 Module Federation - 虽然 Fronts 基于 Module Federation 概念,但它依然支持任何传统且不支持 Module Federation 的前端应用。
  • 去中心化配置 - 只需要在每个 Fronts 应用中设置 site.json,就像设置一个 package.json 一样简单,Fronts 支持多层嵌套的微前端。
  • 跨框架 - 没有任何现代前端框架限定。
  • 代码分割/懒加载 - 支持在 Fronts 应用内进行代码拆分和导出共享模块,它可以被其他 Fronts 应用作为依赖模块进行懒加载。
  • CSS 隔离 - 可选的 CSS 隔离设定,并根据不同的渲染方式,具备宽松隔离和严格隔离的可选项。
  • 生命周期 - 每个 Fronts 应用的 Entry 支持简洁的生命周期接口。
  • Web Components 和 iFrame - 支持多种前端运行时容器用于不同隔离环境的要求。
  • 多种构建模式 - 同时支持在微前端模式和非微前端模式构建,兼容动态化的运行时集成和静态化的构建时集成。
  • Monorepo 和 TypeScript - 良好支持 Monorepo 和 TypeScript,二者与 Fronts 是非常适配的技术栈组合。
  • 版本控制 - Fronts 提供的版本控制可用于高效和动态的即时交付应用,当然也包括支持灰度发布。
  • 零劫持 - Fronts 不做任何执行容器上的环境全局公共 API 劫持,保持运行环境的原始性,避免可能带来性能损失和安全问题。
  • 通用化消息通讯 - Fronts 提供简洁通用的响应式 API, 它支持前端绝大部分原生 API。

qiankun

在微前端界,qiankun算得上是最早成型且知名度最广的框架了,它是真正意义上的单页微前端框架

框架具备以下几大特点:

  • 基于single-spa封装,提供了更加开箱即用的 API
  • 技术栈无关,任意技术栈的应用均可使用/接入,不论是 React/Vue/Angular/JQuery 还是其他框架
  • HTML Entry 接入方式,让接入微应用像使用 iframe 一样简单
  • 样式隔离,确保微应用之间样式互相不干扰
  • JS 沙箱,确保微应用之间全局变量/事件不冲突
  • 资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加快微应用打开速度
  • umi 插件,提供了 @umijs/plugin-qiankun 供 umi 应用一键切换成微前端架构系统

作者:道一云低代码

作者想说:喜欢本文请点点关注~

更多资料分享

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道一云黑板报

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值