前端微服务

前端微服务化后的优势:

  1. 复杂度可控: 每一个UI业务模块由独立的前端团队开发,避免代码巨无霸,保持开发时的高速编译,保持较低的复杂度,便于维护与开发效率。
  2. 独立部署: 每一个模块可单独部署,颗粒度可小到单个组件的UI独立部署,不对其他模块有任何影响。
  3. 技术选型灵活: 也是最具吸引力的,在同一项目下可以使用如今市面上所有前端技术栈,也包括未来的前端技术栈。
  4. 容错: 单个模块发生错误,不影响全局。
  5. 扩展: 每一个服务可以独立横向扩展以满足业务伸缩性,与资源的不必要消耗;

我们何时需要前端微服务化?

  1. 项目技术栈过于老旧,相关技能的开发人员少,功能扩展吃力,重构成本高,维护成本高.
  2. 项目过于庞大,代码编译慢,开发体差,需要一种更高维度的解耦方案.
  3. 单一技术栈无法满足你的业务需求

微前端是什么:

  • 技术栈无关,主框架不限制接入应用的技术栈,微应用具备完全控制权
  • 独立开发、独立部署,微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新
  • 增量升级,在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略
  • 独立运行时,每个微应用之间状态隔离,运行时状态不共享

single-spa到底是什么:

仅仅是一个子应用生命周期的调度者。single-spa 为应用定义了 boostrap, load, mount, unmount 四个生命周期回调:


1.jpg

single-spa 只做两件事: 提供生命周期概念,并负责调度子应用的生命周期 挟持 url 变化事件和函数,url 变化时匹配对应子应用,并执行生命周期流程

微前端概念

特点: 技术栈无关 独立开发、独立部署 增量升级 独立运行时

为了解决大型工程在变更、维护、扩展等方面的困难而提出的。

微前端就是将不同的功能按照不同的维度拆分成多个子应用。通过主应用来加载这些子应用。

微前端的核心在于拆, 拆完后再合!

将庞大的整体拆成可控的小块,并明确它们之间的依赖关系。关键优势在于:

  • 代码库更小,更内聚、可维护性更高
  • 松耦合、自治的团队可扩展性更好
  • 渐进地升级、更新甚至重写部分前端功能成为了可能

微前端优点:

可以与时俱进,不断引入新技术/新框架

局部/增量升级

代码简洁、解耦、更易维护

独立部署

iframe和single spa区别:

iframe缺点:

1. 页面加载影响主页面的加载,阻塞onload时间,本身加载也慢

2. 布局问题:必须要个高度,可能出现多滚动条情况

3. 弹窗及遮罩层只能在iframe里

4. 浏览器前进和后退对iframe中内容不生效

优点:

  1. 完全隔离了css和js,避免了各个系统之间的样式和js污染
  2. 可以在子系统完全不修改的情况下嵌入进来

single spa 缺点:

1. css和js需要制定规范,进行隔离。否则容易造成全局污染,尤其是vue的全局组件,全局钩子。

2. 需要子系统配合修改。但是不影响子系统独立开发部署,路由部分对子系统有一些改动,但是不影响功能。

优点:

1. 加载快,可以将所有系统共用的模块提取出来,实现按需加载,一次加载,其他的复用。

2. 修改子系统的样式,不需要代理服务器,直接修改,因为同属于一个document。

3. 用户体验好、快,内容的改变不需要重新加载整个页面,避免了不必要的跳转和重复渲染

4. http请求少,服务器压力小。

弊端:

首先我们必须手动实现应用加载逻辑,挨个罗列子应用需要加载的资源,这在大型项目里十分困难

它只是负责把应用加载到一个页面中,至于应用能否协同工作,是很难保证的。

qiankun

基于single-spa,具备 js 沙箱、样式隔离、HTML Loader、预加载 等微前端系统所需的能力。qiankun 可以用于任意 js 框架,微应用接入像嵌入一个 iframe 系统一样简单。

