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. 适合需要混合使用不同技术方案的复杂场景
相关推荐
又又呢1 小时前
前端面试题总结——webpack篇
前端·webpack·node.js
dog shit2 小时前
web第十次课后作业--Mybatis的增删改查
android·前端·mybatis
我有一只臭臭2 小时前
el-tabs 切换时数据不更新的问题
前端·vue.js
七灵微2 小时前
【前端】工具链一本通
前端
Nueuis3 小时前
微信小程序前端面经
前端·微信小程序·小程序
_r0bin_5 小时前
前端面试准备-7
开发语言·前端·javascript·fetch·跨域·class
IT瘾君5 小时前
JavaWeb:前端工程化-Vue
前端·javascript·vue.js
potender5 小时前
前端框架Vue
前端·vue.js·前端框架
站在风口的猪11086 小时前
《前端面试题:CSS预处理器(Sass、Less等)》
前端·css·html·less·css3·sass·html5
程序员的世界你不懂6 小时前
(9)-Fiddler抓包-Fiddler如何设置捕获Https会话
前端·https·fiddler