vue3+vite+qiankun实现微应用

news2024/12/23 18:31:57

主应用

1、安装qiankun

npm install qiankun

2、在主应用中创建微应用的入口文件 src\views\micro\index.vue

这个文件主要是用来提供一个 DOM 节点挂载微应用

<template>
  <div class="xin">
    <p>qiankun入口文档</p>
    <div id="qiankun-container"></div>
    <!--xinHome 为放置子项目的盒子  -->
  </div>
</template>

<!-- <script>
import { loadMicroApp, start } from 'qiankun'; //引入手动调用方法

export default {
  name: 'XinVue2',
  data() {
    return {};
  },
  created() {
    this.$nextTick(() => {
      // hash模式下配置
      const getActiveRule = hash => location => location.hash.startsWith(hash);
      this.vueApp = loadMicroApp({
        name: 'qiankun-children',
        entry: '//localhost:8081/',
        container: '#xinHome',
        activeRule: getActiveRule('#/'),
      });
      //启动乾坤函数
      start({ singular: false });
    });
  },
  beforeDestroy() {
    console.log(this.vueApp.unmount({ name: 'qiankun-children' }));
    this.vueApp.unmount({ name: 'qiankun-children' });
  },
  methods: {},
};
</script> -->

3、配置乾坤路由router/index.js

      {
        // 匹配所有其他路由
        path: '/:pathMatch(.*)*',
        name: 'micro',
        component: () => import('@/views/micro/index.vue'),
      },

4、新建qiankun配置页src\micro-apps\index.ts

import { registerMicroApps, start } from 'qiankun';
import NProgress from 'nprogress'
import "nprogress/nprogress.css";
// 加载动画
const setLoadingLoader = (loading: boolean) => {
  if (loading) {
    NProgress.start()
  } else {
    NProgress.done()
  }
}
// 子应用
const microApps = [
  {
    name: 'qiankun-children',
    entry: '//localhost:3001',
    activeRule: '/qiankun-one'
  }
]
// 生命周期处理
const lifeCycles = {
  beforeLoad: (app: any) => {
    console.log("before load app.name====>>>>>", app.name)
    return Promise.resolve(app)
  },
  beforeMount: (app: any) => {
    console.log("before mount app.name====>>>>>", app.name)
    return Promise.resolve(app)
  },
  afterMount: (app: any) => {
    console.log("after mount app.name====>>>>>", app.name)
    return Promise.resolve(app)
  }
}
// 子应用处理
const normalizeMicroApp = (apps = []) => {
  return apps.map((app: any) => ({
    container: '#qiankun-container',
    loader: setLoadingLoader,
    ...app
  }))
}
const register = () => registerMicroApps(normalizeMicroApp(microApps), lifeCycles)
export default {
    register,
    start
}

5、main.js中引入qiankun配置页

import microApps from './micro-apps';
microApps.register();
microApps.start();

6、app.vue中放入微应用的入口文件

<template>
  <router-view />
  <section id="qiankun-container"></section>
</template>
<script>
import { start } from 'qiankun';
export default {
  mounted() {
    if (!window.qiankunStarted) {
      window.qiankunStarted = true;
      start();
    }
  },
};
</script>

<style>
html,
body,
#app {
  width: 100%;
  height: 100%;
}
</style>

7、主应用调用微应用页面路由

http://localhost:2888/qiankun-one/back

在这里插入图片描述

微应用

1、微应用安装vite-plugin-qiankun

npm install vite-plugin-qiankun

1、vite.config.ts配置

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import qiankun from "vite-plugin-qiankun";

export default defineConfig({
  plugins: [
    vue(),
    // 需要在这里注册子应用名称,
    qiankun("qiankun-children", {
      useDevMode: true,
    }),
  ],
  server: {
    port: 3001,
    cors: true, // 需要开启跨域!
  },
});

2、main.ts配置