主流微前端方案:

  1. iframe
  2. 基座模式,主要基于路由分发,qiankun和single-spa就是基于这种模式
  3. 组合式集成,即单独构建组件,按需加载,类似npm包的形式
  4. EMP主要基于Webpack5 Module Federation
  5. Web Components

iframe:是传统的微前端解决方案,基于iframe标签实现,技术难度低,隔离性和兼容性很好,但是性能和使用体验比较差,多用于集成第三方系统;

基座模式:主要基于路由分发,即由一个基座应用来监听路由,并按照路由规则来加载不同的应用,以实现应用间解耦;

组合式集成:把组件单独打包和发布,然后在构建或运行时组合;

EMP:基于Webpack5 Module Federation,一种去中心化的微前端实现方案,它不仅能很好地隔离应用,还可以轻松实现应用间的资源共享和通信;

Web Components:是官方提出的组件化方案,它通过对组件进行更高程度的封装,来实现微前端,但是目前兼容性不够好,尚未普及。

微前端需要解决的问题分为两大类:

  1. 应用的加载与切换
  2. 应用的隔离与通信

应用的加载与切换需要解决的问题包括:路由问题、应用入口、应用加载;

应用的隔离与通信需要解决的问题包括:js隔离、css样式隔离、应用间通信。

single-spa很好地解决了路由和应用入口两个问题,但并没有解决应用加载问题,而是将该问题暴露出来由使用者实现(一般可以用system.js或原生script标签来实现);

qiankun在此基础上封装了一个应用加载方案(即import-html-entry),并给出了js隔离、css样式隔离和应用间通信三个问题的解决方案,同时提供了预加载功能。

借助single-spa提供的能力,我们只能把不同的应用加载到一个页面内,但是很难保证这些应用不会互相干扰。而qiankun为我们解决了这些后顾之忧,使得它成为一个更加完整的微前端运行时容器。

为什么要搞微前端?

随着单个独立产品越来越多,会导致当前项目越来越大

启动慢,编译慢

后期迭代时会局限在单一框架内

无法搭配后端的微服务进行单个服务的独立上线,因为前端项目是一个

为什么需要?

旧的系统不下线,新的需要还在来。

系统需要有一套支持动态插拔的机制

系统中的部件具备足够清晰的服务边界

具备以下几个核心价值:

技术栈无关

独立开发、部署

增量升级

独立运行时,运行时状态不共享

主要的微前端框架

single-spa、qiankun(蚂蚁金服)、microapp(京东 2021年7月)

github star:

single-spa 11.6k

qiankun 13.3k

micro-app 3.3k

single-spa:

1. 功能上,只做了路由劫持、提供参数填写加载微应用的逻辑,功能少。

2. 接入成本上,接入需要自己手写加载微应用的逻辑,且子应用需要额外安装依赖,接入成本高

3. 改造成本上,需要自己实现应用隔离、通讯、以及预加载等,改造成本高

qiankun:

微应用之间独立、互不影响

与技术无关接入简单、像iframe一样简单

改造成本低、对现有工程侵入低、业务线迁移成本也低

与原有开发模式一致,学习成本低

微应用拆分规则:

尽量减少彼此的通信和依赖

总结:

iframe、single-spa 在功能完善度上不足,所以放弃选择;

emp 比较适合在项目初期选型使用,用约定来规避样式隔离和js隔离(所以 emp 没有把应用隔离考虑进去),比较适合在大型项目中使用;使用它我们面临webpack的升级改造

microapp 和qiankun,功能完整度上比较好,尽管 microapp 比 qiankun 多了元素隔离功能、插件系统,且使用了类web component的思路降低子应用的接入成本。

但基于 microapp 对 Proxy目前不考虑兼容,且社区活跃度上,qiankun 更胜一筹,工期短需要有一定的保障,所以最后选了qiankun

但是!!! 本人使用后出现如下问题:
使用qiankun
需要改动入口文件,
加public文件,
改webpack配置,
不支持webpack5的模块联邦,
组件共享困难,
全局状态管理会导致项目中redux全部修改,

无奈最终使用了模块联邦+microapp的微服务注册方式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容