当前位置: 首页 > article >正文

qiankun沙箱实现原理

文章目录

    • 前言
    • Qiankun 沙箱实现原理
      • 1.全局变量隔离:
      • 2.DOM 操作隔离:
      • 3.事件隔离:
    • 具体实现细节
      • 使用 Proxy 对象
      • 2.DOM 操作隔离
      • 3.事件隔离
    • 示例代码
    • 总结

前言

  Qiankun 设置沙箱(Sandbox)主要是为了实现子应用之间的隔离,防止子应用之间的全局变量污染和副作用。Qiankun 使用了多种技术手段来实现这一目标,包括但不限于 JavaScript 的 Proxy 对象、自定义的全局变量管理等。

Qiankun 沙箱实现原理

Qiankun 的沙箱实现主要通过以下几个步骤来完成:

1.全局变量隔离:

  • Qiankun 使用 Proxy 对象来拦截对全局变量的访问和修改。
  • 当子应用试图访问或修改全局变量时,Qiankun 会捕获这些操作,并在沙箱环境中进行处理。

2.DOM 操作隔离:

  • Qiankun 通过创建一个虚拟的 DOM 环境来隔离子应用的 DOM 操作。
  • 子应用的 DOM 操作会被映射到这个虚拟的 DOM 环境中,从而不影响主应用和其他子应用。

3.事件隔离:

  • Qiankun 会对子应用中发生的事件进行监听和管理,确保事件不会影响到全局范围。

具体实现细节

使用 Proxy 对象

  Qiankun 使用 Proxy 对象来拦截对全局变量的操作,从而实现全局变量的隔离。

const sandbox = {
  global: window,
};

const proxyHandler = {
  get(target, key) {
    // 拦截对全局变量的访问
    return Reflect.get(sandbox.global, key) || target[key];
  },
  set(target, key, value) {
    // 拦截对全局变量的修改
    sandbox.global[key] = value;
    return true;
  },
};

// 创建一个全局变量的代理对象
window = new Proxy(sandbox, proxyHandler);

2.DOM 操作隔离

  Qiankun 通过创建一个沙箱 DOM 环境来隔离子应用的 DOM 操作。

function createSandboxDOM() {
  const sandboxDiv = document.createElement('div');
  sandboxDiv.id = 'sandbox';
  document.body.appendChild(sandboxDiv);
  return sandboxDiv;
}

const sandboxDiv = createSandboxDOM();

// 将子应用的所有 DOM 操作映射到 sandboxDiv 中
document.body = sandboxDiv;

3.事件隔离

  Qiankun 会对子应用中的事件进行监听和管理,确保事件不会影响到全局范围。

function addEventListenerWrapper(type, listener) {
  const originalAddEventListener = window.addEventListener;
  window.addEventListener = function (eventType, cb) {
    originalAddEventListener(eventType, function (event) {
      // 检查事件是否来自子应用
      if (event.target && event.target.ownerDocument === sandboxDiv) {
        cb(event);
      }
    });
  };
}

addEventListenerWrapper('click', function (event) {
  console.log('子应用点击事件', event);
});

示例代码

  主应用配置

// main.js
import { init, MicroApp, router } from 'qiankun';

function createSandboxDOM() {
  const sandboxDiv = document.createElement('div');
  sandboxDiv.id = 'sandbox';
  document.body.appendChild(sandboxDiv);
  return sandboxDiv;
}

const sandboxDiv = createSandboxDOM();

init({
  apps: [
    new MicroApp({
      name: 'sub-app-1',
      entry: '//localhost:8001',
      container: sandboxDiv,
      activeRule: '/sub-app-1',
    }),
  ],
  router,
});

// 路由监听
router.onNavigate(({ location }) => {
  console.log('navigate to', location.pathname);
});

  子应用配置

// sub-app.js
if (window.__POWERED_BY_QIANKUN__) {
  // 当前环境是 Qiankun 环境
  window.__onGlobeEvent = function (event) {
    console.log('received event:', event);
  };

  // 创建沙箱环境
  const sandbox = {
    global: window,
  };

  const proxyHandler = {
    get(target, key) {
      return Reflect.get(sandbox.global, key) || target[key];
    },
    set(target, key, value) {
      sandbox.global[key] = value;
      return true;
    },
  };

  // 创建一个全局变量的代理对象
  window = new Proxy(sandbox, proxyHandler);
} else {
  // 非 Qiankun 环境下的普通应用
  // ...
}

总结

  Qiankun 通过使用 Proxy 对象来拦截全局变量的访问和修改,通过创建沙箱 DOM 环境来隔离子应用的 DOM 操作,并通过自定义的事件监听来管理子应用中的事件。这些措施共同实现了子应用之间的隔离,确保了主应用和子应用之间的互不干扰。通过这些技术手段,Qiankun 能够有效保障微前端架构的安全性和稳定性。

  





http://www.kler.cn/news/311857.html

相关文章:

  • linux之网络命令
  • 移动开发(三):使用.NET MAUI打包第一个安卓APK完整过程
  • .NET内网实战:通过命令行解密Web.config
  • 一文了解高速工业相机
  • ant vue3 datePicker默认显示英文
  • Spring Boot中配置图片资源通常涉及到静态资源的管理
  • 基于单片机的智能家居控制系统设计
  • python 爬虫 selenium 笔记
  • HarmonyOS开发实战(5.0)实现二楼上划进入首页效果详解
  • 典型的MVC设计模式:使用JSP和JavaBean相结合的方式来动态生成网页内容典型的MVC设计模式
  • 大数据框架常用端口号总结
  • 局域网视频
  • 【机器学习】经典数据集鸢尾花的分类识别
  • vue2.0+ts注册全局函数和几个递归查找
  • 前端vue-关于标签切换的实现
  • 【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL24
  • 基于CNN的10种物体识别项目
  • Spark-ShuffleWriter-UnsafeShuffleWriter
  • react是什么?
  • 数据结构、STL
  • 私域直播平台带源码
  • FRIDA-JSAPI:Java使用
  • leetcode:字符串中的第一个唯一字符
  • YOLOv10轻量化快速涨点之改进AKConv
  • Linux:vim编辑技巧
  • 【STL】priority_queue 基础,应用与操作
  • C++ 头文件 .h和.hpp的介绍与区别
  • 深度学习常见面试题及答案(11~15)
  • [Linux]自定义shell详解
  • HTML/CSS/JS学习笔记 Day4(CSS--C1 选择器声明)