首页 > 其他分享 >vue3+vite5+qiankun结合vite-plugin-qiankun插件,搭建微前端框架

vue3+vite5+qiankun结合vite-plugin-qiankun插件,搭建微前端框架

时间:2024-10-20 13:16:57浏览次数:3  
标签:插件 vue plugin qiankun 应用 router import vite

没有特别的幸运,那么就特别的努力!!!

前言

涉及到环境

npm:9.6.3
node:19.9.0
node官网地下载址:https://nodejs.org/dist

项目框架

主应用:vue2
微应用1:vue2,qiankun官网API是基于vue2+webpack。
微应用2:vue3+vite+ts,目前官网没有vue3示例,需要介入vite-plugin-qiankun插件进行处理
下面是用qiankun简易搭建的demo效果图:
在这里插入图片描述

主应用

第一步:安装qiankun

$ yarn add qiankun # 或者 npm i qiankun -S

第二步:主应用中注册微应用

import Vue from 'vue'
import App from './App.vue'
import router from './router'

import { registerMicroApps, start } from 'qiankun' //新增部分,导入qiankun中的两个方法
const apps = [
    {
        name: 'vue2App', //子应用的名称
        entry: 'http://192.168.1.12:8083/#/', //子应用的域名,改成自己对应的ip即可
        container: '#vue', //承载子应用的容器,在上面App.vue中定义
        activeRule: '/vue', // 被激活的子应用的路由
    },
    {
        name: 'vue3App', //子应用的名称
        entry: 'http://192.168.1.12:8089/#/', //子应用的域名
        container: '#vue', //承载子应用的容器,在上面App.vue中定义
        activeRule: '/main', // 被激活的子应用的路由
    },
]
registerMicroApps(apps); //注册子应用
start(); //启动qiankun

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

微应用

微应用1:vue2+webpack

微应用分为有 webpack 构建,需要做的事情如下:

步骤说明
1新增 public-path.js 文件,用于修改运行时的 publicPath。
2微应用建议使用 history 模式的路由,需要设置路由 base,值和它的 activeRule 是一样的。
3在入口文件最顶部引入 public-path.js,修改并导出三个生命周期函数。
4修改 webpack 打包,允许开发环境跨域和 umd 打包。

1.在 src 目录新增 public-path.js:

if (window.__POWERED_BY_QIANKUN__) {
  __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}

2.微应用建议使用 history 模式的路由,需要设置路由 base,值和它的 activeRule 是一样的。

import Vue from 'vue'
import VueRouter from 'vue-router'
import home from '../view/home.vue'
import '../public-path'

Vue.use(VueRouter)

const routes = [{
        path: '/home',
        name: 'home',
        component: home
    },
    {
        path: '/Dome',
        name: 'Dome',
     
        component: () =>
            import ( /* webpackChunkName: "about" */ '../view/About.vue')
    }
]

const router = new VueRouter({
    mode: 'history',
    base: window.__POWERED_BY_QIANKUN__ ? '/vue' : '/',
    routes
})

export default router

3.在入口文件最顶部引入 public-path.js,修改并导出三个生命周期函数。

import 'babel-polyfill'
import 'core-js/stable'
import 'regenerator-runtime/runtime';
require('es6-promise').polyfill()
import Vue from 'vue'
import App from './App.vue'
import router from './router'
// import store from './store'

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

Vue.config.productionTip = false

let instance = null;

function render(props = {}) {
    const { container } = props;
    instance = new Vue({
        router,
        // store,
        render: h => h(App),
    }).$mount(container ? container.querySelector('#app') : '#app');
}
export async function mount(props) {
    render(props);
}

//判断当前运行环境是独立运行的还是在父应用里面进行运行,配置全局的公共资源路径
if (window.__POWERED_BY_QIANKUN__) {
    __webpack_public_path__ = window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__;
}
//如果是独立运行window.__POWERED_BY_QIANKUN__=undefined
if (!window.__POWERED_BY_QIANKUN__) {
    render()
}
//最后暴露的三个方法是固定的,加载渲染以及销毁
export async function bootstrap() {}
// export async function mount(props){
//     render();
// } 
export async function unmount() {
    instance.$destroy();
}
export async function update(props) {
      console.log('update props', props);
}

4.修改 webpack 打包,允许开发环境跨域和 umd 打包。

// vue.config.js
module.exports = {
  lintOnSave: false,
  devServer: {
      port: 8083,
      headers: {
          "Access-Control-Allow-Origin": "*"
      }
  },
    transpileDependencies: ['*'], 
    configureWebpack: config => {
        config.entry.app = ['babel-polyfill', './src/main.js']
        return {
            output: {
                library: 'vueApp',
                libraryTarget: 'umd'
            }
        }
    }
}

微应用2:vue3+vite5

1.qiankun目前不支持vite,需要借助插件vite-plugin-qiankun

npm install vite-plugin-qiankun

2.修改vite.config.js配置

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import qiankun from 'vite-plugin-qiankun'
// useDevMode 开启时与热更新插件冲突
const useDevMode = true // 如果是在主应用中加载子应用vite,必须打开这个,否则vite加载不成功, 单独运行没影响

// https://vite.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    qiankun('vue3App', { // 微应用名字,与主应用注册的微应用名字保持一致
      useDevMode
    })
  ],
  base: '/main/',
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  server: {
    host: "0.0.0.0",
    port: 8889, //这里的端口是必须和父应用配置的子应用端口一致
    headers: {
        //因为qiankun内部请求都是fetch来请求资源,所以子应用必须允许跨域
        'Access-Control-Allow-Origin': '*'
    },
    overlay: {
        warning: false,
        errors: false
    }
  },
  configureWebpack: {
    output: {
      library: `vue3App`,
      libraryTarget: 'umd', // 把微应用打包成 umd 库格式
      // jsonpFunction: `webpackJsonp_${name}`, // webpack 5 需要把 jsonpFunction 替换成 chunkLoadingGlobal
    },
  },
})

