关于qiankun沙箱sandbox(面试题)

2023-12-02 22:44

本文主要是介绍关于qiankun沙箱sandbox(面试题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么要有js资源隔离机制?

主应用和子应用,相同的全局变量,可能会发生冲突,子应用和子应用之间,相同的全局变量,也可能会发生冲突。在这里我们主要指的就是window。

思路:打开沙箱时能够修改属性值;关闭沙箱时恢复未开启沙箱前的属性值,并且要记录修改了哪些属性。

qiankun.js隔离机制

SnapshotSandBox

快照沙箱,支持单个微应用

class SnapShotBox {windowSnap = {} //保存window上原本的属性值modifyPropMap = {} //记录修改的属性//微应用激活状态active() {//保存window对象上所有属性的状态for (const prop in window) {this.windowSnap[prop] = window[prop]}//恢复上一次在运行该微应用时所修改过的window上的属性Object.keys(this.modifyPropMap).forEach(prop => {window[prop] = this.modifyPropMap[prop];})}//微应用未激活状态inactive() {for (const prop in window) {//判断是否值发生了变化if (window[prop] !== this.windowSnap[prop]) {//记录修改了window上的哪些属性this.modifyPropMap[prop] = window[prop]//将window上的属性状态还原至微应用运行之前的状态window[prop] = this.windowSnap[prop]}}}
}
const snapShotBox = new SnapShotBox()
window.city = 'Beijing'
console.log(window.city); //Beijing
snapShotBox.active()
window.city = 'Shanghai'
console.log(window.city); //Shanghai
snapShotBox.inactive()
console.log(window.city); //Beijing

完成了一个简易沙箱,但是会遍历window的所有属性,非常消耗性能,方案不是很可取,与此同时,影响了window上的值,如果多个微应用就可能会产生冲,只能激活一个微应用。

LegacySandBox
class LegacySandBox {currentUpdatePropsValueMap = new Map() //微应用中修改的属性modifiedPropsOriginValueMapInSanBox=new Map()//window中被修改的属性addedPropsMapInSandBox=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)){ //如果window上没有这个属性,那么就是新增的属性this.addedPropsMapInSandBox.set(prop,value)//如果修改对象中没有这个属性,就保存一下}else if(!this.modifiedPropsOriginValueMapInSanBox.has(prop)){this.modifiedPropsOriginValueMapInSanBox.set(prop,originalVal)}this.currentUpdatePropsValueMap.set(prop,value)window[prop] = value},get:(target,prop,receiver)=>{return window[prop]},})}//设置window属性setWindowProp(prop, value, isToDelete) {if (value == "undfined" && isToDelete) {delete window[prop]} else {window[prop] = value}}//微应用激活状态active() {//恢复上一次在运行该微应用时所修改过的window上的属性this.currentUpdatePropsValueMap.forEach((value, prop) => {this.setWindowProp(prop, vaue);})}//微应用未激活状态inactive() {//还原window上原有的属性this.modifiedPropsOriginValueMapInSanBox.forEach((value,prop)=>{this.setWindowProp(prop,value)})//删除微应用运行期间,window上新增的属性this.addedPropsMapInSandBox.forEach((_,prop)=>{this.setWindowProp(prop,undefined,true)})}
}
let legacySandbox = new LegacySandBox()
window.city = 'Beijing'
console.log(window.city); //Beijing
snapShotBox.active()
window.city = 'Shanghai'
console.log(window.city); //Shanghai
snapShotBox.inactive()
console.log(window.city); //Beijing

不需要遍历window上的所有属性,性能良好,但是依然改变的是window上的值,但同一时间还是只能激活一个微应用。

ProxySandBox
class ProxySandBox {proxyWindow;isRunning = false//微应用激活状态active() {this.isRunning = true}//微应用未激活状态inactive() {this.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]}})}
}
window.city = 'Beijing'
let proxySandBox01 = new ProxySandBox()
let proxySandBox02 = new ProxySandBox()
proxySandBox01.active()
proxySandBox02.active()
proxySandBox01.proxyWindow.city = "Shanghai"
proxySandBox02.proxyWindow.city = "Tianjing"
console.log(window.city, proxySandBox01.proxyWindow.city, proxySandBox02.proxyWindow.city);
//Beijing Shanghai Tianjing
proxySandBox01.inactive()
proxySandBox02.inactive()
console.log(window.city, proxySandBox01.proxyWindow.city, proxySandBox02.proxyWindow.city);
//Beijing Shanghai Tianjing

这种ProxySandBox不需要遍历window上的所有属性,性能良好,同一时间可以激活多个微应用互不干扰。

SnapshotSandBox兼容性很好ProxySandBox适用于es6的语法中,就简单介绍到这里。

这篇关于关于qiankun沙箱sandbox(面试题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447107

相关文章

Jvm sandbox mock机制的实践过程

《Jvmsandboxmock机制的实践过程》:本文主要介绍Jvmsandboxmock机制的实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景二、定义一个损坏的钟1、 Springboot工程中创建一个Clock类2、 添加一个Controller

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`

Laravel 面试题

PHP模块 PHP7 和 PHP5 的区别,具体多了哪些新特性? 性能提升了两倍 结合比较运算符 (<=>) 标量类型声明 返回类型声明 try…catch 增加多条件判断,更多 Error 错误可以进行异常处理 匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义 …… 了解更多查看文章底部链接 PHP7 新特性 为什么 PHP

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。