微前端——一个属于前端的时代

news2024/12/26 15:34:18

关于微前端

    • 为什么需要微前端?
      • What?什么是微前端
      • Why?为什么去使用微前端
      • How?怎样落地微前端
      • Where?在什么场景下使用微前端
    • CSS 隔离方案
    • JavaScript 沙箱机制
      • 快照沙箱
      • Proxy 代理沙箱
        • legacySandbox(单例沙箱)
        • proxySandbox(多例沙箱)

微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用。各个前端应用可以独立运行、独立开发、独立部署。

为什么需要微前端?

What?什么是微前端

微前端理解

  • 微前端就是将不同的功能按照不同的维度拆分成多个子应用。通过主应用来加载这些子应用(微前端的核心在于,拆完之后再!)。

微前端的架构特点

  • 技术栈无关主框架不限制接入应用的技术栈,微应用具备完全自主权。在每个微前端的子应用中,可以任意选择技术栈,如:Vue、React 等,互不影响。
  • 独立开发、独立部署微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新。每一个子应用都可以独立开发、独立部署,相当于把一个项目拆分成了一个个模块,每个模块可以有自己的代码仓库。相当于后端的微服务,当部署完成以后,主应用会自动完成子应用的更新。
  • 增量升级在面对各种复杂场景时,我们通常很难对一个已经存在的系统做全量的技术栈升级或重构,而微前端是一种非常好的实施渐进式重构的手段和策略。在微前端项目下,当主框架发生重大变化时,微前端的每一个模块都可以独立地按需升级,不需要整体下线或者一次性升级所有的内容,从而升级架构、依赖关系和用户体验。
  • 独立运行时每个微应用之间状态隔离,运行时状态不共享。当子应用独立运行的时候,其他的子应用的状态不会互相之间影响,每一个子应用都有属于自己的状态。

目前常用的微前端技术框架有 single-spa 以及基于 single-spa 开发的微前端实现库 qiankun

Why?为什么去使用微前端

  • 在了解为什么使用微前端之前呢,我们先来引入几个问题:

    1. 不同团队间开发同一个应用技术栈不同怎么做?
    2. 希望每个团队都可以独立开发、独立部署怎么做?
    3. 项目中还需要老的应用代码怎么办?

    对于上面的三个问题,是不是可以将一个应用划分成若干个子应用,将子应用打包成一个个的 lib 。当路由切换时加载不同的子应用,这样就可以保证每个子应用都是独立的,并且技术栈也不做限制了,从而解决了以上三个前端协同开发的问题。

How?怎样落地微前端

微前端思想的来源

2018 年 Single-SPA 诞生了,single-spa 是一个用于前端微服务化的 JavaScript 前端解决方案(本身没有处理样式隔离,JavaScript 执行隔离)实现了路由劫持和应用加载。

2019 年 qiankun 基于 Single-SPA ,提供了更加开箱即用的 API(single-spa + sandbox + import-html-entry)做到了,技术栈无关、并且接入简单(像 iframe 一样简单)。

总结:子应用可以独立构建,运行时动态加载,主子应用完全解耦,技术栈无关,靠的是协议接入(子应用必须导出 bootstrap 、mount 、unmount 方法)。

  • 很多人会问:这不就是 iframe 吗?
    • 如果使用 iframe ,iframe 中的子应用切换路由时用户刷新页面,那么它的状态就会丢失。
  • 微前端是如何进行应用通讯的呢?
    • 基于 URL 来进行数据传递,但是传递消息能力弱。
    • 基于 CustomEvent 实现通讯。
    • 基于 props 主子应用间通讯。
    • 使用全局变量、Redux 进行通讯。
  • 微前端是如何导入公共依赖的呢?
    • CDN - externals
    • webpack 联邦模块

Where?在什么场景下使用微前端

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

那么问题来了:什么情况下,我们更适合使用微前端技术来开发应用呢?

  1. 当我们需要兼容遗留的系统时:

    随着前端技术不断迭代更新,项目如果需要保持技术栈不落后,就需要在兼容原有系统的同时,使用新框架去开发新功能,而遗留系统的功能已经足够完善且运行稳定,此时没有必要使用新的框架去重构遗留系统,所以此时微前端是团队很好的解决方案。

  2. 当项目需要聚合应用时:

    现在大型的互联网公司都会为用户提供很多应用和服务,通过为前端技术可以将前端聚合在一起,为用户呈现一站式服务的应用聚合应用。

  3. 当不同的团队开发同一个应用,所选技术栈不同时:

    当团队需要集成第三方的 SaaS 应用或者第三方私服应用以及在已有多个应用的情况下,需要将他们聚合为一个但应用,,此时可以使用微前端技术。

CSS 隔离方案

子应用之间样式隔离:

  • Dynamic Stylesheet 动态样式表,当应用切换时移除老应用样式,添加新应用样式。

