qiankun微前端vue3+ts+vite(配置示例)

qiankun微前端vue3+ts+vite配置示例

// 主应用

main.ts

// 注册子应用
registerMicroApps([
  {
    name: 'sub_ANALYTICS_APM_SEARCH',
    entry: 'http://localhost:7101/', // 子应用地址
    container: '#sub-container', // 子应用挂载容器
    activeRule: '/controller/#/location=ANALYTICS_APM_SEARCH', // 路由匹配规则
    props: {
      msg: '我是来自主应用的值-vue' // 主应用向微应用传递参数
    },
  }
])

// 启动 qiankun
start()

// router结构

  {
    path: '/controller',
    component: Controller,
    name: 'Contoller',
    children: [
           {
            path: 'ANALYTICS_APM_SEARCH',
            name: 'sub_ANALYTICS_APM_SEARCH',
            component: () => import('@/app/view/Analyse/APMSearch/index.vue'),
            alias: '/location=ANALYTICS_APM_SEARCH',
            props: (route) => ({
              timeRange: route.query.timeRange,
            }),
          },
     ]
  }

//@/app/view/Analyse/APMSearch/index.vue 文件

<template>
    <div id="sub-container"></div>
</template>

子应用

// vite.config.ts

// 子应用的vite.config.ts
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import qiankun from 'vite-plugin-qiankun';
import path from 'path';



export default defineConfig({
  plugins: [
    vue(),
    qiankun('sub_ANALYTICS_APM_SEARCH', {
      useDevMode: true,  // 使用开发模式
    }),
  ],
  base: '/location=ANALYTICS_APM_SEARCH',  // 子应用的基础路径
  server: {
    port: 7101,  // 子应用的端口
    cors: true,  // 开启跨域
    headers: {
      'Access-Control-Allow-Origin': '*',
    },
  },
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
    },
  },
  build: {
    rollupOptions: {
      output: {
        format: 'umd',  // 构建为umd格式
        name: 'sub_ANALYTICS_APM_SEARCH',  // 设置全局变量名称
      },
    },
  },
});

// main.ts

// 子应用的main.ts
import { createApp } from 'vue';
import App from './App.vue';
import './style.css'
import { renderWithQiankun, qiankunWindow } from "vite-plugin-qiankun/dist/helper"
import router from './router/index';


let app: any;

if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
  createApp(App).use(router).mount("#sub-container");
} else {
  renderWithQiankun({
    mount(props:any) {
      // 传递的值可以获取到了
      app = createApp(App)
      
      app.use(router)
      app.mount(
        props.container
          ? props.container.querySelector("#sub-container")
          : document.getElementById("sub-container")
      );
    },
    bootstrap() {
      console.log("--bootstrap");
    },
    update(props:any) {
      console.log("--update", props);
    },
    unmount() {
      console.log("--unmount");
      app?.unmount();
    },
  });
}

// router

// src/router/index.ts
import { createRouter, createWebHashHistory } from 'vue-router'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import('../views/Home.vue')
  }
]

const router = createRouter({
  history: createWebHashHistory('/controller'), // ✅ 使用 hash 路由
  routes
})


router.beforeEach((to, from, next) => {
  console.log('导航到:', to.fullPath)
  next()
})
export default router

访问路径

http://localhost:8080/controller/#/location=ANALYTICS_APM_SEARCH?timeRange=last_1_hour.BEFORE_NOW.-1.-1.60

参考资料中未提及在vue3+ts+vite项目使用qiankun微服务时主应用和子应用数据传递的方法。一般而言,在qiankun微服务架构里,主应用和子应用数据传递可借助以下常见方法: ### 主应用向子应用传递数据 主应用可在注册子应用时,通过 `props` 向子应用传递数据。示例代码如下: ```typescript // 主应用中注册子应用 import { registerMicroApps, start } from &#39;qiankun&#39;; registerMicroApps([ { name: &#39;sub-vite&#39;, // 子应用名称 entry: &#39;//localhost:3002&#39;, // 子应用入口 container: &#39;#sub-app-container&#39;, // 子应用挂载节点 activeRule: &#39;/sub-vite&#39;, // 子应用激活规则 props: { dataFromMain: &#39;这是主应用传递给子应用的数据&#39;, // 还可以传递更多数据或方法 callbackFromMain: (message: string) => { console.log(&#39;子应用传来的消息:&#39;, message); } } } ]); start(); ``` 子应用接收主应用传递的数据: ```typescript // 子应用中接收数据 import { useMicroAppStateActions } from &#39;qiankun&#39;; export default { setup() { const { onGlobalStateChange, setGlobalState } = useMicroAppStateActions(); onGlobalStateChange((state, prev) => { // state 是最新的全局状态 console.log(&#39;主应用传来的数据:&#39;, state.dataFromMain); }, true); return {}; } }; ``` ### 子应用向主应用传递数据 子应用可通过 `setGlobalState` 方法向主应用传递数据: ```typescript // 子应用中向主应用传递数据 import { useMicroAppStateActions } from &#39;qiankun&#39;; export default { setup() { const { onGlobalStateChange, setGlobalState } = useMicroAppStateActions(); const sendDataToMain = () => { setGlobalState({ dataFromSub: &#39;这是子应用传递给主应用的数据&#39; }); }; return { sendDataToMain }; } }; ``` 主应用接收子应用传递的数据: ```typescript // 主应用中接收子应用数据 import { registerMicroApps, start, initGlobalState } from &#39;qiankun&#39;; const initialState = {}; const actions = initGlobalState(initialState); actions.onGlobalStateChange((state, prev) => { // state 是最新的全局状态 console.log(&#39;子应用传来的数据:&#39;, state.dataFromSub); }); registerMicroApps([ // 子应用配置 ]); start(); ``` ### 全局状态管理 使用 `initGlobalState` 初始化全局状态,主应用和子应用都能访问和修改该全局状态: ```typescript // 主应用中初始化全局状态 import { registerMicroApps, start, initGlobalState } from &#39;qiankun&#39;; const initialState = { sharedData: &#39;这是全局共享数据&#39; }; const actions = initGlobalState(initialState); registerMicroApps([ // 子应用配置 ]); start(); ``` 主应用和子应用都可以监听和修改全局状态: ```typescript // 主应用或子应用中监听和修改全局状态 import { useMicroAppStateActions } from &#39;qiankun&#39;; export default { setup() { const { onGlobalStateChange, setGlobalState } = useMicroAppStateActions(); onGlobalStateChange((state, prev) => { console.log(&#39;全局状态变化:&#39;, state.sharedData); }, true); const updateGlobalState = () => { setGlobalState({ sharedData: &#39;更新后的全局共享数据&#39; }); }; return { updateGlobalState }; } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值