草庐IT

微前端总结

我想要革命、想要解脱... 2023-03-28 原文

微前端概述

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

  微前端不是一门具体的技术,而是整合了技术、策略和方法,可能会以脚手架、辅助插件和规范约束这种生态圈形式展示出来,是一种宏观上的架构。这种架构目前有多种方案,都有利弊之处,但只要适用当前业务场景的就是好方案。

常用微前端方案:

  1. iframe
  2. single-spa
  3. qiankun 基于 single-spa 方案实现, 更强大更易上手
  4. webpack5 ModuleFederationPluginEMP
  5. microApp
  6. wujie-micro

  single-spa太过于基础,对原有项目的改造过多,成本太高; iframe在所有微前端方案中是最稳定的、上手难度最低的,但它有一些无法解决的问题,例如性能低、通信复杂、双滚动条、弹窗无法全局覆盖,它的成长性不高,只适合简单的页面渲染。剩下的只有qiankunmicroAppwujie-micro了。

 

qiankun

  乾坤微前端架构则进一步对single-spa方案进行完善,主要的完善点:

    • 子应用资源由 js 列表修改进为一个url,大大减轻注册子应用的复杂度
    • 实现应用隔离,完成js隔离方案 (window工厂) 和css隔离方案 (类vue的scoped)
    • 增加资源预加载能力,预先子应用html、js、css资源缓存下来,加快子应用的打开速度

  总结一下方案的优缺点:

优点

    • 监听路由自动的加载、卸载当前路由对应的子应用
    • 完备的沙箱方案,js沙箱做了SnapshotSandbox、LegacySandbox、ProxySandbox三套渐进增强方案,css沙箱做了两套strictStyleIsolation、experimentalStyleIsolation两套适用不同场景的方案
    • 路由保持,浏览器刷新、前进、后退,都可以作用到子应用
    • 应用间通信简单,全局注入

缺点

    • 基于路由匹配,无法同时激活多个子应用,也不支持子应用保活
    • 改造成本较大,从 webpack、代码、路由等等都要做一系列的适配
    • css 沙箱无法绝对的隔离,js 沙箱在某些场景下执行性能下降严重
    • 无法支持 vite 等 ESM 脚本运行

成本上:

    • 接入成本:子应用需要接入生命周期代码;主应用需要接入注册微应用代码;
    • 改造成本:需要自己考虑微前端工程化问题,以及微前端平台运维。

