qiankun(乾坤)-vue-嵌套使用

qiankun(乾坤) Vue 嵌套使用教程
本文介绍了如何在Vue项目中使用qiankun(乾坤)进行应用的嵌套,包括项目A作为主应用,嵌套项目B,项目B再嵌套项目C的实现。主要涉及的文件有各项目的main.js和vue.config.js配置。通过提供的github地址,可以查看详细示例代码。
部署运行你感兴趣的模型镜像

qiankun(乾坤) - Vue - 嵌套使用 — 解决业务场景

目前有项目 A,内部注册了项目 B,项目 B也使用了 qiankun,内部注册了项目 C

项目A — qk-a(主应用)

main.js


import Vue from 'vue'
import App from './App.vue'
import { registerMicroApps, start } from 'qiankun';
import router from './router'
Vue.config.productionTip = false

// 由于本身有window.__POWERED_BY_QIANKUN__参数,sub应用无法判断自己在第几层
// 设置一个全局参数,让sub应用检测到该参数则说明自己作为孙子应用运行
window.__POWERED_BY_QIANKUN_PARENT__ = true // 核心代码
// 常规注册微应用
registerMicroApps([{
  name: 'qk-b',
  entry: '//localhost:8082/',
  activeRule: '/qk-b',
  container: '#qk-b-container', // 子应用挂载的div
},
]);

start();

new Vue({
  router  ,
  render: h => h(App),
}).$mount('#app')

项目B — qk-b

main.js

import { registerMicroApps, start, } from 'qiankun'
import VueRouter from 'vue-router'
import Vue from 'vue'
import App from './App'
Vue.use(VueRouter)
let router = null;
let instance = null;
let flag = false;
function render(props = {}) {
  const { container } = props;
  router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN_PARENT__ ? '/qk-b/' : '/',
    mode: 'history',
    routes:[]
  });
  // 根据业务情况进行实际使用
  // const childRoute = ['/qk-b'];
  // const isChildRoute = path => childRoute.some(item => path.startsWith(item))
  // const rawAppendChild = HTMLHeadElement.prototype.appendChild;
  // const rawAddEventListener = window.addEventListener;
  // router.beforeEach((to, from, next) => {
  //   // 从子项目跳转到主项目
  //   if(isChildRoute(from.path) && !isChildRoute(to.path)){
  //     HTMLHeadElement.prototype.appendChild = rawAppendChild;
  //     window.addEventListener = rawAddEventListener;
  //   }
  //   next();
  // });

  instance = new Vue({
    router,
    render: h => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');

  if(!flag){
  	// 应用B类注册微应用
    registerMicroApps([
      {
        name: 'qk-c',
        entry: 'http://localhost:8083',
        container: '#qk-c-container', // 容器为应用B内部定义
        activeRule: window.__POWERED_BY_QIANKUN_PARENT__ ? '/qk-b/qk-c' : '/qk-c', // 根据在应用A内进行申请的变量进行判断
      }
    ]);
    start();
    flag = true
  }
}

if (!window.__POWERED_BY_QIANKUN_PARENT__) {
  render();
}

export async function bootstrap() {
  console.log('vue app bootstraped');
}

export async function mount(props) {
  render(props);
}

export async function unmount() {
  instance.$destroy();
  instance = null;
  router = null;
}

vue.config.js

const { name } = require('./package.json')

module.exports = {
  configureWebpack: {
    output: {
      library: `${name}-[name]`,
      libraryTarget: 'umd',
      jsonpFunction: `webpackJsonp_${name}`,
    }
  },
  devServer: {
    port: 8082, 
    headers: {
      'Access-Control-Allow-Origin': '*' // 主应用获取子应用时跨域响应头
    }
  }
}

项目C — qk-c

main.js

import './public-path'
import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false
let instance = null
function render(props = {}) {
  const { container } = props;
  instance = new Vue({
    router,
    render: (h) => h(App),
  }).$mount(container ? container.querySelector('#app') : '#app');
}

// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
  render();
}
// 解决加载资源是404的问题
if (window.__POWERED_BY_QIANKUN__) {
  // eslint-disable-next-line no-undef
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

export async function bootstrap() {
  console.log('[vue] vue app bootstraped');
}
export async function mount(props) {
  render(props);
}
export async function unmount() {
  instance.$destroy();
  instance.$el.innerHTML = '';
  instance = null;
}

vue.config.js

// package.json的name需注意与主应用一致
const { name } = require('./package.json')

module.exports = {
  lintOnSave: false,
  configureWebpack: {
    output: {
      library: `${name}`,
      libraryTarget: 'umd',
      jsonpFunction: `webpackJsonp_${name}`,
    }
  },
  devServer: {
    port: 8083,
    headers: {
      'Access-Control-Allow-Origin': '*' // 主应用获取子应用时跨域响应头
    }
  },
}

以上均为核心代码,具体demo可点击以下地址

qiankun-nested-demo - github地址
参考文章

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

### 关于 QiankunVue 2.0 的微前端实现 #### 修改 History Router Base 设置 为了使子应用能够正常工作,在 `router.js` 中需要调整 Vue Router 的配置,确保其路径设置适应主应用环境: ```javascript // router.js import VueRouter from 'vue-router'; const router = new VueRouter({ base: window.__POWERED_BY_QIANKUN__ ? '/app-vue/' : '/', mode: 'history', routes, }); ``` 此段代码通过判断全局变量 `window.__POWERED_BY_QIANKUN__` 来决定路由的基础路径[^3]。 #### 子应用入口文件配置 对于基于 Vue 2.x 构建的应用程序来说,启动逻辑也需要做相应适配。通常是在项目的根组件或 main.js 文件里加入如下代码片段来支持作为独立运行以及被加载到其他应用程序中的两种模式: ```javascript if (window.__POWERED_BY_QIANKUN__) { // 当前是作为子应用被加载的情况下的初始化操作 } else { // 单独启动时执行的操作 } ``` 这段脚本允许同一个Vue实例既可以作为一个完整的单页应用(SPA),也可以无缝集成至QianKun框架下成为其中一个模块化部分[^1]。 #### 使用 Home 组件展示页面内容 在视图层面上,可以创建一个简单的Home.vue模板用于显示特定的信息给用户查看: ```html <!-- views/Home.vue --> <template> <div class="home"> This is a home page in qiankun-main </div> </template> <script> export default {}; </script> ``` 上述HTML结构定义了一个基本的首页布局并将其关联到了对应的JavaScript对象之上[^2]。 #### 注册与导出生命周期钩子函数 为了让宿主机更好地管理和控制各个子系统的状态变化过程,则需向外部暴露一些必要的接口方法供调用者使用。这可以通过注册几个特殊的事件监听器来达成目的: ```javascript function setupAppLifecycle() { return { bootstrap() {}, mount(props) { console.log('props from main app:', props); }, unmount() {} }; } export default setupAppLifecycle(); ``` 这些回调会在不同阶段触发相应的处理流程,从而实现了更加灵活高效的跨域协作机制[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值