微服务之qiankun主项目+子项目搭建vue2

一、 下载安装"qiankun": “^2.10.13”

参考官网地址

二、 手动调用qiankun,使用vue脚手架搭建的项目

1. 主项目配置(我使用的是手动调用乾坤,在指定页面显示内容)

1. 要使用的页面中引入乾坤

<template>
  <div class="xin">
    <p> 个人项目</p>
     <keep-alive>
      <div id="baixianHome"></div>
    </keep-alive>
    <!--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: {

  }
}

2. router设置

  1. router/index.js文件配置
import Vue from 'vue'
import VueRouter from 'vue-router';
Vue.use(VueRouter)

const router = new VueRouter({
    base: window.__POWERED_BY_QIANKUN__ ? '/qiankun-children/' : '/',  //使用 history模式必须配置
    mode: 'history',
    routes: [
        {
            path: '/xin',
            name: 'xin',
            component: () => import('@/views/xin-vue2/home'),
        }, {
            path: '/mq',
            name: 'mq',
            component: () => import('@/views/mq-vue2/home'),
        }
    ],
});
export default router
  1. main.js配置 引入并使用VueRouter
import VueRouter from 'vue-router';
import router from './router/index'
Vue.config.productionTip = false
Vue.use(VueRouter)
new Vue({
  router,
  render: h => h(App),
}).$mount('#appAdmin')

  1. 文件目录结构
    在这里插入图片描述

2. 子项目配置(我用的hash模式)

1. 在src目录下新建public-path.js文件

__webpack_public_path__ = window.__POWERED_BY_QIANKUN__
  ? window.__INJECTED_PUBLIC_PATH_BY_QIANKUN__
  : `http://localhost:8081/`; // 填写你当前子项目的实际部署地址

1. main.js 配置


import './public-path';//要放最上边
import Vue from 'vue';
import VueRouter from 'vue-router';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';
import store from './store';
import Home from './views/home/index.vue'

