const sandbox = new LegacySandbox("app1");
sandbox.activate(); // 激活应用
sandbox.setWindowProp("foo", 123);
console.log(window.foo); // 123
sandbox.deactivate(); // 卸载应用
console.log(window.foo); // undefined(被删除)
// 1. 创建 ProxySandbox
function createProxySandbox() {
// 创建一个空对象 没有原型链。
const fakeWindow = Object.create(null);
return new Proxy(fakeWindow, {
get(target, prop) {
if (prop in target) {
return target[prop]; // 优先取子应用自己的
}
return window[prop]; // 否则取宿主的全局
},
set(target, prop, value) {
target[prop] = value; // 写只写在 fakeWindow 上
return true;
}
});
}
// 2. 模拟子应用执行环境
function runInSandbox(code, sandbox) {
const wrapper = new Function("window", `
with(window) {
${code}
}
`);
wrapper(sandbox); // 关键:传入 proxy
}
// 3. 使用
const sandbox1 = createProxySandbox();
const sandbox2 = createProxySandbox();
runInSandbox(`window.foo = "app1"; console.log("app1 foo =", window.foo);`, sandbox1);
runInSandbox(`window.foo = "app2"; console.log("app2 foo =", window.foo);`, sandbox2);
console.log("真实 window.foo =", window.foo); // undefined,没有污染