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 资源
  • 通过 evalwith 执行子应用代码
  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. 适合需要混合使用不同技术方案的复杂场景
相关推荐
夕水23 分钟前
这个提升效率宝藏级工具一定要收藏使用
前端·javascript·trae
会飞的鱼先生37 分钟前
vue3 内置组件KeepAlive的使用
前端·javascript·vue.js
斯~内克1 小时前
前端浏览器窗口交互完全指南:从基础操作到高级控制
前端
Mike_jia1 小时前
Memos:知识工作者的理想开源笔记系统
前端
前端大白话1 小时前
前端崩溃瞬间救星!10 个 JavaScript 实战技巧大揭秘
前端·javascript
loveoobaby1 小时前
Shadertoy着色器移植到Three.js经验总结
前端
蓝易云2 小时前
在Linux、CentOS7中设置shell脚本开机自启动服务
前端·后端·centos
浩龙不eMo2 小时前
前端获取环境变量方式区分(Vite)
前端·vite
土豆骑士2 小时前
monorepo 实战练习
前端
土豆骑士2 小时前
monorepo最佳实践
前端