微前端架构常见框架

1. iframe

这里指的是每个微应用独立开发部署,通过 iframe 的方式将这些应用嵌入到父应用系统中,几乎所有微前端的框架最开始都考虑过 iframe,但最后都放弃,或者使用部分功能,原因主要有:

  • url 不同步。浏览器刷新 iframe url 状态丢失、后退前进按钮无法使用。

  • UI 不同步,DOM 结构不共享。想象一下屏幕右下角 1/4 的 frame 里来一个带遮罩层的弹框,同时我们要求这个弹框要浏览器居中显示,还要浏览器重置大小时自动居中。

  • 全局上下文完全隔离,内存变量不共享。iframe 内外系统的通信、数据同步等需求,主应用的 cookie 要透传到根域名都不同的子应用中实现免登效果。

  • 慢。每次子应用进入都是一次浏览器上下文重建、资源重新加载的过程。

2. single-spa

single-spa 是一个基础的微前端框架,通俗点说,提供了生命周期的概念,并负责调度子应用的生命周期 挟持 url 变化事件和函数,url 变化时匹配对应子应用,并执行生命周期流程,完整的生命周期流程为:

2.1. Root Config

index.html:静态资源、子应用入口声明。

// index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Polyglot Microfrontends</title><meta name="importmap-type" content="systemjs-importmap" /><script type="systemjs-importmap" src="https://storage.googleapis.com/polyglot_microfrontends.app/importmap.json"></script><!-- if (isLocal) { --><script type="systemjs-importmap">{"imports": {"@polyglot-mf/root-config": "/localhost:9000/polyglot-mf-root-config.js"}}</script><!-- } --><script src="https://cdn.jsdelivr.net/npm/import-map-overrides@2.2.0/dist/import-map-overrides.js"></script><script src="https://cdn.jsdelivr.net/npm/systemjs@6.8.3/dist/system.min.js"></script><script src="https://cdn.jsdelivr.net/npm/systemjs@6.8.3/dist/extras/amd.min.js"></script>
</head>
<body><script>System.import('@polyglot-mf/root-config');System.import('@polyglot-mf/styleguide');</script><import-map-overrides-full show-when-local-storage="devtools" dev-libs></import-map-overrides-full>
</body>
</html>

main.js:子应用注册及启动。

// main.jsimport { registerApplication, start } from "single-spa";registerApplication({name: "@polyglot-mf/navbar",app: () => System.import("@polyglot-mf/navbar"),activeWhen: "/",
});registerApplication({name: "@polyglot-mf/clients",app: () => System.import("@polyglot-mf/clients"),activeWhen: "/clients",
});registerApplication({name: "@polyglot-mf/account-settings",app: () => loadWithoutAMD("@polyglot-mf/account-settings"),activeWhen: "/settings",
});start();// A lot of angularjs libs are compiled to UMD, and if you don't process them with webpack
// the UMD calls to window.define() can be problematic.
function loadWithoutAMD(name) {return Promise.resolve().then(() => {let globalDefine = window.define;delete window.define;return System.import(name).then((module) => {window.define = globalDefine;return module;});});
}

single-spa提倡在浏览器中直接使用微前端应用,而不是通过构建工具进行打包。在single-spa中,参考的是SystemJS的思路,从而支持在浏览器中使用import、export。其实通过构建工具也可以实现类似的功能,webpack 可以将 ES6 的模块语法转换为浏览器可以理解的格式,并进行打包和优化。

2.2. single-spa-layout

指定single-spa在index.html中哪里渲染指定的子应用,constructApplications,constructRoutes及constructLayoutEngine 是针对定义的layout中的元素获取属性,再批量注册。

<html><head><template id="single-spa-layout"><single-spa-router><nav class="topnav"><application name="@organization/nav"></application></nav><div class="main-content"><route path="settings"><application name="@organization/settings"></application></route><route path="clients"><application name="@organization/clients"></application></route></div><footer><application name="@organization/footer"></application></footer></single-spa-router></template><script>// 注册import { registerApplication, start } from 'single-spa';import {constructApplications,constructRoutes,constructLayoutEngine} from 'single-spa-layout';// 获取routesconst routes = constructRoutes(document.querySelector("#single-spa-layout"));// 获取所有的子应用const applications = constructApplications({routes,loadApp({ name }) {return System.import(name); // SystemJS 引入入口JS},});// 生成LayoutEngineconst layoutEngine = constructLayoutEngine(routes, applications);// 批量注册子应用applications.forEach(registerApplication);// 启动主应用start();</script></head></html>

2.3. 子应用注册

single-spa针对子应用不同类型的子应用(如Vue、React等)都进行封装,但核心还是bootstrap、mount、unmount生命周期钩子。