import { createApp } from 'vue'
import { createRouter, createWebHistory } from 'vue-router';
import { renderWithQiankun, qiankunWindow } from "vite-plugin-qiankun/dist/helper"
import App from './App.vue'
import routes from "./router";
let router = null;
let instance: any = null;
let history: any = null;
function render(props = {}) {
    const { container } = props;
    //名字需要和主应用的入口名字对的上
    history = createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/qiankun-one' : '/');
    router = createRouter({
        history,
        routes,
    });
    instance = createApp(App);
    instance.use(router);
    instance.mount(container ? container.querySelector('#app') :document.getElementById("app"));
    if (qiankunWindow.__POWERED_BY_QIANKUN__) {
        console.log('我正在作为子应用运行')
    }
}
renderWithQiankun({
    bootstrap() {
        console.log('sub app one bootstrap')
    },
    mount(props) {
        console.log('sub app one mount')
        render(props);
    },
    update() {
        console.log('sub app one update')
    },
    unmount(props) {
        console.log('sub app one unmount')
        instance.unmount();
        instance._container.innerHTML = '';
        history.destroy();
        router = null;
        instance = null;
    }
});
if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
    render();
}

3、页面配置

在这里插入图片描述

3.1 HomeComponent.vue
<template>
  <div>
    我是HomeComponent
    <router-link to="/back">前往BackHome</router-link>
  </div>
</template>
 
<script>
export default {
  name: "HomeComponent",
}
</script>
 
<style scoped>
 
</style>
3.2 BackHome.vue
<template>
  <div>
    我是BackHome
    <router-link to="/">回到HomeComponent</router-link>
    //这个to="/"是router中配置的HomeComponent的地址
  </div>
</template>

<script>
export default {
  name: "BackHome",
};
</script>

<style scoped></style>

4、路由配置 router/index.ts

const routes = [
  {
    path: "/",
    name: "HomeComponent",
    component: () => import("../view/HomeComponent.vue"),
  },
  {
    path: "/back",
    name: "BackHome",
    component: () => import("../view/BackHome.vue"),
  },
];
export default routes;

主应用使用微应用页面路由跳转

http://localhost:2888/qiankun-one/back

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型水印

来源&#xff1a;ICML-2024 题目&#xff1a;Token-Specific Watermarking with Enhanced Detectability and Semantic Coherence for Large Language Models 参考文献格式&#xff1a;Huo, M., Somayajula, S.A., Liang, Y., Zhang, R., Koushanfar, F. &amp; Xie, P.. …

一文2000字从0到1详解requests接口自动化测试!

前言 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 1、理解什么是接口 接口一般来说有两种…

【JaveEE】——(手把手教你)用IDEA手搓一个定时器Timer

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能够帮助到你&#xff01; 目录 一&#xff1a;什么是定时器 二&#xff1a;IDEA中的定时器Timer 1&#xff1a;实例化Timer 2&#…

C语言-动态内存分配讲解

目录 ✨1.什么是动态内存分配 &#x1f495;2.动态内存开辟函数 malloc ✨3.malloc函数的检查&#xff08;两种方法&#xff09; &#x1f495;4.动态内存释放函数 free ✨5.free 函数接收空指针 ✨6.为什么要释放动态内存 &#x1f495;7.动态内存开辟函数calloc &#…

免杀笔记 ---> 一种有想法的Indirect-Syscall

今天来分享一下&#xff0c;看到的一种Indirect-Syscall&#xff0c;也是两年前的项目了&#xff0c;但是也是能学到思路&#xff0c;从中也是能感受到杀软对抗之间的乐趣&#xff01;&#xff01;说到乐趣&#xff0c;让我想起看到过一位大佬的文章对"游褒禅山记"的…

学习RocketMQ

RocketMQ是一个分布式消息和流平台&#xff0c;它被设计为具有简单和可复制的架构&#xff0c;同时具有高性能和高可靠性。以下是RocketMQ从入门到精通的一些关键概念和示例代码。 1、安装和启动RocketMQ 1.1、下载并解压RocketMQ二进制文件。 wget https://archive.apache.…

JavaWeb--08BeanUtils:自定义转换器

在07创建了表单&#xff0c;但是获取网页信息的java代码太繁杂了&#xff0c;每次获取数据都要书写依次如下的&#xff1a; 重新创建一个web工程项目test1010---需要配置tomacat&#xff0c;具体传送门&#xff1a;CSDN 配置好了如下&#xff1a; 在里面web目录下创建一个reg…

JVM 基础知识(基础组成 )

使用场景 线上系统突然宕机,系统无法访问,甚至直接 O0M;线上系统响应速度太慢,优化系统性能过程中发现 CPU 占用过高,原因也许是因为 JVM的 GC 次数过于频繁;新项目上线,需要设置 JVM的各种参数;等 JDK / JRE / JVM JDK JDK 全称 ( Java Development Kit ) &#xff0c;是 Ja…

