qiankun快照沙箱能处理属性的新增和修改,但是全局环境的属性删除不兼容,在应用中删除全局环境的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) => { if (this.modifyPropsMap[p] == "del") { delete window[p]; } else { 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]; } }); iter(this.windowSnapshot, (prop) => { if (!window.hasOwnProperty(prop)) { // 记录变更 this.modifyPropsMap[prop] = "del"; // 还原window window[prop] = this.windowSnapshot[prop]; } }); } } window.kk = "132"; const sandbox = new SnapshotSandbox(); ((window) => { // 激活沙箱 sandbox.active(); window.sex = "男"; window.age = "22"; console.log(window.sex, window.age, window.kk); delete window.sex; delete window.kk; console.log(window.sex, window.age, window.kk); // 退出沙箱 sandbox.inactive(); console.log(window.sex, window.age, window.kk); // 激活沙箱 sandbox.active(); console.log(window.sex, window.age, window.kk); })(sandbox.proxy);