Vue.config.productionTip = false;
Vue.use(ElementUI);
Vue.use(VueRouter)
let router = null;
let instance = null;
function render(props = {}) {
  const { container } = props;
  router = new VueRouter({
    scrollBehavior: () => ({ y: 0 }),
    routes:[
      {
        path: '/home',
        name: 'Home',
        component: Home
      }
    ],
  });

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

// 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

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

2. vue.config.js 配置

const { defineConfig } = require('@vue/cli-service')
const packageName = require('./package.json').name;
module.exports = defineConfig({
  transpileDependencies: true,
  devServer: {
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
  configureWebpack: {
    output: {
      library: `${packageName}-[name]`,
      libraryTarget: 'umd',
      chunkLoadingGlobal: `webpackJsonp_${packageName}`,
      publicPath: '/'
    },
  },
})

3. 运行后使用

  1. 先运行主项目在运行子项目

  2. 首页效果
    在这里插入图片描述

  3. 进入调用乾坤页面
    地址:http://localhost:8081/xin#/
    在这里插入图片描述

  4. 使用子项目路由,进入子项目home页面
    地址:http://localhost:8081/xin#/home
    在这里插入图片描述

三、 vue2 旧项目修改成乾坤子项目

1. main.js 配置修改(添加一下)

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

// // 独立运行时
if (!window.__POWERED_BY_QIANKUN__) {
  render();
}

export async function bootstrap() {
  console.log('[vue] vue app bootstraped');
}
export async function mount(props) {
  console.log('[vue] props from main framework', props);
  render(props);
}
export async function unmount() {
  instance.$destroy();
  instance.$el.innerHTML = '';
  instance = null;
  router = null;
}
// 微应用中增加 update 钩子以便主应用手动更新微应用
export async function update(props) {
  render(props);
}

2. router.js 配置修改(添加一下)

在这里插入图片描述

3. 添加vue.config.js 配置

在这里插入图片描述
在这里插入图片描述

4. 运行后使用

在这里插入图片描述
在这里插入图片描述

四、 报错:

1.报错一:static/fonts/element-icons.535877f.woff:1 GET http://localhost:8080/static/fonts/element-icons.535877f.woff net::ERR_ABORTED 404 (Not Found)

static/fonts/element-icons.732389d.ttf:1 GET http://localhost:8080/static/fonts/element-icons.732389d.ttf net::ERR_ABORTED 404 (Not Found)
官网地址跳转

默认情况下沙箱可以确保单实例场景子应用之间的样式隔离,但是无法确保主应用跟子应用、或者多实例场景的子应用样式隔离。当配置为 {
strictStyleIsolation: true } 时表示开启严格的样式隔离模式。这种模式下 qiankun
会为每个微应用的容器包裹上一个 shadow dom 节点,从而确保微应用的样式不会对全局造成影响。
在这里插入图片描述

2. 子项目静态文件报错404

原因是本地调试没找到地址,需要在子项目中配置固定地址,添加如下设置就可以了,具体地址根据自己项目改
在这里插入图片描述

五、 vue3 + vite 旧项目修改成qiankun子项目

— 下载安装插件

npm i vite-plugin-qiankun 或者yarn add vite-plugin-qiankun都不成功再试试其他安装方法

— main.js文件修改

import { createApp,defineAsyncComponent } from 'vue'
import { createPinia } from 'pinia'
import {
  renderWithQiankun,
  qiankunWindow,
  QiankunProps,
} from 'vite-plugin-qiankun/dist/helper'//引入乾坤插件
import App from './App.vue'

import ElementPlus from 'element-plus'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import 'element-plus/dist/index.css';

import router from './router'

const app = createApp(App);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}
const render = (props: QiankunProps = {}) => {
    const { container } = props
    const app2: string | Element = container?.querySelector('#app') || '#app' // 避免 id 重复导致微应用挂载失败
   
    app.use(router)
    app.use(createPinia())
    app.mount(app2)
  }

  const initQianKun = () => {
    renderWithQiankun({
      bootstrap() {
      },
      mount(props) { // 主项目传入数据
        console.log(props)
        render(props)
      },
      unmount(props) {
      },
      update(props) {
      },
    })
  }
  qiankunWindow.__POWERED_BY_QIANKUN__ ? initQianKun() : render() // 判断是否使用 qiankun 

vite.config.ts文件修改

  base: "/wss", //必须和基座也就是主应用的activeRule值一致
  plugins: [
    vue(),
    vueJsx(),
    qiankun("ass", {
      useDevMode: true,
    }),
  ],

路由设置

const router = createRouter({

  history: createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/ass' : '/'),//wbs与子项目名称一样
  routes:  [
    // 质量监督台
    {
      path: '/',
      name: 'home',
      component: () => import('../views/home.vue'),
    },
    ]
  })

主项目添加使用方法

<template>
    <div>
      <p>zgj-个人项目</p>
      <keep-alive>
        <div id="wbome"></div>
      </keep-alive>
    </div>
  </template>
    
  <script>
  import { loadMicroApp, start } from 'qiankun';//引入手动调用方法
  
  export default {
    name: 'ass',//与子项目名称一样
    beforeDestroy() {
      console.log(this.vueApp)
      this.vueApp.unmount({ name: 'ass' });
    },
    created() {
      this.$nextTick(() => {
        this.vueApp = loadMicroApp({
          name: 'ass',//子项目名称
          entry: '//localhost:5173',
          container: '#wbome',
          activeRule: '/wss',//与config文件配置路由一样
        },
        //启动乾坤函数
        start({ singular: false });
      })
    },
    methods: {
    },
    beforeDestroy(){
      console.log( this.vueApp.unmount({ name: 'ass' }))
      this.vueApp.unmount({ name: 'ass' });
    },
    
  }
  
  </script>
  
    

在这里插入图片描述

该项目未上线使用,因此不知道打包后会不会有问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白菜1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值