收起左侧

[前端] 微前端调研

2
回复
[复制链接]
avatar
  • TA的每日心情
    qdsmile奋斗
    2024-6-22 09:21
  • 签到天数: 47 天

    [LV.5]初驻小吧

    2

    主题

    0

    帖子

    134

    积分

    发表于 2024-3-19 14:17:54 | 显示全部楼层 |阅读模式
    概述

    微前端概念来源于微服务,摒弃大型单体方式,将前端整体分解为小而简单的块,可以独立开发,测试和部署。同时能够聚合程一个应用呈现给用户。

    解决的问题:
    • 工程越来越大
    • 限制于一个技术栈
    • 项目越大,打包,编译速度变慢。持续集成部署也越来越困难

    微前端分类

    实现微前端,本质上就是在运行应用时加载应用。有以下几种方案

    • 基座模式

    通过搭建基座、配置中心来管理子应用。例如基于single spa的qiankun

    • 自组织模式

    通过约定进行互调,但会遇到处理第三方依赖的问题。

    • 去中心模式

    脱离基座模式,每个应用之前可以彼此分享资源。例如webpack5的联邦模块(Module Federation)

    相关技术
    • Iframe

    基本能够完成微前端的需求,但是最大的问题在于隔离性无法突破,导致应用上下文无法被共享,带来开发体验,用户体验不佳的情况,具体如下


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

    优点:


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

    缺点就是兼容性不太好

    • Es Module

    优点:


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

    技术框架
    • single SPA

    国外的项目,只做了两件事:加载微应用、维护微应用状态(初始化、挂载、卸载),只是解决了路由问题和应用入口

    • qiankun

    蚂蚁出品,基于single spa。

    优点:


      • 基于single-spa封装,提供了更加开箱即用的 API
      • 技术栈无关,任意技术栈的应用均可 使用/接入
      • HTML Entry 接入方式,接入微应用像使用 iframe 一样简单
      • 样式隔离,确保微应用之间样式互相不干扰
      • JS 沙箱,确保微应用之间 全局变量/事件 不冲突
      • 资源预加载,在浏览器空闲时间预加载未打开的微应用资源,加速微应用打开速度

    不足:

    • EMP

    基于Webpack5的新特性Module Federation(模块联邦)

    优点:


      • 基于Webpack5的新特性Module Federation实现,达到第三方依赖共享,减少不必要的代码引入的目的
      • 每个微应用独立部署运行,并通过cdn的方式引入主程序中,因此只需要部署一次,便可以提供给任何基于Module Federation的应用使用。并且此部分代码是远程引入,无需参与应用的打包。
      • 动态更新微应用:EMP是通过cdn加载微应用,因此每个微应用中的代码有变动时,无需重新打包发布新的整合应用便能加载到最新的微应用。
      • 去中心化,每个微应用间都可以引入其他的微应用,无中心应用的概念。
      • 跨技术栈组件式调用,提供了在主应用框架中可以调用其他框架组件的能力
      • 按需加载,开发者可以选择只加载微应用中需要的部分,而不是强制只能将整个应用全部加载。
      • 应用间通信,每一个应用都可以进行状态共享,就像在使用npm模块进行开发一样便捷。
      • 生成对应技术栈模板,它能像cerate-react-app一样,也能像create-vue-app一样,通过指令一键搭建好开发环境,减少开发者的负担。
      • 远程拉取ts声明文件,emp-cli中内置了拉取远程应用中代码声明文件的能力,让使用ts开发的开发者不再为代码报错而烦恼。

    EMP除了具备微前端的能力外,还实现了跨应用状态共享、跨框架组件调用的能力,这是现有框架所不具备的优秀特性!

    不足的地方也很明显:对 webpack 强依赖,老旧项目不友好;

    • 无界

    腾讯出品,webcomponent 容器 + iframe 沙箱

    优点:


      • 接入成本低
      • 速度快
      • js通过iframe隔离,css







    参与人数 1金币 +60 收起 理由
    avatar itjc8 + 60 感谢分享,不错的资源!

    查看全部评分总评分 : 金币 +60

    avatar
  • TA的每日心情
    qdsmile擦汗
    2024-7-8 16:26
  • 签到天数: 27 天

    [LV.4]常来常往

    0

    主题

    26

    帖子

    117

    积分
    发表于 2024-7-1 15:20:59 | 显示全部楼层
    qiankun微前端在数据量大的时候会出现性能瓶颈,现使用无界代替,暂未发现问题
    avatar
  • TA的每日心情
    qdsmile
    2024-8-1 13:51
  • 签到天数: 2 天

    [LV.1]小吧新人

    0

    主题

    2

    帖子

    10

    积分

    发表于 2024-7-30 14:11:17 | 显示全部楼层
    https://github.com/lit-road/my-single-spa
    您需要登录后才可以回帖 登录 | 立即注册 QQ登录

    本版积分规则