基于 qiankun 的应用间页面跳转

微前端qiankun 微前端乾坤 阅读详情

一、问题背景

在单体前端应用中,路由是单一事实源,所有页面跳转都由同一个路由实例管理。但在微前端架构中,每个微应用都是独立部署单元,拥有自己的路由实例,这导致了路由的碎片化。

微应用需要跳转到主应用或其他微应用页面,直接操作浏览器地址栏(window.location.href)会导致全页面刷新,破坏微前端的无缝体验,同时丢失应用状态。

本次应用均采用 Vue 3 + qiankun 2.7.0 架构,可采用控制反转(IoC) 模式,主应用作为依赖容器,将路由能力通过 props 注入到微应用,实现路由委托。

二、理论基础:qiankun 的依赖注入机制

  1. props 注入原理

qiankun 基于 Single-SPA 的 registerApplication API,在应用生命周期中注入 props:

// qiankun 内部简化逻辑(伪代码)
const loadApp = async (app, userProps) => {
  const lifecycle = await app.loadApp();
  return {
    mount: [async (props) => {
      // 合并默认 props 与用户自定义 props
      const mergedProps = {
        ...props,           // 容器、name 等默认属性
        ...userProps        // 用户注册的 props(mainRouter/mainNavigate)
      };
      await lifecycle.mount(mergedProps);
    }]
  };
};

这实现了依赖注入模式:主应用作为 IoC 容器,微应用被动接收依赖,而非主动创建。

  1. 控制反转在路由中的应用
模式特征代码表现
传统模式微应用主动创建路由const router = new VueRouter(); router.push()
IoC 模式主应用创建,微应用接收props.mainNavigate(‘/path’)

微应用不依赖具体路由实现,只依赖抽象接口;主应用可在导航方法中统一添加拦截逻辑(权限、埋点)

┌─────────────────────────────────────┐
│         浏览器地址栏 (URL)           │ ← 用户可感知,全局共享
├─────────────────────────────────────┤
│      主应用路由层 (Main Router)      │ ← 调度中心,控制生命周期
│         ↑ 委托调用                   │
├─────────────────────────────────────┤
│   微应用业务层 (Business Logic)      │ ← 调用 props.mainNavigate
│         ↑ 触发跳转                   │
├─────────────────────────────────────┤
│   微应用组件层 (Vue Components)      │ ← 用户点击按钮
└─────────────────────────────────────┘

微应用只负责发起跳转意图,主应用负责执行路由操作,这种分层保证了架构的清晰与可控。

三、实现方案

3.1 主应用配置层

主应用作为编排中心,注册微应用时封装路由能力:

import { registerMicroApps } from 'qiankun';
import Router from './router'; // Vue Router 实例

/**
 * 微应用注册工厂
 * 职责:统一封装路由能力,实现依赖注入
 */
const regMicroAllApp = (list) => {
  if (list.length === 0) return;

  const microAllApp = list.map((item) => ({
    name: item.name,
    entry: item.entry 
      ? item.entry 
      : window.location.origin + window.location.pathname + item.name + "/index.html",
    container: "#subapp-viewport",
    // hash 模式下的激活规则,兼容多种入口路径
    activeRule: [
      "/#/" + item.name, 
      "/index.html#/" + item.name,
      window.location.pathname + "#/" + item.name,
      window.location.pathname + "index.html#/" + item.name
    ],
    props: {
      // 业务上下文传递
      "upper-name": item["upper-name"],  // 上一层产品名,用于面包屑
      "BMap": window.BMap,                // 地图 SDK(兼容沙箱外资源)
      "Sidebar": window.Sidebar,          // 侧边栏状态共享
      
      // 方案 1:封装导航方法(函数式抽象)
      "mainNavigate": (path, query = {}) => {
        // 可在此时机统一处理:权限校验、埋点、参数序列化
        console.log(`[qiankun] 导航到 ${path}`, query);
        Router.push({ path, query });
      },
      
      // 方案 2:暴露路由实例(底层能力)
      "mainRouter": Router,  // 直接传递实例,微应用可调用全部 API
    }
  }));

  registerMicroApps(microAllApp);
};

