乾坤微前端js沙箱机制

1 快照沙箱

  1. modifyPropsMap对象存储子应用的属性; windowSnapshot对象存储微应用未加载时的window对象属性;
  2. 进入微应用,利用windowSnapshot对象存储window对象的属性; 并将window对象的属性替换为modifyPropsMap对象的属性;
  3. 离开微应用:modifyPropsMap对象属性同步window对象属性; window对象属性还原为 windowSnapshot对象属性;

缺点:

  • 不支持多个微应用同时处于运行状态;
  • 遍历window对象上的所有属性,性能差;
    优点:
  • 适用于所有浏览器;
class SanapshotSandbox {windowSnapshot = {};modifyPropsMap = {};// 进入微应用active() {// 保存window对象上所有属性的状态for (const prop in window) {this.windowSnapshot[prop] = window[prop];}// 恢复上一次在运行该微应用的时候修改过的window上的属性Object.keys(this.modifyPropsMap).forEach(prop => {window[prop] = this.modifyPropsMap[prop];});}// 离开微应用inactive() {for (const prop in window) {if (window[prop] !== this.windowSnapshot[prop]) {// 记录修改了window上的哪些属性this.modifyPropsMap[prop] = window[prop];// 将window上的属性状态还原至微应用运行之前的状态window[prop] = this.windowSnapshot[prop];}}}
}
window.city = 'Beijing';
let snapshotSanbox = new SanapshotSandbox();
console.log('====>window.city 01:', window.city);
snapshotSanbox.active();
window.city = 'Shanghai';
console.log('====>window.city 02:', window.city);
snapshotSanbox.inactive();
console.log('====>window.city 03:', window.city);snapshotSanbox.active();
console.log('====>window.city 04:', window.city);// ====>window.city 01: Beijing
// ====>window.city 02: Shanghai
// ====>window.city 03: Beijing
// ====>window.city 04: Shanghai

2 LegacySandbox沙箱

优点:

  • 不需要遍历window上所有的属性,性能良好;

缺点:

  • 同一时间只能激活一个微应用;
class LegacySandbox {modifiedPropsOriginalValueMapInSandbox = new Map(); // 修改属性addedPropsMapInSandbox = new Map(); // 新增的属性currentUpdatePropsValueMap = new Map(); // 所有变化的属性,包括修改的属性和新增的属性proxyWindow = {}; // 代理对象constructor() {const fakeWindow = Object.create(null);this.proxyWindow = new Proxy(fakeWindow, {set: (target, prop, value, receiver) => {const originalVal = window[prop];if (!window.hasOwnProperty(prop)) {this.addedPropsMapInSandbox.set(prop, value);} else if (!this.modifiedPropsOriginalValueMapInSandbox.has(prop)) {this.modifiedPropsOriginalValueMapInSandbox.set(prop, originalVal);}this.currentUpdatePropsValueMap.set(prop, value);window[prop] = value;},get: (target, prop, receiver) => {return window[prop];}})}setWindowProp(prop, value, isToDelete) {if (value === undefined && isToDelete) {delete window[prop];} else {window[prop] = value;}}active() {// 恢复上一次该微应用处于运行状态时,对window上做的所有修改this.currentUpdatePropsValueMap.forEach((value, prop) => {this.setWindowProp(prop, value);})}inactive() {// 还原window上原有的属性this.modifiedPropsOriginalValueMapInSandbox.forEach((value, prop) => {this.setWindowProp(prop, value);});// 删除在微应用运行期间,window上新增的属性this.addedPropsMapInSandbox.forEach((_, prop) => {this.setWindowProp(prop.undefined, true);})}
}
window.city = 'Beijing';
let legacySandbox = new LegacySandbox();
console.log('====>window.city 01:', window.city);
legacySandbox.active();
legacySandbox.proxyWindow.city = 'Shanghai';
console.log('====>window.city 02:', window.city);
legacySandbox.inactive();
console.log('====>window.city 03:', window.city);legacySandbox.active();
console.log('====>window.city 04:', window.city);// ====>window.city 01: Beijing
// ====>window.city 02: Shanghai
// ====>window.city 03: Beijing
// ====>window.city 04: Shanghai

3 ProxySandbox

优点:

  • 不需要遍历window上的所有属性,性能良好;
  • 同一时间可以激活多个微应用;
    缺点:
  • 只适用于支持 ES6语法 的浏览器(IE7-IE11不支持ES6);

