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. 适合需要混合使用不同技术方案的复杂场景
相关推荐
东风西巷42 分钟前
Balabolka:免费高效的文字转语音软件
前端·人工智能·学习·语音识别·软件需求
萌萌哒草头将军1 小时前
10个 ES2025 新特性速览!🚀🚀🚀
前端·javascript·vue.js
半夏陌离1 小时前
SQL 入门指南:排序与分页查询(ORDER BY 多字段排序、LIMIT 分页实战)
java·前端·数据库
whysqwhw1 小时前
鸿蒙工程版本与设备版本不匹配
前端
gnip1 小时前
http缓存
前端·javascript
我不只是切图仔2 小时前
我只是想给网站加个注册验证码,咋就那么难!
前端·后端
该用户已不存在2 小时前
macOS是开发的终极进化版吗?
前端·后端
小豆包api3 小时前
小豆包AI API × Nano Banana:3D手办 + AI视频生成,「动起来」的神级玩法!
前端·api
布列瑟农的星空3 小时前
大话设计模式——观察者模式和发布/订阅模式的区别
前端·后端·架构
龙在天3 小时前
Vue3 实现 B站 视差 动画
前端