关键设计:

  • activeRule 的多种匹配规则:兼容直接访问、带 index.html、不同基础路径等场景
  • upper-name 的传递:支持微应用展示层级关系(如"监控中心 > 告警管理")
  • 全局对象(BMap、Sidebar)的共享:突破 qiankun 沙箱对 window 的隔离

3.2 微应用生命周期

微应用在 mount 生命周期中接收并存储 props:

function life(render, instance = null) {
  const obj = {};
  window.needClean = false;

  obj.bootstrap = async () => {
    console.log('[micro-app] bootstraped');
  };

  obj.mount = async (props) => {
    // 关键:将 props 挂载到全局,供业务组件访问
    window.props = props;
    
    // 监听全局状态变化(如主应用通知清理数据)
    props.onGlobalStateChange((state) => {
      window.needClean = !!state.cleanData;
    });

    // 渲染应用
    render();
  };

  obj.unmount = async () => {
    // 清理工作:销毁实例、解绑事件、清空全局变量
    window.props = null;
    instance = null;
  };

  // 暴露 qiankun 生命周期
  window.qiankunLifecycle = {
    bootstrap: obj.bootstrap,
    mount: obj.mount,
    unmount: obj.unmount
  };
}

注意事项:

  • window.props 的挂载:简单直接,但需注意内存泄漏(在 unmount 中清理)
  • 生产环境建议:使用 Vue 3 的 provide/inject 或全局状态管理,而非直接挂载 window

3.3 微应用跳转实现

业务组件中通过 window.props 获取主应用能力:

// 微应用:AlertList.vue
const goToAlertDetail = (id) => {
  // 方案 1:使用 mainNavigate(推荐)
  if (window.props?.mainNavigate) {
    // 声明式调用,参数结构化,无需关心 URL 拼接
    window.props.mainNavigate('/alert-view', { id });
    return;
  }

  // 方案 2:直接使用 mainRouter
  if (window.props?.mainRouter) {
    // 命令式调用,需手动处理 URL 参数
    window.props.mainRouter.push(`/alert-view?id=${id}`);
    return;
  }
};

四、方案对比

维度mainNavigate(推荐)mainRouter
封装层级函数封装,仅暴露导航能力直接暴露 Router 实例
参数处理结构化对象,自动序列化需手动拼接 URL
扩展性主应用可统一拦截(权限、埋点)微应用直接操作,难以管控
适用场景大型项目,需统一管控小型项目,快速迁移

总结:通过 qiankun 的 props 机制实现路由能力委托,解决微前端架构下应用间跳转的沙箱隔离与状态保持问题。优先使用 mainNavigate,在函数封装层统一处理横切关注点(权限、日志、降级),保持微应用与路由实现的解耦。

UMI 中使用qiankun问题记录 / 子应用代理'/api': {},},// 基座应用代理要增加},},其他: loading样式修改, 要放全局样式里面// qiankun 子应用loading的样式修改,这里使用的是route配置microAppProps下autoSetLoadingi { 阅读详情

相关推荐

qiankun项目搭建手册

vue3+vite+ts+qiankun

King的博客 451

在Qiankun微前端架构中实现子应用间的页面跳转空白页及解决办法

【代码】在Qiankun微前端架构中实现子应用间的页面跳转空白页及解决办法。

u010234868的专栏 929

systrace分析 之 问题初步定位

如下surfaceflinger空缺点,上面对应的bufferTX 中有buffer,但VSYNC-SF 过来后,SurfaceFlinger却没有去取,检查测试app “android.settings”, 也没有GPU completion 时间长的问题,所以该部分可以请SurfaceFlinger的owner 进一步确认为何不取buffer。. GPU拿的是acquireFence HWC拿的是releaseFence, GPU是绘图,HWC是合成显示,这两个是互相等待的关系,

yangzex的专栏 3197

微前端:qiankun的五种通信方式

微前端 qiankun 竟然有 5 种应用间通信方式

分享前端开发工程师的一些日常生活、前端知识点、职业发展、对一些问题的看法、感悟等等 1万+

SoapUI 5.0 模拟WebService接口实战:从WSDL文件到Mock服务端完整流程

