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

微前端框架 qiankun 全面解析到源码实现

  • 微前端(Micro Frontends)是一种将大型前端应用拆分为多个独立模块的架构设计思想,旨在解决复杂应用开发与维护的难题。qiankun 是目前流行的微前端解决方案之一,基于 single-spa 进行封装,提供了一种简单且完整的微前端架构实践。

微前端概念与优势

  1. 什么是微前端
  • 微前端类似于后端的微服务架构,将一个大型的前端应用拆分为多个独立的前端模块,每个模块可以独立开发、测试、部署和运行。每个子应用(微应用)可以使用不同的技术栈,如 React、Vue、Angular 等。
  1. 微前端的优势
  • 独立开发:每个微应用可以由独立的团队开发,甚至可以使用不同的技术栈,降低团队间的耦合度。
  • 渐进迁移:在技术更新或重构过程中,可以通过逐步替换微应用来实现平滑迁移,而不是一次性更新整个系统。
  • 独立部署:每个微应用可以独立部署,减少部署时的影响面。
  • 复用性高:微应用可以在不同项目间复用,减少重复开发的工作。

qiankun 简介

  • qiankun 是基于 single-spa 实现的微前端框架,它通过提供完整的生命周期管理、应用间通信机制以及对沙箱的支持,简化了微前端的开发和集成。
  1. qiankun 特点
  • 简单易用:对 single-spa 进行了封装,开发者不需要关心底层细节,只需按照简单的 API 使用即可。
  • 无技术栈限制:支持任意框架(React、Vue、Angular 等)的微应用接入。
  • 沙箱隔离:通过沙箱机制隔离不同微应用的全局变量、样式,确保互不干扰。
  • 应用通信机制:支持主应用与微应用之间的数据传递与通信,提供灵活的 API。

qiankun 核心概念

  1. 主应用(Master App)
  • 主应用是整个微前端系统的宿主应用,负责微应用的注册、加载和调度。主应用通常使用统一的框架(如 React 或 Vue)进行开发。
  1. 微应用(Sub App)
  • 微应用是独立开发的前端模块,可以在主应用中注册和运行。每个微应用可以独立运行,也可以在主应用中加载时与其他微应用协同工作。
  1. 应用生命周期
  • qiankun 提供了标准的生命周期钩子,包括 bootstrap、mount、unmount,分别对应应用的初始化、挂载和卸载过程。
  1. 沙箱机制
  • qiankun 通过沙箱机制隔离不同微应用的运行环境,确保它们之间的全局变量和样式互不影响。
  1. 应用间通信
  • qiankun 提供了简单的 API 用于主应用与微应用之间进行数据传递和事件通

基本使用

  1. 安装 qiankun
  • 在主应用中安装 qiankun:
npm install qiankun --save
  1. 主应用配置
