【qiankun原理】 沙箱

339 阅读2分钟

qiankun 是一个基于 single-spa 的微前端框架,其核心原理是利用了 JavaScriptProxy 对象实现沙箱环境。这种沙箱环境可以实现对子应用的隔离,使其不影响主应用或其他子应用。

下面是 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 沙箱实现会考虑更多的细节和兼容性问题。

注解:

  1. 我们首先定义了一个 createSandbox 函数,它会返回一个代理对象(即沙箱)。
  2. 使用 Proxy 创建一个新的对象,这个对象代理了所有对 window 对象的访问。
  3. 当我们从沙箱中读取一个属性时,实际上是从真实的 window 对象中读取。
  4. 当我们尝试在沙箱中设置一个属性时,它实际上是设置在代理对象上,而不是真实的 window 对象上。这样就避免了对真实 window 对象的修改。

通过这种方式,qiankun 实现了一个基本的 JavaScript 沙箱环境,确保子应用在此沙箱中运行时不会对主应用或其他子应用造成干扰。