风险上:

    • 社区活跃度:github star 数量 13.4k (统计时间2022-10-09
    • 文档齐全,demo

micro-app

  京东1年前出品,官网地址:https://micro-zoe.github.io/micro-app/

功能上:

    • 抛弃了路由劫持的思路,选用类web component的方案
    • 基于CustomElement和样式隔离、js隔离来实现微应用的加载,所以子应用无需改动就可以接入
    • 支持应用隔离
    • 通过劫持底层接口实现了元素隔离
    • 提供了插件系统
    • 支持预加载
    • 没有考虑工程化问题:如公用依赖,组件复用
    • 没有考虑到微前端平台运维
    • 不支持vite3

成本:

    • 接入成本:子应用无需改动,主应用需要接入微应用代码
    • 改造成本:需要自己考虑微前端工程化问题,以及微前端平台运维。

风险:

    • 这个框架基于CustomElementProxy API,前者针对低版本有polyfill,但后者没有,且目前官方文档说没有做兼容的计划
    • 社区活跃度 star 3.5k(统计时间2022-10-09
    • 文档齐全

wujie

  腾讯今年7月份出品,官网地址:https://wujie-micro.github.io/doc/guide/start.html

功能上:

    • 支持vite
    • 多应用同时激活在线
    • 框架具备同时激活多应用,并保持这些应用路由同步的能力
    • 组件式的使用方式
    • 无需注册,更无需路由适配,在组件内使用,跟随组件装载、卸载
    • 应用级别的 keep-alive
    • 子应用开启保活模式后,应用发生切换时整个子应用的状态可以保存下来不丢失,结合预执行模式可以获得类似ssr的打开体验
    • 纯净无污染
    • 无界利用iframewebcomponent来搭建天然的js隔离沙箱和css隔离沙箱
    • 利用iframehistory和主应用的history在同一个top-level browsing context来搭建天然的路由同步机制
    • 副作用局限在沙箱内部,子应用切换无需任何清理工作,没有额外的切换成本
    • 性能和体积兼具
    • 子应用执行性能和原生一致,子应用实例instance运行在iframewindow上下文中,避免with(proxyWindow){code}这样指定代码执行上下文导致的性能下降,但是多了实例化iframe的一次性的开销,可以通过 proload 提前实例化
    • 体积比较轻量,借助iframewebcomponent来实现沙箱,有效的减小了代码量

成本:

    • 开箱即用
    • 不管是样式的兼容、路由的处理、弹窗的处理、热更新的加载,子应用完成接入即可开箱即用无需额外处理,应用接入成本也极低

风险:

    • 太新了,今年7月份才发布
    • 社区活跃度 star 1.7k(统计时间2022-10-09
    • 文档不是特别齐全
    • 使用人数相对较少

微前端总结

  qiankun 方案对 single-spa 微前端方案做了较大的提升同时也遗留下来了不少问题长时间没有解决; micro-app 方案对 qiankun 方案做了较多提升但基于 qiankun 的沙箱也相应会继承其存在的问题; EMP 方案基于 webpack 5 联邦编译则约束了其使用范围; 目前的微前端方案在用户的核心诉求上都没有很好的满足,有很大的优化提升空间。

正常的一些轻量业务,是没有必要引入微前端的概念,这样只会自找麻烦,只有在业务触及了巨石应用范畴,给开发人员带来困扰的时候,才需要引入,以便解决一下通用问题,并保证具备以下能力:

  1. 自主的团队,维护着各团队解耦的代码库;
  2. 独立部署:各团队可以独立部署;
  3. 同步更新:各团队各业务功能升级后,整体应用能够同步更新;
  4. 增量升级:做到不修改历史包袱的情况下,进行逐步的更新;

  适合的业务场景:

    • 前端巨石工程:业务越来越复杂,许多复杂需求堆积在一个工程里,部署、debug、扩展过于困难,单个模块的重构成本大
    • 前端碎石工程:不同项目之间的依赖维护成本巨大、项目之间的跳转体验糟糕

  具体什么样的情形适合使用微前端?

  1. 技术栈切换又不想重构已有业务的,例如增量升级,就是在保留原来项目部分的基础上,新功能或者模块采用新技术来实现。
  2. 历史包袱项目,比如历史项目内部强耦合,但是又运行稳定的
  3. 自己造的轮子的库(与业务相关)需要复用在新项目中
  4. 旧项目的业务页面会在新项目中复用,又迫于项目时间压力的情况。

  场景1:老项目使用的jquery,新项目使用的是vue,两个项目都要共存。或者老项目是使用的jquery,突然要在老项目上开发新功能,jquery没有什么人用了,此时使用其他技术,例如vue开发新功能。

  场景2:一个项目里面的不同功能模块由不同的前端技术团队在做,两个前端团队采用的是不同的技术栈,且各个团队相对独立,独立仓库、独立部署、独立构建。

  当前调度项目采用微前端会面临哪些问题?

    • 第三方依赖重复引用的问题,导致需要加载太多的资源
    • 组件如何复用的问题。每个应用都有自己开发的组件库
    • 构建流水线增加,原先一条,现在要几条,服务器端口增加,之前是一个现在是几个。
    • 代码仓库增加,原先一个,现在N个。
    • 子应用首先需要做支持跨域请求改造,这个是所有微前端框架运行的前提

有关微前端总结的更多相关文章

  1. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  2. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  3. ruby-on-rails - 在 Rails 应用程序的前端获取实时日志 - 2

    在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在ruby​​onrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ

  4. ruby - 如何在转换器插件中访问页面属性(YAML 前端) - 2

    我正在为Jekyll编写一个转换器插件,需要访问一些页眉(YAML前端)属性。只有内容被传递给主要的转换器方法,似乎无法访问上下文。例子:moduleJekyllclassUpcaseConverter关于如何在转换器插件中访问页眉数据有什么想法吗? 最佳答案 基于Jekyll源代码,无法在转换器中检索YAML前端内容。根据您的情况,我看到了两种可行的解决方案。您的文件扩展名可以具有足够的描述性,以提供您本应包含在前言中的信息。看起来Converter插件的设计就是这么基本的。如果修改Jekyll是一个选项,您可以更改Convert

  5. 【动态规划】背包问题(详细总结,很全) - 2

    【动态规划】一、背包问题1.背包问题总结1)动规四部曲:2)递推公式总结:3)遍历顺序总结:2.01背包1)二维dp数组代码实现2)一维dp数组代码实现3.完全背包代码实现4.多重背包代码实现一、背包问题1.背包问题总结暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(DynamicPlanning)里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。1)动规四部曲:(1)确定dp数组及其下标的含义(2)确定递推公式(3)dp数组的初始化(4)确定遍历顺

  6. 前端实现文件上传(点击+拖拽) - 2

    一、简介之前在Vue项目中使用过element的上传组件,实现了点击上传+拖拽上传的两种上传功能。然后我就在想是否可以通过原生的html+js来实现文件的点击上传和拖拽上传,说干就干。首先是点击获取上传文件自然没的说,只需要借助input标签即可,但原生的点击上传按钮,实在是过于简陋,所以我的想法是通过一个div,模拟成上传按钮,然后监听其点击事件,通过input.click()去模拟点击真正的上传元素。然后是拖拽获取上传文件,这个稍有难度,我的想法是通过HTML5新增的drag拖放API+dataTransfer来实现文件的拖拽获取,但是由于是html5新增的,所以可能在某些低版本IE浏览器

  7. 教你如何使用vercel服务免费部署前端项目和serverless api - 2

    一、介绍一下vercelvercel是一个站点托管平台,提供CDN加速,同类的平台有Netlify和GithubPages,相比之下,vercel国内的访问速度更快,并且提供Production环境和development环境,对于项目开发非常的有用的,并且支持持续集成,一次push或者一次PR会自动化构建发布,发布在development环境,都会生成不一样的链接可供预览。但是vercel只是针对个人用户免费,teams是收费的首先vercel零配置部署,第二访问速度比github-page好很多,并且构建很快,还是免费使用的,对于部署个人前端项目路、接口服务非常方便vercel类似于git

  8. 前端基于DOM或者Canvas实现页面水印 - 2

    🐱个人主页:不叫猫先生🙋‍♂️作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀!💫系列专栏:vue3从入门到精通、TypeScript从入门到实践📢资料领取:前端进阶资料以及文中源码可以找我免费领取🔥前端学习交流:博主建立了一个前端交流群,汇集了各路大神,一起交流学习,期待你的加入!(文末有我wx或者私信)目录前言一、vue自定义指令directive讲解二、基于DOM的实现方式1.思路整理2.新建index.vue3.新建`directives`文件4.在`directives`文件下创建`index.ts`文件5.在`main.ts`中全局引

  9. 「前端代码简洁之路」后台系统之详情页设计 - 2

    一、乱花迷人眼我就是被迷的那双眼。有时候需求来了,用熟悉的套路进行开发,确实很节省时间也能保证功能的稳定,但是这些开发的惯性无形中阻碍了我对技术的探索。我一直想改造详情页,解放重复功能开发的劳动力,但是详情页一眼望都是内容平铺,好像并没有什么可做的代码设计。后来我拨开繁花,发现详情页的组件化不必想的过于复杂,后台系统风格统一即可。因为大部分的详情页面是内容的展示,偶尔会出现少量的操作功能。将风格统一的部分进行组件化处理,操作功能使用回调函数放回当前页面,避免组件里做过多的业务逻辑。看,这不就成了。项目基于React框架开发的,所以代码写法是JSX语法,组件开发使用的hooks函数式组件,UI框

  10. 相机面试问题总结 - 2

    1,Camera基本工作原理答案:光线通过镜头Lens进入摄像头内部,然后经过IRFilter过滤红外光,最后到达sensor(传感器),senor分为按照材质可以分为CMOS和CCD两种,可以将光学信号转换为电信号,再通过内部的ADC电路转换为数字信号,然后传输给DSP(如果有的话,如果没有则以DVP的方式传送数据到基带芯片baseband,此时的数据格式RawData,后面有讲进行加工)加工处理,转换成RGB、YUV等格式输出。数据流是如何从sensor到APP的?上述描述结束后,在ISP处理后面的阶段,数据会进行分流,分为capture,preview,video等以供后续动作使用。例如

随机推荐