import { registerMicroApps, start } from 'qiankun';// 注册微应用
registerMicroApps([{name: 'app1',entry: '//localhost:7100', // 子应用的访问地址container: '#container', // 子应用挂载的 DOM 节点activeRule: '/app1', // 子应用激活的路径},{name: 'app2',entry: '//localhost:7200',container: '#container',activeRule: '/app2',},
]);// 启动微前端
start();
  1. 微应用配置
  • 在每个微应用中,你需要导出标准的生命周期钩子:
export async function bootstrap() {console.log('微应用启动');
}export async function mount(props) {console.log('微应用挂载', props);
}export async function unmount() {console.log('微应用卸载');
}

qiankun 的高级功能

  1. 沙箱与样式隔离

qiankun 通过沙箱机制实现对微应用的全局变量和样式隔离,确保不同的微应用不会相互干扰。每个微应用的运行环境是相互独立的。

  1. 应用间通信
    qiankun 提供了 initGlobalState 和 onGlobalStateChange API,用于微应用与主应用之间共享数据和通信。
// 主应用中创建全局状态
import { initGlobalState } from 'qiankun';
const actions = initGlobalState({ user: 'admin' });actions.onGlobalStateChange((state, prev) => {console.log('状态变化', state, prev);
});// 微应用中使用全局状态
props.onGlobalStateChange((state, prev) => {console.log('子应用状态变化', state, prev);
});
  1. 动态加载微应用
  • qiankun 支持动态注册和加载微应用,可以根据业务需求在运行时决定是否加载某个微应用。
import { loadMicroApp } from 'qiankun';const microApp = loadMicroApp({name: 'app3',entry: '//localhost:7300',container: '#container',props: { someProp: 'someValue' },
});// 动态卸载微应用
microApp.unmount();
  1. 多实例应用
  • qiankun 支持多实例的微应用,可以在同一页面上运行同一个微应用的多个实例。

源码分析

  • qiankun 是基于 single-spa 封装的微前端解决方案,旨在提供更加简单、开箱即用的微前端架构。通过对 qiankun 源码的分析,能帮助我们更好地理解其工作原理及微前端的核心思想。本文将逐步分析 qiankun 源码的核心部分,包括微应用的注册、加载、沙箱机制、应用间通信等。
  1. 源码结构概览

qiankun 的核心代码主要包括以下模块:

  • registerMicroApps:微应用的注册、管理模块。
  • start:微前端的启动模块。
  • loadMicroApp:微应用的动态加载模块。
  • 沙箱机制:隔离微应用的全局变量和样式。
  • 应用间通信:主应用和微应用之间的状态管理。
src
├── globalState // 应用间状态管理
├── interfaces  // 类型声明和接口定义
├── sandbox     // 沙箱隔离机制
├── utils       // 工具方法
├── index.ts    // 核心注册与启动代码
├── start.ts    // start 函数,启动微前端
└── register.ts // registerMicroApps 函数,注册微前端应用
  • registerMicroApps 是 qiankun 的核心 API,负责将微应用注册到主应用中。其源码位于 register.ts 文件。
export function registerMicroApps(apps: Array<RegistrableApp<any>>,lifeCycles?: FrameworkLifeCycles<any>,
) {// 对微应用的配置进行标准化const unmountPromises = apps.map((app) => {return validateRegistrableApp(app);});// 传递到 single-spa 中注册微应用unmountPromises.forEach((promise) => {promise.then((appConfig) => {registerApplication(appConfig);});});
}
  1. 启动微前端:start
  • 在 start.ts 文件中,start 方法用于启动微前端环境。它会触发微应用的加载,并控制应用的生命周期。
export function start(opts: StartOptions = {}) {// 启动 single-spastartSingleSpa(opts);// 初始化沙箱if (opts.sandbox) {initializeSandbox(opts.sandbox);}// 启动全局状态管理if (opts.globalState) {initializeGlobalState(opts.globalState);}
}

qiankun 使用 single-spa 管理应用的生命周期,而 start 方法会通过 startSingleSpa 启动整个微前端架构,并根据配置初始化沙箱机制和全局状态管理。

  1. 沙箱机制
  • 沙箱机制是 qiankun 的核心之一,它通过隔离不同微应用的全局变量和样式,确保应用之间互不干扰。qiankun 的沙箱模块位于 src/sandbox 中,主要包括 ProxySandbox 和 LegacySandbox 两种沙箱实现。
  • proxySandbox 使用现代浏览器的 Proxy API 来隔离全局对象。这是 qiankun 默认的沙箱实现方式。
export class ProxySandbox {private updatedValueSet = new Set<string>();private sandboxRunning = false;private proxy: WindowProxy;constructor() {const rawWindow = window;const fakeWindow = Object.create(null);this.proxy = new Proxy(fakeWindow, {get(target, key) {return key in target ? target[key] : rawWindow[key];},set(target, key, value) {target[key] = value;if (this.sandboxRunning) {this.updatedValueSet.add(key);}return true;}});}// 启动沙箱activate() {this.sandboxRunning = true;}// 停止沙箱deactivate() {this.sandboxRunning = false;}
}
  • 激活沙箱:调用 activate() 方法时,Proxy 开始拦截对 window 对象的修改。
  • 停止沙箱:调用 deactivate() 方法后,所有全局对象的修改将不再生效。
  1. LegacySandbox
  • LegacySandbox 是为不支持 Proxy 的浏览器设计的沙箱实现。它通过手动保存和恢复全局变量的方式来实现隔离。
export class LegacySandbox {private originalWindowProperties: Map<string, any>;constructor() {this.originalWindowProperties = new Map();}// 记录原始全局变量recordOriginalState() {Object.keys(window).forEach((key) => {this.originalWindowProperties.set(key, window[key]);});}// 恢复原始全局变量restoreOriginalState() {this.originalWindowProperties.forEach((value, key) => {window[key] = value;});}
}
  • 这类沙箱实现比较粗糙,性能上不如 ProxySandbox,但能兼容旧浏览器。
  1. 应用间通信
  • qiankun 提供了全局状态管理器 GlobalState,用于主应用和微应用之间的数据通信。
  • initGlobalState 用于初始化全局状态,并提供 setGlobalState 和 onGlobalStateChange 方法,用于跨应用通信。
export function initGlobalState(initialState: Record<string, any>) {let state = initialState;function setGlobalState(newState: Record<string, any>) {state = { ...state, ...newState };// 通知所有订阅者subscribers.forEach((listener) => listener(state));}function onGlobalStateChange(listener: (state: any) => void) {subscribers.push(listener);return () => {subscribers = subscribers.filter((item) => item !== listener);};}return {setGlobalState,onGlobalStateChange,};
}
  • setGlobalState: 设置新的全局状态,所有应用会自动收到更新。
  • onGlobalStateChange: 订阅状态变化的监听器,微应用可以通过它获取主应用的数据更新。
  1. loadMicroApp 动态加载微应用
  • loadMicroApp 是 Qiankun 提供的用于动态加载微应用的方法,允许在运行时按需加载微应用,而不需要在应用启动时注册。
export function loadMicroApp(appConfig: LoadableApp<any>,opts?: FrameworkConfiguration,
) {// 加载微应用const microApp = loadApp(appConfig, opts);// 启动微应用microApp.mount();return microApp;
}
  • 通过 loadMicroApp,开发者可以在特定场景下按需加载微应用,而无需一开始就注册所有应用。这样可以减小主应用的初始加载体积,提升性能。

相关文章:

微前端框架 qiankun 全面解析到源码实现

微前端&#xff08;Micro Frontends&#xff09;是一种将大型前端应用拆分为多个独立模块的架构设计思想&#xff0c;旨在解决复杂应用开发与维护的难题。qiankun 是目前流行的微前端解决方案之一&#xff0c;基于 single-spa 进行封装&#xff0c;提供了一种简单且完整的微前端…...

初始化数据的正确方式?

关于这篇文章 https://proandroiddev.com/loading-initial-data-in-launchedeffect-vs-viewmodel-f1747c20ce62 pl的视频解读 当在viewmodel中需要进行数据的初始化的时候 viewmodel.initData() 放在哪里合适呢&#xff0c;大部分情况下可以放在 viewmodel的init{}模块&…...

Flutter平台嵌入器

When you build a Flutter app, it’s not just about the code you write in Dart and the Flutter framework. There’s also a crucial piece called the platform embedders that enable your Flutter app to run on different operating systems like Android, iOS, and s…...

微信小程序——婚礼邀请函

一、界面设计 首页&#xff1a; 精美的婚礼主题背景图&#xff0c;可能是新人的婚纱照或浪漫的插画。温馨的欢迎语&#xff0c;如 “欢迎参加我们的婚礼”。一个 “打开邀请函” 的按钮&#xff0c;引导用户进入邀请函详情页面。 邀请函详情页面&#xff1a; 顶部展示新人的照片…...

WebRTC Connection Negotiate解决

最近有个项目 &#xff0c;部署之后一直显示&#xff0c;查了一些资料还是没有解决&#xff0c;无奈只有自己研究解决&#xff1f;经过排查&#xff0c;应该是内网穿透的问题 什么是内网穿透&#xff1f; 我们访问我们自己的官网产品页面&#xff0c;我们的服务器是一个单独…...

Redis面试篇1

1、为什么要用缓存&#xff1f; 使用缓存的目的就是提升读写性能。在实际的业务场景下&#xff0c;更多的是为了提升读性能&#xff0c;带来更好的性能和并发量。Redis的读写性能比MySQL好的多&#xff0c;我们就可以把MySQL中的热点数据缓存到Redis&#xff0c;提升读取性能&…...

Debezium系列之:Debezium 3.0.0.Final发布

Debezium系列之:Debezium 3.0.0.Final发布 Debezium 核心的变化需要 Java 17基于Kafka 3.8 构建废弃的增量信号字段的删除每个表的详细指标MariaDB连接器的更改版本 11.4.3 支持MongoDB连接器的更改MongoDB sink connectorMySQL连接器的改变MySQL 9MySQL向量数据类型Oracle连接…...

一文解决jQuery表格插件DataTable导出PDF中文乱码问题

原因是默认字体不支持中文&#xff0c;需要更换字体。 详情官网&#xff1a;pdfmake 官网的大致意思是&#xff0c;下载pdfmake后&#xff0c;自行生成可用的字体js文件 以下是详细操作&#xff1a; 重要前提&#xff1a;电脑上需要已安装nodejs 点击进入官网下载安装即可&a…...

使用pytorch进行迁移学习的两个步骤

1. 步骤及代码 迁移学习一般都会使用两个步骤进行训练&#xff1a; 固定预训练模型的特征提取部分&#xff0c;只对最后一层进行训练&#xff0c;使其快速收敛&#xff1b;使用较小的学习率&#xff0c;对全部模型进行训练&#xff0c;并对每层的权重进行细微的调节。 impor…...

ChatGPT相关参数示例

max_token 用于控制最大输出长度&#xff0c;若ChatGPT的回复大于max_tokens&#xff0c;则对输出结果进行截断。 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" ) response client.chat.completions.create(model"…...

OWASP发布大模型安全风险与应对策略(QA测试重点关注)

开放式 Web 应用程序安全项目&#xff08;OWASP&#xff09;发布了关于大模型应用的安全风险&#xff0c;这些风险不仅包括传统的沙盒逃逸、代码执行和鉴权不当等安全风险&#xff0c;还涉及提示注入、对话数据泄露和数据投毒等人工智能特有的安全风险。 帮助开发者和测试同学更…...

【HarmonyOS开发笔记 2 】 -- ArkTS语法中的变量与常量

ArkTS是HarmonyOS开发的编程语言 ArkTS语法中的变量 【语法格式】&#xff1a; let 变量名: 类型 值 let&#xff1a;是定义变量的关键字类型&#xff1a; 值数据类型&#xff0c; 常用的数据类型 字符型&#xff08;string&#xff09;、数字型&#xff08;number&#xf…...

UI自动化测试示例:python+pytest+selenium+allure

重点应用是封装、参数化&#xff1a; 比如在lib文件夹下&#xff0c;要存储封装好的方法和必要的环境变量&#xff08;指网址等&#xff09; 1.cfg.py:封装网址和对应的页面 SMP_ADDRESS http://127.0.0.1:8234SMP_URL_LOGIN f{SMP_ADDRESS}/login.html SMP_URL_DE…...

C/C++ 编程小工具

编写了 tools.h 和 tools.cpp&#xff0c;用于 Debug、性能测试、打印日志。 tools.h #ifndef TOOLS_H #define TOOLS_H#include <time.h> #include <fstream> #include <iostream> #include <random> #include <chrono> #include <vector&…...

第四十二章 使用 WS-ReliableMessaging

文章目录 第四十二章 使用 WS-ReliableMessaging从 Web 客户端发送一系列消息 第四十二章 使用 WS-ReliableMessaging IRIS 支持 WS-ReliableMessaging 规范的部分内容&#xff0c;如简介中所述。此规范提供了一种按顺序可靠地传递一系列消息的机制。本页介绍如何手动使用可靠…...

利士策分享,婚姻为何被称为大事?

利士策分享&#xff0c;婚姻为何被称为大事&#xff1f; 在历史的长河中&#xff0c;婚姻一直被视为人生中的头等大事&#xff0c;这一观念跨越时空&#xff0c;深深植根于各种文化和社会结构中。 古人为何将婚姻称为“大事”&#xff0c;这背后蕴含着丰富的社会、文化和心理寓…...

malloc源码分析之 ----- 你想要啥chunk

文章目录 malloc源码分析之 ----- 你想要啥chunktcachefastbinsmall binunsorted binbin处理top malloc源码分析之 ----- 你想要啥chunk tcache malloc源码&#xff0c;这里以glibc-2.29为例&#xff1a; void * __libc_malloc (size_t bytes) {mstate ar_ptr;void *victim;vo…...

软考系统分析师知识点五:数据通信与计算机网络

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;32天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…...

windows客户端SSH连接ubuntu/linux服务器,三种网络连接:局域网,内网穿透(sakuraftp),虚拟局域网(zerotier)

windows客户端SSH连接ubuntu/linux服务器&#xff0c;三种网络连接&#xff1a;局域网&#xff0c;内网穿透&#xff08;sakuraftp&#xff09;&#xff0c;虚拟局域网&#xff08;zerotier&#xff09; 目录 SSH简述、三种网络连接特点SSH简述局域网内连接内网穿透&#xff08…...

Python 工具库每日推荐【openpyxl 】

文章目录 引言Python Excel 处理库的重要性今日推荐:openpyxl 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:自动生成月度销售报告案例分析高级特性条件格式数据验证扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...