主应用与子应用之间的样式隔离:

  • BEM(Block Element Modifier:约定项目前缀

  • CSS-Modules:打包时生成不冲突的选择器名

  • Shadow DOM:真正意义上的隔离

Shadow DOM 原理

  • css-in-js(不推荐

默认情况下,qiankun 会自动开启沙箱模式

JavaScript 沙箱机制

  • JavaScript 沙箱可以分为两种:快照沙箱Proxy 代理沙箱

快照沙箱

快照沙箱:提供一张快照,来记录此刻的状态。qiankun 的快照沙箱是基于 diff 算法来实现的,主要用于不支持 Proxy 的低版本浏览器,而且也只适应单个的子应用。

  • 实现原理:激活沙箱时,将window的快照信息存到windowSnapshot中, 如果modifyPropsMap有值,还需要还原上次的状态;激活期间,可能修改了window的数据;退出沙箱时,将修改过的信息存到modifyPropsMap里面,并且把window还原成初始进入的状态。

    const iter = (window, callback) => {
      for (const prop in window) {
        if(window.hasOwnProperty(prop)) {
          callback(prop);
        }
      }
    }
    class SnapshotSandbox {
      constructor() {
        this.proxy = window;
        this.modifyPropsMap = {};
      }
      // 激活沙箱
      active() {
        // 缓存active状态的window
        this.windowSnapshot = {};
        iter(window, (prop) => {
          this.windowSnapshot[prop] = window[prop];
        });
        Object.keys(this.modifyPropsMap).forEach(p => {
          window[p] = this.modifyPropsMap[p];
        })
      }
      // 退出沙箱
      inactive(){
        iter(window, (prop) => {
          if(this.windowSnapshot[prop] !== window[prop]) {
            // 记录变更
            this.modifyPropsMap[prop] = window[prop];
            // 还原window
            window[prop] = this.windowSnapshot[prop];
          }
        })
      }
    }
    

Proxy 代理沙箱

qiankun基于es6Proxy实现了两种应用场景不同的沙箱,一种是legacySandbox(单例),一种是proxySandbox(多例)。因为都是基于Proxy实现的,所以都称为代理沙箱。

legacySandbox(单例沙箱)

  • 原理:legacySandbox设置了三个参数来记录全局变量,分别是记录沙箱新增的全局变量addedPropsMapInSandbox、记录沙箱更新的全局变量modifiedPropsOriginalValueMapInSandbox、持续记录更新的(新增和修改的)全局变量,用于在任意时刻做snapshot的currentUpdatedPropsValueMap

proxySandbox(多例沙箱)

  • 原理:激活沙箱后,每次对window取值的时候,先从自己沙箱环境的fakeWindow里面找,如果不存在,就从rawWindow(外部的window)里去找;当对沙箱内部的window对象赋值的时候,会直接操作fakeWindow,而不会影响到rawWindow

注意:由于 legacySandbox 和 proxySandbox 源码字数较多,此处就不粘贴了,感兴趣的化可以自己查一下资料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生丨手把手教你搭建自己的第一个微服务

文章目录前言一、环境准备软件要求配置操作二、拉取框架三、模块搭建SDK模块SDK-Cloud 模块common模块API模块前言 我们知道,微服务架构是把项目里的每一个功能元素独立出来,再对这些功能元素进行动态组合。这样的优点在于:节省调用资源&…

基于Springboot搭建java项目(三十一)—— 什么是Docker

什么是Docker 一、容器技术 1、应用程序的部署问题 ​ 还原应用程序部署的场景,开发在开发应用的时候,要自己搭建一套环境,进行本地调试,这时就需要在本地搭建一套JVM,NODE,NGNIX等一些应用程序运行的环…

【大唐杯备考】——5G系统勘察设计(学习笔记)

📖 前言:本期介绍5G系统勘察设计。 目录🕒 1. 概述🕘 1.1 5G网络预规划🕤 1.1.1 5G建网需求确认🕤 1.1.2 4G现网评估🕤 1.1.3 站点规模估算🕤 1.1.4 5G仿真评估🕘 1.2 5G…

新年首捷 | 全息网御入选《CCSIP 2022中国网络安全产业全景图(第五版)》

2023年2月1日,FreeBuf咨询正式发布 《CCSIP(China Cyber Security Panorama)2022 中国网络安全行业全景册(第五版)》,旨在帮助企业更好地了解中国网络安全技术与市场的发展趋势,并为企业安全建设…

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

本节内容REST及RESTful APIWeb ServiceXML解析Mock ServerREST及RESTful APIREST:表述性状态转移或表现层状态转移,“表现”及每个接口地址(URI)都表现为(视为)一个资源对象(文本资源、图片资源、服务资源)…

请问软件设计师、网络工程师、软件评测师还是系统集成项目管理师,哪个好考?

软件设计师、网络工程师、软件评测师还是系统集成项目管理师?这些都是属于软考中级科目,看自己是想从事哪个方向咯。都可以备考啊,毕竟含金量都差不多的! 因为自己备考的是网工,就说说网工的备考如何吧 一、中级网络…

Quest Pro降价和Vive XR Elite之我见

本来没打算写Vive XR Elite,作为HTC首个支持VST透视的VR头显,它也引起了业内关注,尤其是去年10月份Meta Quest Pro重磅发布之后,大家就会看到,领域内的玩家都在朝着VST发力。那为什么现在来写Vive XR Elite呢&#xff…

即时通讯开发之TCP/IP中的TCP 协议概述

终于看到了 TCP 协议,这是 TCP/IP 详解里面最重要也是最精彩的部分,要花大力气来读。前面的 TFTP 和 BOOTP 都是一些简单的协议,就不写笔记了,写起来也没啥东西。 TCP 和 UDP 处在同一层---运输层,但是 TCP 和 UDP 最不同的地方是,TCP 提供了一种可靠的数据传输服务,TCP 是面向…

从零开始手写基于Web Components组件

前言 本文将详细讲解如何用最基本的typescript,vite,less构建基于Web Components的组件,目前已实现Button,Icon,Image,Tabs,Input,Message组件。首先介绍项目的整体架构&#xff0c…

新C++(6):继承那些事儿

"你在酒杯还未干的时间里,收藏这份情谊"一、回顾继承什么是继承?继承是面向对象编程语言的三大特征之一。通过继承机制,面向对象的程序设计可以很大限度地对代码进行复用。它允许程序员在保持原有类特性的基础上进行扩展&#xff0…

scrapy_redis概念作用和流程

scrapy_redis概念作用和流程 学习目标 了解 分布式的概念及特点了解 scarpy_redis的概念了解 scrapy_redis的作用了解 scrapy_redis的工作流程 在前面scrapy框架中我们已经能够使用框架实现爬虫爬取网站数据,如果当前网站的数据比较庞大, 我们就需要使用分布式来更快的爬取数…

制药行业中各种化合物的净化,大孔吸附净化氨基酸

基于吸附功能的聚苯乙烯特种树脂 Tulsimer ADS-600 是一款没有离子官能基的,由交联聚苯乙烯合成的功能强大的吸附型树脂。 Tulsimer ADS-600 主要应用于水溶液中吸附酚及其化合物,氯代烃等含氯物质,表面活性剂,氨基酸&#…

【C++修炼之路】C++入门(中)—— 函数重载和引用

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录一、前言二、函数重载1、重载规则2、函数名修饰规则三、引用1、区分2、本质3、特性4、应用a、做参数b、做返回值5、效率比较6、常…

windows安装cnpm

文章目录1 cnpm简介2 cnpm 安装步骤1 cnpm简介 npm下载速度比较慢,可以通过cnpm下载node包 2 cnpm 安装步骤 找到nodejs的安装路径: 使用nvm安装和管理node 直接安装node的方式 直接通过安装包安装node的方式,node会被安装在某个实际目录下…

docker pull nginx

取最新版的 Nginx 镜像 docker pull nginx:latest 查看本地镜像 使用以下命令来查看是否已安装了 nginx: $ docker images 运行容器 安装完成后,我们可以使用以下命令来运行 nginx 容器: $ docker run --name nginx-door -p 8080:80 -…

VS code的使用指南

VS code的使用指南 VS code的安装与下载 VS Code的安装地址的 在下面选择版本的位置进行安装(一般选择Stable进行安装,这个软件是跨系统的安装与设置相关的内容信息)。 插件安装 直接点击这个位置,选择自己需要的相应的插件 这些都是常用的…

软件工程(四)——结构化设计、模块独立性、面向对象设计、软件测试与维护

目录 一、界面设计 二、结构化设计 1.概要设计 2模块独立性 三、面向对象设计 1.面向对象设计的五大基本原则(SOLID)和其他5个原则 2.设计模式 三、软件测试与维护 1.白盒测试和黑盒测试 2.测试的阶段 3.软件维护阶段 四、系统演化策略 一、界面设计 人机界面设计&…

50条必背JAVA知识点(一)

1.编写:编写的Java代码保存在以“.java”结尾的源文件中。 2.编译:使用javac.exe命令编译java源文件,生成字节码文件。格式:javac 源文件名.java 3.运行:使用java.exe命令解释运行字节码文件。格式:java …

深入浅出PyTorch-PyTorch的主要组成模块

目录1.基本配置2.数据读入3.模型构建3.1神经网络的构造3.2神经网络中常见的层常见网络层的构造常见的网络层3.3模型示例卷积神经网络(LeNet)深度卷积神经网络(AlexNet)4.模型初始化5.损失函数6.训练和评估深度学习和机器学习在流程…

python小游戏——塔防小游戏代码开源

♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿所有的美好&#…