使用工具如 Babel 将使用了 ES6+ 语法(包括 Proxy)的源代码转换为这些老旧浏览器能够理解的 ES5 或更低版本的 JavaScript 代码。Babel 可以通过配置相应的转译插件(如 @babel/plugin-transform-proxy)来尝试模拟 Proxy 行为,但这通常只能实现部分功能,并且性能和兼容性可能不如原生 Proxy

class ProxySandbox {proxyWindow = {};isRunning = false;constructor() {const fakeWindow = Object.create(null);this.proxyWindow = new Proxy(fakeWindow, {set: (target, prop, value, receiver) => {if(this.isRunning) {target[prop] = value;}},get: (target, prop, receiver) => {return prop in target ? target[prop]: window[prop];},});}active() {this.isRunning = true;}inactive() {this.isRunning = false;}
}
window.city = 'Beijing';
let proxtSandbox01 = new ProxySandbox();
let proxtSandbox02 = new ProxySandbox();
proxtSandbox01.active();
proxtSandbox02.active();
proxtSandbox01.proxyWindow.city = 'Shanghai';
proxtSandbox02.proxyWindow.city = 'Chendu';
console.log('====>proxtSandbox01.proxyWindow.city 01:', proxtSandbox01.proxyWindow.city);
console.log('====>proxtSandbox02.proxyWindow.city 01:', proxtSandbox02.proxyWindow.city);
console.log('====>window.city 01:', window.city);
proxtSandbox01.inactive();
proxtSandbox02.inactive();
console.log('====>proxtSandbox01.proxyWindow.city 02:', proxtSandbox01.proxyWindow.city);
console.log('====>proxtSandbox02.proxyWindow.city 02:', proxtSandbox02.proxyWindow.city);
console.log('====>window.city 02:', window.city);

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

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

相关文章

Linux时间同步练习

题目如下: 一.配置server主机要求如下: 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为: 172.25.254.100 3.server主机的时间为1984-11-11 11:11:11 4.配置server主机的时间同步服务要求可以被所…

重磅,巫师3即将发布mod编辑器并开放创意工坊

热乎乎的消息!巫师3即将推出mod编辑器和开放创意工坊! 根据巫师3官方Steam消息,听说年底将推出mod编辑器,目前已经开始内测。想试用的玩家们,可以到redkit商店页面申请访问权限,体验最新的创意工具。 此外&…

NameError: name ‘init_detector’ is not defined

使用模型提取人体pose,遇到的问题记录。 1. 排查问题直接讲报错的地方拷贝在python中直接运行。 运行后提示: ModuleNotFoundError: No module named mmcv._ext 经过各种的地方去查找问题 github的issue Error in init_detector Issue #3354 ope…

存入Redis的值前面有很多空格

说明:记录一次使用Redis的错误; 场景 在将验证码存入Redis时,发现存入的值前面有很多空格,导致在与前端传入的值比较时,一直是false,验证不通过。如下: 上面这些“□”是占位符,复…

STM32单片机中TogglePin和WritePin的区别及使用方法

目录 1.区别 2.使用方法 3. HAL_GPIO_TogglePin函数 4.HAL_GPIO_WritePin函数 在STM32单片机中,WritePin用于将引脚设置为特定电平,而TogglePin用于切换引脚的电平。 1.区别 TogglePin是切换引脚电平状态,即引脚电平状态在高电平和低电…

学习笔记(4月17日)vector底层原理

1.vector<vector>底层原理 vector是表示可变大小数组的序列容器&#xff0c;相当于一个动态的数组&#xff0c;比数组优越的在于它具有可动态改变的大小&#xff0c;同时&#xff0c;它写成了类模板&#xff0c;说明可以适用于其他类型&#xff0c;包括vector本身&#…

Oracle数据库故障类别及日常运维规划策略

一、故障类别 1、语句故障 单个数据库操作失败&#xff08;select、insert、update或delete&#xff09;&#xff0c;如&#xff1a; 在表中输入无效的数据&#xff0c;解决方法&#xff1a;可与用户合作来验证并更正数据&#xff1b;执行操作&#xff0c;但权限不足&#x…

rust 学习笔记(13-19)

13 迭代器与闭包 Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程&#xff08;functional programming&#xff09;。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 闭包&#xff08;Closu…