import SubApp from './index.tsx'export const bootstrap = () => {}export const mount = () => {// 使用 React 来渲染子应用的根组件ReactDOM.render(<SubApp />, document.getElementById('root'));
}export const unmount = () => {}

2.4. 样式隔离

提供子应用CSS的引入和移除:single-spa-css

// 代码块
import singleSpaCss from 'single-spa-css';const cssLifecycles = singleSpaCss({// 这里放你导出的 CSS,如果 webpackExtractedCss 为 true,可以不指定cssUrls: ["https://example.com/main.css"],// 是否要使用从 Webpack 导出的 CSS,默认为 falsewebpackExtractedCss: false,// 是否 unmount 后被移除,默认为 trueshouldUnmount: true,// 超时,不废话了,都懂的timeout: 5000
})const reactLifecycles = singleSpaReact({...})// 加入到子应用的 bootstrap 里
export const bootstrap = [cssLifecycles.bootstrap,reactLifecycles.bootstrap
]export const mount = [// 加入到子应用的 mount 里,一定要在前面,不然 mount 后会有样式闪一下的问题cssLifecycles.mount,reactLifecycles.mount
]export const unmount = [// 和 mount 同理reactLifecycles.unmount,cssLifecycles.unmount
]

子应用间CSS样式隔离,推荐使用scoped CSS和shadowDOM.

2.5. JS隔离

给每个子应用添加全局变量,加入时添加,移除是去除:single-spa-leaked-globals.

// 代码块
import singleSpaLeakedGlobals from 'single-spa-leaked-globals';// 其它 single-spa-xxx 提供的生命周期函数
const frameworkLifecycles = ...const leakedGlobalsLifecycles = singleSpaLeakedGlobals({globalVariableNames: ['$', 'jQuery', '_'], // 新添加的全局变量
})export const bootstrap = [leakedGlobalsLifecycles.bootstrap, // 放在第一位frameworkLifecycles.bootstrap,
]export const mount = [leakedGlobalsLifecycles.mount, // mount 时添加全局变量,如果之前有记录在案的,直接恢复frameworkLifecycles.mount,
]export const unmount = [leakedGlobalsLifecycles.unmount, // 删掉新添加的全局变量frameworkLifecycles.unmount,
]
<

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

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

相关文章

SQL Server更改日志模式:操作指南与最佳实践!

全文目录&#xff1a;开篇语**前言****摘要****概述&#xff1a;SQL Server 的日志模式****日志模式的作用****三种日志模式**1. **简单恢复模式&#xff08;Simple&#xff09;**2. **完整恢复模式&#xff08;Full&#xff09;**3. **大容量日志恢复模式&#xff08;Bulk-Log…

git的工作使用中实际经验

老输入烦人的密码 每次我git pull的时候都要叫我输入三次烦人的密码&#xff0c;问了deepseek也没有尝试成功 出现 enter passphrase for key ‘~/.ssh/id_rsa’ 的原因: 在生成key的时候,没有注意,不小心设置了密码, 导致每次提交的时候都会提示要输入密码, 也就是上面的提示…

科技赋能,宁夏农业绘就塞上新“丰”景

在贺兰山的巍峨身影下&#xff0c;在黄河水的温柔滋养中&#xff0c;宁夏这片古老而神奇的土地&#xff0c;正借助农业科技的磅礴力量&#xff0c;实现从传统农耕到智慧农业的华丽转身&#xff0c;奏响一曲科技与自然和谐共生的壮丽乐章。一、数字农业&#xff1a;开启智慧种植…

imx6ull-驱动开发篇36——Linux 自带的 LED 灯驱动实验

在之前的文章里&#xff0c;我们掌握了无设备树和有设备树这两种 platform 驱动的开发方式。但实际上有现成的&#xff0c;Linux 内核的 LED 灯驱动采用 platform 框架&#xff0c;我们只需要按照要求在设备树文件中添加相应的 LED 节点即可。本讲内容&#xff0c;我们就来学习…

深度学习中主流激活函数的数学原理与PyTorch实现综述

1. 定义与作用什么是激活函数&#xff1f;激活函数有什么用&#xff1f;答&#xff1a;激活函数&#xff08;Activation Function&#xff09;是一种添加到人工神经网络中的函数&#xff0c;旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型&#xff0c;激…

Linux高效备份:rsync + inotify实时同步

一、rsync 简介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系统下的数据镜像备份工具&#xff0c;支持本地复制、远程同步&#xff08;通过 SSH 或 rsync 协议&#xff09;&#xff0c;是一个快速、安全、高效的增量备份工具。二、rsync 特性 支持镜像保存整个目录树和…

一种通过模板输出Docx的方法

起因在2个群里都有网友讨论这个问题&#xff0c;俺就写了一个最简单的例子。其实&#xff0c;我们经常遇到一些Docx的输出的需求&#xff0c;“用模板文件进行处理”是最简单的一个方法&#xff0c;如果想预览也简单 DevExpress 、Teleric 都可以&#xff0c;而且也支持 Web 、…

