qiankun 是一个基于 single-spa 的微前端框架,其核心原理是利用了 JavaScript 的 Proxy 对象实现沙箱环境。这种沙箱环境可以实现对子应用的隔离,使其不影响主应用或其他子应用。
下面是 qiankun 的简化版沙箱实现原理代码,加上详细的注释:
// 1. 使用 Proxy 创建一个空对象,该对象是子应用运行的沙箱环境
function createSandbox() {
// 原始的 window 对象
const rawWindow = window;
// 2. 创建一个代理,在这个代理上捕获对 window 的读/写操作
const sandbox = new Proxy({}, {
// 当读取属性值时触发
get(target, key) {
// 3. 如果子应用读取 window 的属性,实际上是读取原始 window 上的属性
return rawWindow[key];
},
// 当设置属性值时触发
set(target, key, value) {
// 4. 当子应用试图修改 window 属性时,实际上修改的是这个代理对象,而不是原始的 window
// 这样就实现了对子应用对 window 修改的隔离
target[key] = value;
return true;
}
});
return sandbox;
}
// 使用
const sandbox = createSandbox();
// 子应用代码运行在沙箱中,比如:
sandbox.someProperty = 'Hello from child app';
console.log(window.someProperty); // undefined
console.log(sandbox.someProperty); // 'Hello from child app'
// 注意:这只是 qiankun 沙箱实现的一个简化版本,真实的 qiankun 沙箱实现会考虑更多的细节和兼容性问题。
注解:
- 我们首先定义了一个
createSandbox函数,它会返回一个代理对象(即沙箱)。 - 使用
Proxy创建一个新的对象,这个对象代理了所有对window对象的访问。 - 当我们从沙箱中读取一个属性时,实际上是从真实的
window对象中读取。 - 当我们尝试在沙箱中设置一个属性时,它实际上是设置在代理对象上,而不是真实的
window对象上。这样就避免了对真实window对象的修改。
通过这种方式,qiankun 实现了一个基本的 JavaScript 沙箱环境,确保子应用在此沙箱中运行时不会对主应用或其他子应用造成干扰。