3.路由配置

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import {
  qiankunWindow,
} from 'vite-plugin-qiankun/dist/helper'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  base: qiankunWindow.__POWERED_BY_QIANKUN__ ? '/main' : '/',
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeView
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (About.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import('../views/AboutView.vue')
    }
  ]
})

export default router

4.修改main.js

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import { renderWithQiankun, qiankunWindow} from 'vite-plugin-qiankun/dist/helper'

let instance = null

function render(props = {}) {
  instance = createApp(App) // 必须放到函数里面,否则会提示重新创建
  const { container } = props

  instance.use(router)
  //   instance.use(store);
  instance.mount(
    container ? container.querySelector('#app') : document.getElementById('app')
  )
  if (qiankunWindow.__POWERED_BY_QIANKUN__) {
    console.log('我正在作为子应用运行')
  }
}
// some code
renderWithQiankun({
  mount(props) {
    console.log('viteapp mount')
    render(props)
  },
  bootstrap() {
    console.log('bootstrap')
  },
  unmount(props) {
    console.log('vite被卸载了')
    instance.unmount()
    // instance._container.innerHTML = ''
    // history.destroy() // 不卸载  router 会导致其他应用路由失败
    // instance = null
  }
})

if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
  render({})
}

完整代码

https://gitee.com/hammer1010_admin/qiankun-cro.git

希望能帮助到大家,同时祝愿大家在开发旅途中愉快!!!

拿着 不谢 请叫我“锤” !!!

标签:插件,vue,plugin,qiankun,应用,router,import,vite
From: https://blog.csdn.net/hammer1010/article/details/143081780

相关文章

  • Artistic Oil Paint 艺术油画着色器插件
    只需轻轻一点,即可将您的视频游戏转化为艺术品!(也许更多…)。✓整个商店中最可配置的选项。✓六种先进算法。✓细节增强算法。✓完整的源代码(脚本和着色器)。✓包含在“艺术包”中。......
  • lua插件之----【luaString 字符串类】
    API列表 接口原型说明luaString.left(str,num)获取字符串左侧指定数量的字符luaString.right(str,num)获取字符串右侧指定数量的字符luaString.mid(str,pos,num)获取字符串指定起始位置后的几个字符luaString.lTrim(str,filterStr)去掉字符串左侧指定......
  • WORD-word安装代码高亮插件
    通过百度网盘分享的文件:SyntaxHighlighter4Word.zip链接:https://pan.baidu.com/s/1bprv6h-Rex_S2AJERsHacQ提取码:sky1借鉴:http://www.xyjys.com/article/20141019/25409.html                                ......
  • AI绘画:2024最全面的ComfyUI插件与Lora的下载及使用!
    前言本节我们介绍ComfyUI插件和Lora的下载及使用方式。1.安装1.1Checkpoint安装将从前面介绍的模型下载平台下载后,放在ComfyUI/models/checkpoints文件夹下。1.2Lora安装在前面介绍的模型下载网站下载Lora模型,然后放在ComfyUI/models/loras文件夹下。所有的AI设......
  • ArcGIS无插件加载(无偏移)在线天地图高清影像与街道地图指南
    在地理信息系统(GIS)的应用中,加载高清影像与街道地图对于地图制图、影像查阅、空间数据分析等工作至关重要。天地图作为官方出品的地图服务,以其标准的数据、较快的影像更新速度等特点受到广泛欢迎。以下是如何在ArcGIS中无插件加载(无偏移)天地图高清影像与街道地图的具体步骤。......
  • GhostDoc Enterprise.v2024.1.24160 for Visual Studio 2022插件漏洞分析和离线解锁方
      先安装,然后直接使用dnspy调试VisualStudio2022,以GhostdocPro的注册对话框作为突破口进行调试。经过一些调试可以比较轻松的发现关键点在SubMain.GhostDoc.Services.clr4.dll中,你可以通过everything在vs的插件目录中找到这个dll所在位置,其它版本的VisualStudio的方法是类似......
  • 模块联邦-vite-plugin-federation
    主应用"@originjs/vite-plugin-federation":"^1.3.6"vite.config.tsbuild:{emptyOutDir:false,chunkSizeWarningLimit:1000,minify:false,cssCodeSplit:!pluginOption.isUnionSub,//sccscopedtarget:[&quo......
  • 【AI绘画】Stable Diffusion实战ControlNET插件(让小姐姐摆出你要的pose!)
    大家好我是安琪!SD插件ControlNET的诞生,无法自定义姿势成为过去,自定义姿势;根据线稿、骨骼、其他图片生成全新的图,AI绘图自主可控;包括边缘检测,深度信息估算;姿态,手势检测;分割等等场景:个人pose图,模特换装;装修出图;设计草图快速复原;颜色快速更换等等此扩展用于AUTOMATIC1111的......
  • ComfyUI 节点、插件的基本指南(附整合包)
    ComfyUI是一个多功能的StableDiffusion图像/视频生成工具,能够让开发者设计并实现自定义节点,扩展功能。如果你有特定的任务想实现并需要创建一个自定义节点,本指南会带你一步步完成ComfyUI自定义节点的创建过程。开始前的准备在开始创建自定义节点之前,确保你有必要的工......
  • cargo deny 插件
    cargodeny2024-10-18插件Rust它专门用于帮助Rust开发者检查项目依赖项的安全性、许可证合规性、多版本依赖管理等.执行cargodenycheck启用检查.deny.toml文件基本配置:#关于advisories部分的更多文档可以在这里找到:#https://embarkstudios.github.io/cargo-d......