qiankun 与 Web Components 的关系

qiankun 微前端框架的实现原理与 Web Components 的关系需要从技术实现层面进行拆解:

qiankun 的核心原理(不使用 Web Components)

javascript 复制代码
// 典型的 qiankun 应用注册方式
import { registerMicroApps, start } from 'qiankun';

registerMicroApps([
  {
    name: 'vue-app',
    entry: '//localhost:7101',
    container: '#subapp-viewport',
    activeRule: '/vue',
  },
  {
    name: 'react-app',
    entry: '//localhost:7102',
    container: '#subapp-viewport',
    activeRule: '/react',
  }
]);

start();

qiankun 的核心技术实现主要基于以下机制:

  1. 应用加载机制
  • 使用 import-html-entry 库解析子应用 HTML
  • 动态创建 <script> 标签加载 JS 资源
  • 通过 eval 或 with 执行子应用代码
  1. JS 沙箱隔离
javascript 复制代码
// 快照沙箱实现示例
class SnapshotSandbox {
  constructor() {
    this.proxy = window;
    this.modifyPropsMap = {};
  }

  active() {
    this.windowSnapshot = {}; 
    for (const prop in window) {
      this.windowSnapshot[prop] = window[prop];
    }
    Object.keys(this.modifyPropsMap).forEach(p => {
      window[p] = this.modifyPropsMap[p];
    });
  }

  inactive() {
    for (const prop in window) {
      if (this.windowSnapshot[prop] !== window[prop]) {
        this.modifyPropsMap[prop] = window[prop];
        window[prop] = this.windowSnapshot[prop];
      }
    }
  }
}
  1. 样式隔离方案
  • 动态样式表(加载/卸载样式表)
  • 实验性 Shadow DOM 支持(可选)

与 Web Components 的关系

  1. 非必要依赖
  • qiankun 的核心实现不依赖 Web Components
  • 框架本身使用纯 JavaScript 实现应用隔离和通信
  1. 可选集成方式
javascript 复制代码
// 在 qiankun 中可选使用 Shadow DOM
export function renderContainer(container) {
  if (this.useShadowDOM) {
    if (!container.shadowRoot) {
      container.attachShadow({ mode: 'open' });
    }
    return container.shadowRoot;
  }
  return container;
}
  1. 设计理念差异
  • qiankun:应用级隔离(整个子应用)
  • Web Components:组件级封装(单个自定义元素)

技术方案对比表

特性 qiankun Web Components
隔离级别 应用级 组件级
技术标准 框架实现 浏览器原生标准
样式隔离 动态样式表/前缀隔离 Shadow DOM
JS 隔离 代理沙箱 无自动隔离
通信机制 全局状态/事件总线 Custom Events
加载方式 动态脚本加载 自定义元素注册

混合使用场景

javascript 复制代码
// 在 qiankun 子应用中使用 Web Components
class MicroAppWrapper extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }

  connectedCallback() {
    // 使用 qiankun 的 loadMicroApp 加载子应用
    this.microApp = loadMicroApp({
      name: 'vue-micro-app',
      entry: '//localhost:7101',
      container: this.shadowRoot,
    });
  }

  disconnectedCallback() {
    this.microApp.unmount();
  }
}

customElements.define('micro-app-wrapper', MicroAppWrapper);

总结

qiankun 的核心原理不依赖 Web Components,而是通过 JavaScript 沙箱和动态资源加载实现微前端架构。但两者可以结合使用:

  1. qiankun 提供应用级隔离和通信机制
  2. Web Components 提供组件级封装能力
  3. 可通过 Shadow DOM 增强样式隔离(需手动启用)
  4. 适合需要混合使用不同技术方案的复杂场景
相关推荐
前端snow6 分钟前
ai agent --- 异步处理之 Rabbit MQ
前端
念何架构之路10 分钟前
zap扩展生态与总结
java·前端·数据库
独孤九剑打醒他24 分钟前
【原创开源】【概念设计】源 - 栅 - 漏 - 栅 - 源 横向双栅 MOS,低压交流多值逻辑芯片探索
前端·其他·架构·开源·硬件工程
mantou1321 小时前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端
默_笙1 小时前
🍕 一个主编、三个工种、两本手册:搭一支 AI 调研队
前端·javascript
纸片人1 小时前
Blender 建模 + Three.js 展示:和 AI 一起做一个光储充超充站数字孪生大屏
前端
智能直播1 小时前
网络RTMP拉流不卡顿、声音不同步?一文讲透缓冲区、时间戳与MEDAI V2实战调优
前端
第七页独白1 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库
纸片人1 小时前
只用 three.js + OpenStreetMap,手搓一个「成都城市 3D」数据大屏
前端
星若生辉1 小时前
Hugo 静态站点搭建|从本地调试到上线部署实操指南
前端