探索 List 的奥秘:自己动手写一个 STL List✨

&#x1f4d6;引言大家好&#xff01;今天我们要一起来揭开 C 中 list 容器的神秘面纱——不是直接用 STL&#xff0c;而是亲手实现一个简化版的 list&#xff01;&#x1f389;你是不是曾经好奇过&#xff1a;list 是怎么做到高效插入和删除的&#xff1f;&#x1f50d;迭代器…

mysql占用高内存排查与解决

mysql占用高内存排查-- 查看当前全局内存使用情况&#xff08;需要启用 performance_schema&#xff09; SELECT * FROM sys.memory_global_total; -- 查看总内存使用 SELECT * FROM sys.memory_global_by_current_bytes LIMIT 10; -- 按模块分类查看内存使用排行memory/perfor…

构建真正自动化知识工作的AI代理

引言&#xff1a;新一代生产力范式的黎明 自动化知识工作的人工智能代理&#xff08;AI Agent&#xff09;&#xff0c;或称“智能体”&#xff0c;正迅速从理论构想演变为重塑各行各业生产力的核心引擎。这些AI代理被定义为能够感知环境、进行自主决策、动态规划、调用工具并持…

青少年机器人技术(四级)等级考试试卷-实操题(2021年12月)

更多内容和历年真题请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 四级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年机器人技术&#xff08;四级&#xff09;等级考试试卷-实操题&#xff08;2021年12月&#xff09; …

最新短网址源码,防封。支持直连、跳转。 会员无广

最新短网址源码&#xff0c;防封。支持直连、跳转。 会员无广告1.可将长网址自动缩短为短网址&#xff0c;方便记忆和使用。2.短网址默认为临时有效&#xff0c;可付费升级为永久有效&#xff0c;接入支付后可自动完成&#xff0c;无需人工操作。3.系统支持设置图片/文字/跳转页…

缓存-变更事件捕捉、更新策略、本地缓存和热key问题

缓存-基础知识 熟悉计算机基础的同学们都知道&#xff0c;服务的存储大多是多层级的&#xff0c;呈现金字塔类型。通常来说本机存储比通过网络通信的外部存储更快&#xff08;现在也不一定了&#xff0c;因为网络传输速度很快&#xff0c;至少可以比一些过时的本地存储设备速度…

报表工具DevExpress .NET Reports v25.1新版本亮点:AI驱动的扩展

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reporting控件日前正式发布了v25.1…

kubernetes中pod的管理及优化

目录 2 资源管理方式 2.1 命令式对象管理 2.2 资源类型 2.2.1 常用的资源类型 2.2.2 kubectl常见命令操作 2.3 基本命令示例 2.4 运行和调试命令示例 2.5 高级命令示例 3 pod简介 3.1 创建自主式pod&#xff08;生产环境不推荐&#xff09; 3.1.1 优缺点 3.1.2 创建…

解释一下,Linux,shell,Vmware,Ubuntu,以及Linux命令和shell命令的区别

Linux 操作系统概述Linux 是一种开源的类 Unix 操作系统内核&#xff0c;由 Linus Torvalds 于 1991 年首次发布。作为现代计算的基础设施之一&#xff0c;它具有以下核心特征&#xff1a;多用户多任务特性允许多个用户同时操作系统资源&#xff0c;而模块化设计使其能够适应从…

Windows 系统中,添加打印机主要有以下几种方式

在 Windows 系统中,添加打印机主要有以下几种方式,我将从最简单到最复杂为您详细介绍。 方法一:自动安装(推荐首选) 这是 Windows 10 和 Windows 11 中最简单、最现代的方法。系统会自动搜索网络(包括无线和有线网络)上可用的打印机并安装驱动程序。 操作步骤: 进入…

Mixture of Experts Guided by Gaussian Splatters Matters

Mixture of Experts Guided by Gaussian Splatters Matters: A new Approach to Weakly-Supervised Video Anomaly Detection ICCV2025 https://arxiv.org/pdf/2508.06318 https://github.com/snehashismajhi/GS-MoEAbstract 视频异常检测&#xff08;VAD&#xff09;是一项具有…

SeaTunnel Databend Sink Connector CDC 功能实现详解

Databend 是一个面向分析型工作负载优化的 OLAP 数据库&#xff0c;采用列式存储架构。在处理 CDC&#xff08;Change Data Capture&#xff0c;变更数据捕获&#xff09;场景时&#xff0c;如果直接执行单条的 UPDATE 和 DELETE 操作&#xff0c;会严重影响性能&#xff0c;无…

算法230. 二叉搜索树中第 K 小的元素

题目&#xff1a;给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。示例 1&#xff1a;输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1 示例 2&#xff1…