本文详细介绍了如何使用SoapUI 5.0模拟WebService接口,从解析WSDL文件到搭建完整的Mock服务端流程。通过实战案例和效率技巧,帮助开发者快速掌握接口模拟技术,提升开发与测试效率。

weixin_26833139的博客 408

Unity镜子效果的实现(无需镜子Shader)

Unity镜子效果制作教程 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速实现一个简单的镜面反射效果为新手节省宝贵的时间,避免采坑! Chinar 教程效果: 1 Cre...

weixin_33947521的博客 9566

微前端之qiankun初体验

什么是qiankun 官方记载:qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 随着实际生产项目需求越来越多,项目体积也会越来越壮大,而每次初加载项目时需要加载全部的功能。效率比较低下。qiankun的使用场景之一就是在实际项目的开发过程中,将一个项目分解成多个子应用,(只有到访问到该模块时)再按需加载子应用。还有一种使用场景是,如果你的公司先前维护了一个项目,项目的功能模块都是前人写的(可能之前的技术栈比较旧),可能使用的

星海拾遗 1795

Python 中调用 R 语言的教程(包含编码问题解决办法)

rpy2 是一个 Python 库,允许在 Python 中直接运行 R 代码并实现数据转换。安装需确保 Python 和 R 环境正确配置,Windows 用户需注意编码问题(GBK 错误可通过控制面板调整区域设置解决)。基本用法包括执行 R 代码、传递数据(支持 Python 与 R 数据类型自动转换)以及调用 R 包函数。通过 robjects.r() 执行 R 代码,使用 pandas2ri 转换器处理 DataFrame 数据交换,并支持像导入 Python 模块一样加载 R 包(如 import

zygalaxy的博客 996

qiankun微应用之间、主微应用之间相互跳转方式总结与实践

qiankun 主子应用、子应用间跳转方案

qq_41885295的博客 2万+

YOLOv8 TensorRT C++部署实战详解:从XMake构建到推理流水线

本项目实现了一个基于YOLOv8和TensorRT的高性能火灾烟雾检测系统,具有以下核心特点: 技术架构:采用TensorRT 8.6+进行GPU加速推理,结合CUDA 12.1和OpenCV 4.8+,实现高效计算机视觉处理。系统使用XMake替代CMake构建,配置更简洁高效。

hscing的博客 1066

【AI智能体】基于OpenCode 搭建Skills环境与项目实战开发详解

基于OpenCode 搭建Skills环境与项目实战开发详解

congge 8901

微前端框架篇一,了解qiankun

微前端是一种将复杂单体应用拆分为多个小型独立前端应用,然后将这些小应用按需加载并集成到主应用的技术方案。每个子应用都有自己的 JavaScript 和 CSS 代码。单页Web应用(single page web application,SPA),就是只有一张Web页面的应用。所有页面都来回在这张页面上切换。所以很容易暴漏出来单页面应用的两个缺点。单页面SPA的两种路由形式:Hash与History本质区别:Hash:锚点。通过锚点跳到对应位置History:History栈。

Dormiveglia-flx的博客 2341

DeepSeek与YOLO融合技术的微信小程序实现方案

本文介绍了一个基于微信小程序和Flask后端的智能图像检测系统。系统采用DeepSeek-7B进行自然语言理解,YOLOv8执行目标检测,并通过融合验证模块确保结果准确性。核心流程包括:用户通过小程序上传图片和文本需求,后端解析意图后执行目标检测,最后验证并返回结果。关键技术包括DeepSeek的指令理解、动态阈值调整和模型优化(ONNX、TensorRT)。系统适用于工业质检等场景,如"检测表面划痕",能自动识别目标并验证结果。部署需GPU服务器,并包含安全机制保障系统稳定运行。

老郑的博客 274

qiankun 常见问题集合(一)

qiankun 常见问题集合(一) loader.js:220 Uncaught (in promise) Error: [qiankun] You need to export lifecycle functions in app4 entry 答: 此问题由于微应用中没有暴漏qiankuan的生命周期;需要在微应用工程中加入相关的生命周期函数;具体位置应为微应用中webpack的entry 值指向的js文件中添加即可; export async function bootstrap() {

1万+

华为MetaERP PTP采购到应付全流程解析

摘要:本文系统解析华为MetaERP中的PTP(采购到应付)全流程管理方案,涵盖从采购申请到付款执行的完整业务流程。文章详细分解了PR、PO、GR、IV、AP等关键环节的财务核算规则,并提供了预算校验、库存更新等Python代码示例。同时阐述了IT落地架构设计,包括会计引擎配置、系统集成方案及银企直连支付接口实现。该方案通过三单匹配自动化和智能会计引擎,将处理效率提升10倍(200笔/人天→2000笔/人天),实现98%的自动化率,为集团企业提供了高效的数字化财务管理样板。文中所有技术方案均需根据实际场景调

金牌架构师 1743

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

10道高频Qiankun微前端面试题快问快答_微前端qiankun面试题

qiankun 是一个基于 single-spa 的微前端实现库,可以帮助我们将多个独立的前端应用整合成一个整体,并且可以独立开发、独立部署、独立运行。

2401_89191757的博客 1739

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

qiankun微前端方案实践

关于微前端及qiankun,网上已有大量文章详细介绍了,本文不做赘述,只是附上根据不同侧重点介绍的文章链接。 官方文档 qiankun官方文档 技术细节及原理介绍 可能是你见过最完善的微前端解决方案 vue实践指导 基于qiankun的微前端接入笔记 qiankun 微前端方案实践及总结 下面主要记录一下我在实际开发过程中遇到的问题和解决问题的方案 实际问题 qiankun加载样式表不完整,导致主应用与子应用来回切换时样式丢失。 我们的项目主应用是一个比较完整的项目,后来需要增加一块功能且这块功能需要单

weixin_42114053的博客 1026

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

qiankun 面试题

1、实现原理深入解析微前端乾坤原理 - 知乎 2、解决跨域主子应用间路由跳转、微应用如何设置跨域访问、各生命周期钩子如何执行 3、脚本隔离-一种是快照拷贝的方式,一个是基于proxy的方式 深入解析微前端乾坤原理 - 知乎 4、样式隔离-域隔离和shadow dom深入解析微前端乾坤原理 - 知乎 ...

weixin_40918145的博客 3768

微前端的使用和注意事项 - qiankun

微前端架构旨在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用(Frontend Monolith)后,随之而来的应用不可维护的问题。

DarinZanya的博客 599

vue2使用qiankun框架笔记

本篇文章是针对vue项目巨石应用,对qiankuan框架的一份使用归纳,中间会记录一些遇到的问题和解决方案,如果喜欢自己探索的同学,也可以自行前往qiankun官网学习。同时也欢迎各位同学在评论区,说明自己遇到的问题,一同探讨。

qq_39055970的博客 2162

微前端qiankun的使用说明

项目结构:主应用React + 微应用React1 + 微应用VUE2(vue版本2) + 微应用VUE3(vue版本3)+ 微应用HTML + 微应用vite项目。setGlobalState:设置globalState,设置新值时,内部会做浅检查,如果监测到globalState的值发生变化,会通知所有的观察者。qiankun存在一个主应用及一个或多个微应用,主应用和微应用不限技术栈。启动主应用的同时也需要启动微应用,否则点击跳转微应用会报错。entry.js基于jq,需要在entry前引入jq。

weixin_43933574的博客 1202

最新10道高频Qiankun微前端面试题快问快答_微前端qiankun面试题,完美收官

小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

2401_84413092的博客 1395

10道高频Qiankun微前端面试题快问快答

在面试过程中,面试官通常会使用快问快答的方式来快速评估面试者的基础知识、思维能力和反应速度。来一起看一下Qiankun微前端的高频面试题!

前端啤酒屋 3203

前端微服务qiankun基础使用

qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。

duansamve的博客 4991

【qiankun+vue】微前端子应用之间的通信方式总结

应用qiankun的actions共享全局状态实现子应用间的通信

qq_41885295的博客 8073
上一篇: Claude 结合 spec-kit 使用指南
下一篇: TypeScript 01:类型注解与类型推断
ZoeLandia
博客等级 码龄6年 734粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值