游戏、app抓包

文章目录 协议app抓包游戏抓包 协议 在抓包之前&#xff0c;首先我们要对每个程序使用什么协议有个大致的了解&#xff0c;比如网页这种就是走的http协议。 在一些app中我们通过发送一个请求&#xff0c;然后服务器接受&#xff0c;响应&#xff0c;返回一个数据包&#xff0c…

4.17freeRTOS

1.总结串口的发送和接收功能使用到的函数 串口的数据发送 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) UART_HandleTypeDef *huart&#xff1a;指定要使用的串口 const uint8_t *pData&#xf…

【Python-基础】列表合集

.tolist() 将其他数据类型转换成列表 1.可以将<class ‘pandas.core.series.Series’>转换为列表 images [img_id[filename].tolist() for img_id in data] # data是一个列表,列表中每一项都是用read_csv函数读取的csv文件内容 # type(img_id[filename]) <class …

网站模板-慈善捐赠基金会网站模板 Bootstrap4 html

目录 一.前言 二.预览 三.下载链接 一.前言 这是一个慈善网站的页面。页面包含了导航栏、横幅部分、关于、使命、新闻、活动、捐赠和页脚等不同的部分。该网站还包含了一些CSS样式和JavaScript脚本来实现交互和样式效果。 这个网站的具体结构如下&#xff1a; 导航栏部分&a…

吐血整理102个Python项目,从基础到高级,练完你就牛了!

前言 Python 初学者在迈过安装编程环境和基本语法的门槛&#xff0c;准备大展身手的时候&#xff0c;可能突然就会进入迷茫期&#xff1a; 不知道做些什么、再学些什么。。。 然后对编程的兴趣就会慢慢消退&#xff0c;找不到坚持下去的理由&#xff0c;从而慢慢淡忘之前学会…

算法中的背包问题

背包问题 背包问题 是经典的动态规划问题&#xff0c;它一共有 9 个分类&#xff1a; 01 背包问题 完全背包问题 多重背包问题 混合背包问题 二维费用背包问题 分组背包问题 背包问题求方案数 求背包问题的方案 有依赖的背包问题 01背包问题 完全背包问题 322.零钱兑换 给…

链表中LinkList L与LinkList *L( * L.elem L->elem)

摘要 LinkList L&#xff1a;L是结构体指针&#xff0c;使用“->“运算符来访问结构体成员&#xff1b;&#xff08;*L&#xff09;是结构体&#xff0c;使用"."运算符访问结构体成员 函数是否有&看是否要返回该链表等&#xff0c;若返回加&&#xff0c…

OpenCV基本图像处理操作(九)——特征匹配

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…

热烈祝贺中国特医首次获得蒙特国际品质奖!中国特医健效达品质永攀世界高峰

近日&#xff0c;第63届Monde Selection品质评鉴活动圆满落幕&#xff0c;健效达旗下优康力和优益力产品凭借其卓越品质&#xff0c;成功摘得世界蒙特奖&#xff0c;这是中国特医食品首次获得蒙特奖国际品质奖。 健效达特医树立世界特医新标杆&#xff0c;永攀世界高峰&#xf…

解释Python中的NumPy库及其在科学计算中的作用

解释Python中的NumPy库及其在科学计算中的作用 NumPy库在Python科学计算中的作用 NumPy&#xff08;Numerical Python的简称&#xff09;是Python中一个开源的数值计算扩展库&#xff0c;它提供了大量的数学函数库用于对数组和矩阵进行运算&#xff0c;同时也针对数组运算提供…

Java定时任务

一、java.util.Timer java.util.Timer 类允许您在未来的某个时间执行一个任务&#xff0c;或者在一定的时间间隔执行任务。您可以创建一个 Timer 实例&#xff0c;并调用其 schedule() 方法来安排任务的执行。这种方式比较简单&#xff0c;但在高并发环境下可能不够灵活。 1.…

放大招,推广手机流量卡,佣金丰厚等你来拿

流量卡推广是一个非常冷门但又在身边非常常见的行业&#xff0c;知道的人目前靠着这个信息&#xff0c;发了很多小财&#xff0c;可以说早知道这一行的人会非常容易变成暴发户。 你可能也会好奇&#xff0c;为什么那么多广告都是在推流量卡&#xff0c;他们推卡到底有多高的利…