Git 使用方法

简介 Git常用命令 Git 全局设置 获取Git 仓库 方法二用的比较多 将仓库链接复制 在 git base here ----> git clone 仓库链接 工作区、暂存区、版本库 Git 工作区中文件中的状态 本地仓库的操作 远程仓库操作 git pull 将代码推送到远程仓库 1. git add 文件名 ---放…

C++:继承和多态,自定义封装栈,队列

1.栈&#xff1a; stack.cpp #include "stack.h"Stack::Stack():top(nullptr),len(0){} //析构函数 Stack::~Stack() {while(!empty()){pop();} }bool Stack::empty() //判断栈是否为空 {return topnullptr; }int Stack::size()//获取栈的大小 {return len; } //压…

万字长文详解Java线程知识

什么是进程、线程、协程&#xff1f; 进程 进程是计算机科学中的一个核心概念&#xff0c;它指的是在操作系统中正在执行的一个程序的实例。进程是操作系统中的一个独立执行单元&#xff0c;具有独立的内存空间和系统资源。每个进程都有自己独立的地址空间和文件描述符&#x…

循环神经网络笔记

循环神经网络学习 RNN训练方法–BPTT BPTT &#xff08;Backpropagation Through Time&#xff09;&#xff0c;这是一种用于训练循环神经网络&#xff08;RNNs&#xff09;的算法。由于 RNNs 能够处理序列数据&#xff0c;并且在每个时间步上都有内部状态&#xff0c;因此需…

南京自闭症寄宿学校:打造温馨的第二家

南京自闭症寄宿学校的愿景与广州星贝育园的温馨实践 在探讨自闭症儿童教育的广阔领域中&#xff0c;寄宿制学校以其独特的优势&#xff0c;为这些特殊的孩子提供了全方位的支持与关怀&#xff0c;致力于打造一个温馨如家的第二生活环境。虽然本文的主题是围绕南京自闭症寄宿学…

Chirp通过Sui让IoT世界变得更简单

据估计&#xff0c;未来十年内&#xff0c;联网设备的数量将增长到近400亿台。无论是追踪共享出行车辆的移动、改善食品追溯性、监控制造设施&#xff0c;还是保障家庭安全&#xff0c;物联网 ( Internet of Things&#xff0c;IoT) 对企业和消费者来说都已经成为一项关键技术。…

刷题学习日记 (1) - SWPUCTF

写这篇文章主要是想看看自己一个下午能干啥&#xff0c;不想老是浪费时间了&#xff0c;所以刷多少题我就会写多少题解&#xff0c;使用nss随机刷题&#xff0c;但是今天下午不知道为啥一刷都是SWPUCTF的。 [SWPUCTF 2021 新生赛]gift_F12 控制台ctrlf搜索flag即可&#xff0…

什么是竞争条件?

竞争条件&#xff0c;简单来说就是多个进程同时访问同一个共享资源&#xff0c;导致出现预期结果以外的错误的情况。 出现竞争条件的本质原因是cpu对程序的调度是没有特定规律的&#xff0c;某一时刻cpu处理哪个进程是不确定的。 简单写一个测试程序&#xff0c;先需要子进程和…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

手机轻松解压 RAR 文件指南

手机通常不直接支持 RAR 文件打开&#xff0c;主要有以下几个原因。首先&#xff0c;手机操作系统的设计初衷并非为了处理各种复杂的压缩文件格式。 大多数手机内置的文件管理器主要侧重于管理手机内部存储和常见的文件类型&#xff0c;如图片、音频、视频等。对于像 RAR 这样…

【UR #1】外星人(dp思维技巧)

考虑去除后效性&#xff0c;常用方法排序状态可以直接以答案为状态来判断合法性考虑转移方向&#xff0c;向后转移&#xff0c;选与不选来定向答案 f[i][j]表示前i个数答案为j的方案数 不选i 则加上f[i][j] 的方案数 * &#xff08;n-i&#xff09;,ai可以在后面随便选。 选…

Python 课程20-Scikit-learn

前言 Scikit-learn 是 Python 中最流行的机器学习库之一&#xff0c;它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者&#xff0c;都可以借助它进行快速原型设计和模型开发。 在本教程中&a…