微前端qiankun接入Vue和React项目

news2024/10/5 18:26:55

主应用:Vue3+Webpack

1、创建主应用:

npx vue create main-vue3-app

2、安装qiankun

npx yarn add qiankun

3、项目中使用的vue、vue-router、qiankun依赖如下,webpack版本为5.x

4、在根目录下创建vue.config.js

const { defineConfig } = require('@vue/cli-service');
const packageName = require('./package.json').name;
module.exports = defineConfig({
    lintOnSave: false,
    devServer: {
        // 可以在配置中 配置端口 VUE_APP_PORT = 8080
        port: 8080,
        headers: {
            'Access-Control-Allow-Origin': '*' // 允许跨域访问子应用页面
        }
    }
})

5、入口组件App.vue

<template>
  <nav>
    <router-link to="/">Home</router-link> |
    <router-link to="/vue2-webpack-app">wepback+vue2App</router-link> |
    <router-link to="/vue3-vite-app">vite+vue3App</router-link> |
    <router-link to="/vue3-webpack-app">wepback+vue3App</router-link> |
    <router-link to="/react-webpack-app">wepback+reactApp</router-link> 


  </nav>
  <router-view/>
</template>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;
}

nav a {
  font-weight: bold;
  color: #2c3e50;
}

nav a.router-link-exact-active {
  color: #42b983;
}
</style>

6、然后创建微应用对应的路由页面以及注册微应用

router.ts

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'


const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'index',
    component: () => import('../views/Index.vue')
  },
  {
    path: '/vue2-webpack-app/:chapters*',
    name: 'vue2-webpack-app',
    component: () => import('../views/Vue2App.vue')
  },
  {
    path: '/vue3-vite-app/:chapters*',
    name: 'vue3-vite-app',
    component: () => import('../views/ViteApp.vue')
  },
  {
    path: '/vue3-webpack-app/:chapters*',
    name: 'vue3-webpack-app',
    component: () => import('../views/Vue3App.vue')
  },
  {
    path: '/react-webpack-app/:chapters*',
    name: 'react-webpack-app',
    component: () => import('../views/ReactWebpack.vue')
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router

微应用:Vue2+Webpack

1、在主应用下创建对应的路由页面 views/Vue2App.vue

<template>
    <div id="vue2-webpack-app"/>
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'vue2-webpack-app',
        entry: '//localhost:8081/',
        container: '#vue2-webpack-app',
        activeRule: '/vue2-webpack-app',
       
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start();
    }
});
</script>

<style scoped></style>

2、创建vue2+webpack项目,选2.x版本

npx vue create vue2-app

3、项目中使用的vue、vue-router依赖如下,webpack版本为5.x

4、在根目录下创建vue.config.js

const { defineConfig } = require('@vue/cli-service');
const packageName = require('./package.json').name;
module.exports = defineConfig({
    lintOnSave: false,
    devServer: {
        // 可以在配置中 配置端口 VUE_APP_PORT = 8080
        port: 8081,
        headers: {
            'Access-Control-Allow-Origin': '*' // 允许跨域访问子应用页面
        }
    },
    configureWebpack: {
        output: {
            library: `${packageName}-[name]`,
            libraryTarget: 'umd',
            chunkLoadingGlobal: `webpackJsonp_${packageName}`,
        },
    }
})

5、在src根目录下创建public-path.js

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

6、router/index.ts

import Vue from 'vue'
import VueRouter from 'vue-router'
import IndexVue from '../views/Index.vue'

Vue.use(VueRouter)

const routes= [
  {
    path: '/',
    name: 'index',
    component: IndexVue
    // component: () => import( '@/views/Index.vue')

  },
]
console.log(window.__POWERED_BY_QIANKUN__)
const router = new VueRouter({
  mode: 'history',
  base: window.__POWERED_BY_QIANKUN__ ? '/vue2-webpack-app' : '/',
  routes
})

export default router

7.入口文件main.ts/main.js

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

Vue.config.productionTip = false
let instance:any = null;

function render(props:any = {}) {
  const { container } = props
  instance = new Vue({
    name: 'root',
    router,
    render: h => h(App)
  }).$mount(container ? container.querySelector('#app') : '#app')

}
 
if (!window.__POWERED_BY_QIANKUN__) {
  render()
}
/**
* bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
* 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
*/
export async function bootstrap() {
    console.log('vue2+webpack bootstraped');
}
 
/**
* 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
*/
export async function mount(props:unknown) {
    // ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));

    console.log('乾坤子应用容器加载完成,开始渲染 child')
    console.log('props from main mount', props)
    render(props)
}
 
/**
* 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
*/
export async function unmount() {
  instance?.$destroy();

 
}
 
 
/**
* 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
*/
export async function update(props:unknown) {
    console.log('update props', props);
}

微应用:Vue3+Wepback

1、在主应用下创建对应的路由页面 views/Vue3App.vue

<template>
    <div id="vue3-webpack-app"  />
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'vue3-webpack-app',
        entry: '//localhost:8082/',
        container: '#vue3-webpack-app',
        activeRule: '/vue3-webpack-app',
        
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start({
            prefetch:false,
            sandbox:{experimentalStyleIsolation:true}
        });
    }
});
</script>

<style scoped></style>

2、创建vue3+webpack项目,选3.x版本

npx vue create vue3-webpack-app

3、项目中使用的vue、vue-router依赖如下,webpack版本为5.x

4、在根目录下创建vue.config.js

const { defineConfig } = require('@vue/cli-service');
const packageName = require('./package.json').name;
const path = require('path');
module.exports = defineConfig({
    lintOnSave: false,
    devServer: {
        // 可以在配置中 配置端口 VUE_APP_PORT = 8080
        port: 8082,
        headers: {
            'Access-Control-Allow-Origin': '*' // 允许跨域访问子应用页面
        }
    },
    configureWebpack: {
        output: {
            library: `${packageName}-[name]`,
            libraryTarget: 'umd',
            chunkLoadingGlobal: `webpackJsonp_${packageName}`,
        },
        resolve:{
            alias:{
                '@':path.join(__dirname,'src')
            }
        }
    }
})

5、在src根目录下创建public-path.js

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

6、router/index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import IndexView from '../views/Index.vue'

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'index',
    component: IndexView
    // component: () => import('../views/Index.vue')
  }
]

const router = createRouter({
  history: createWebHistory(window.__POWERED_BY_QIANKUN__?'/vue3-webpack-app':process.env.BASE_URL),
  routes
})

export default router

7.入口文件main.ts/main.js

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import './public-path'

let app: any = null
function render(props: any = {}) {
    app = createApp(App)
    const { container } = props
    app.use(router).mount(container ? container.querySelector('#app') : '#app')
}


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

export async function bootstrap() {
    console.log('vue3+webpack bootstraped');
}

/**
* 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
*/
export async function mount(props: unknown) {
    // ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));

    console.log('乾坤子应用容器加载完成,开始渲染 child')
    console.log('props from main mount', props)
    render(props)
}

/**
* 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
*/
export async function unmount() {
    console.log('unmount-------------------')
    app.unmount()
    app = null

}


/**
* 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
*/
export async function update(props: unknown) {
    console.log('update props', props);
}

微应用:Vue3+Vite

1、在主应用下创建对应的路由页面 views/ViteApp.vue

<template>
    <div id="vue3-vite-app"  />
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'vue3-vite-app',
        entry: '//localhost:5173/',
        container: '#vue3-vite-app',
        activeRule: '/vue3-vite-app',
        
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start();
    }
});
</script>

<style scoped></style>

2、创建vue3+vite项目

npx pnpm create vite vue3-vite-app --template vue-ts

3、项目中使用的vue、vue-router依赖如下,vite版本为4.x

4、安装vite-plugin-qiankun插件

npx pnpm add vite-plugin-qiankun

在vite.config.ts使用

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import qiankun from 'vite-plugin-qiankun';
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue() ,qiankun('vue3-vite-app', {
    useDevMode: true
  }),],
 
})

5、router/index.ts

import { createRouter, createWebHistory } from 'vue-router'
import {

  qiankunWindow
} from 'vite-plugin-qiankun/dist/helper';

const router = createRouter({
  history: createWebHistory(qiankunWindow.__POWERED_BY_QIANKUN__ ? '/vue3-vite-app' : '/'),
  routes: [
    {
      path: '/',
      name: 'index',
      component: () => import(/* webpackChunkName: "index" */ '../views/Index.vue')
    }
  ]
})

export default router

6、在src根目录下创建public-path.js

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

7、main.ts



import { createApp } from 'vue'
import './public-path'


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

import {
    renderWithQiankun,
    qiankunWindow
  } from 'vite-plugin-qiankun/dist/helper';
  
  let app:any;
  if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
    createApp(App).use(router).mount('#app');
  } else {
    renderWithQiankun({
      mount(props) {
        console.log('--mount');
  console.log(props)
        app = createApp(App);
        app
          .use(router)
          .mount(
            (props.container
              ? props.container.querySelector('#app')
              : document.getElementById('app')) as Element
          );
      },
      bootstrap() {
        console.log('--bootstrap');
      },
      update() {
        console.log('--update');
      },
      unmount() {
        console.log('--unmount');
        app?.unmount();
      }
    });
  }
  

微应用:React 18+Webpack

1、在主应用下创建对应的路由页面 views/ReactWebpack.vue

<template>
    <div id="react-webpack-app"/>
</template>

<script setup lang="ts">
import { onMounted, ref } from 'vue';
import { registerMicroApps, start } from 'qiankun';

const loading = ref(false);
registerMicroApps([
    {
        name: 'react-webpack-app',
        entry: '//localhost:3000/',
        container: '#react-webpack-app',
        activeRule: '/react-webpack-app',
       
    }
]);
onMounted(() => {
    if (!window['qiankunStarted']) {
        window['qiankunStarted'] = true;
        start();
    }
});
</script>

<style scoped></style>

2、创建React+Webpack项目

npx create-react-app react-app

3、项目中使用的react、react-dom、react-router-dom依赖如下,webpack版本为5.x

4、创建config-overrides.js,修改配置

 npm i react-scripts

修改package.json

5、封装路由组件,src/router/index.js

import React from 'react'

import Home from '../views/home'
// 导入路由依赖
import { Route,Routes} from 'react-router-dom'
 
export default function Router(){
    return (
        // 使用BrowserRouter包裹,配置路由
      <Routes >
        <Route element={<Home/>} path='/'></Route>
      </Routes>
    )
}

6、在App.jsx中引入路由组件

import Router from './router/index'
import './App.css';
function App() {
  return (
    <div>
      <Router></Router>
    </div>
  );
}
export default App;

7、index.js入口

import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom'
import './index.css';
import App from './App';
import './public-path';
import reportWebVitals from './reportWebVitals';
// let root = createRoot(document.querySelector('#root'))
let root = null;
function render (props) {
    const { container } = props;
    root = root || ReactDOM.createRoot(container ? container.querySelector("#root") : document.getElementById("root") );
    root.render(
        <BrowserRouter basename={window.__POWERED_BY_QIANKUN__ ? "/react-webpack-app" : "/"}>
            <React.StrictMode>
                <App />
            </React.StrictMode>
        </BrowserRouter>
    );
}

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

export async function bootstrap () {
    console.log("[react18] react app bootstraped");
}

export async function mount (props) {
    console.log("[react18] props from main framework", props);
    render(props);
}

export async function unmount (props) {
    root.unmount();
    root = null;
}


reportWebVitals();

演示:

待上传

完整代码:

待上传

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

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

相关文章

一张逻辑图讲清楚OS在做什么:浅谈OS

本文旨在通过思维导图的方式、对os主要的知识点简短介绍&#xff0c;让读者能短时间快速把os是什么、干什么给串起来。当别人问起来时&#xff0c;可以用3-5分钟讲清楚。如果读者对os有更加深入的兴趣&#xff0c;可点对点针对某一内容再做进一步研究。通常对于互联网从业者来说…

TSINGSEE青犀老旧小区升级改造AI+视频监控方案

一、背景与需求 近年来&#xff0c;政府高度重视城镇老旧小区改造工作&#xff0c;强调要加快老旧小区改造&#xff0c;不断完善城市管理和服务&#xff0c;彻底改变粗放型管理方式&#xff0c;让人民群众在城市生活得更方便、更舒心、更美好。老旧小区升级改造面临以下问题&a…

绿米Aqara S1【妙控开关 S1E】的破解方法

概述 为了更好地向友商学习,我们采购了绿米的一块妙控开关 S1E的屏幕,用来研究。 首先上图看一下他的设计及推广的说明: 产品详情,参见Aqara的官方网站: 具体链接:妙控开关 S1E|Aqara 全屋智能 硬件概要 这里我就直接上硬件的说明了。 官方的设备参数如下: 我来写…

SRS srs-bench

1 srs-bench 音视频压测工具&#xff0c;包括RTMP/FLV/WebRTC/GB28181等&#xff0c;未来还会完善。 SB(SRS Bench) is a set of benchmark and regression test tools, for SRS and other media servers, supports HTTP-FLV, RTMP, HLS, WebRTC and GB28181. For RTMP/HLS/F…

7.MySQL复合查询

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 复合查询 基本查询回顾 多表查询 自连接 子查询 单行子查询 多行子查询 多列子查询 在from子句中使用子查询 合并查询 union union all 实战OJ 复合查询 前面我们讲解的mysql表的查询都是对一张表进行查询…

图像恢复介绍(持续更新)

前言 噪声的产生是信号在采集、传输以及记录过程中&#xff0c;受到成像设备自身因素和外界环境的影响而产生的。现实中的噪声是随机分布的&#xff0c;事实上&#xff0c;噪声无法完全去除&#xff0c;只能使得重现信号尽可能的接近原始信号&#xff0c;因此&#xff0c;去噪严…

JavaSpringbootmysql农产品销售管理系统47627-计算机毕业设计项目选题推荐(附源码)

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设农产品销售管理系统。…

Matplotlib | 高阶绘图案例【4】- 2023年编程语言榜单Python稳坐第一

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. 数据处理2.1 高效数据2.2 保留需要的列 &#x1f3f3;️‍&#x1f308; 3. 绘图3.1 绘制图布&#xff0c;添加3个子图3.2 绘制子图1条形图3.3 子图1条形图添加数据标签3.4 绘制子图2条…

toluaframework中C#怎么调用Lua的方法以及无GC方法

toluaframework中C#怎么调用Lua的方法 问题Util.CallMethodLuaManager.CallFunctionLuaFunction.LazyCall 解决方案LuaFunction脚本无GC消耗的调用 用法总结 问题 用过luaframework框架的人应该都知道框架提供了Util的工具类&#xff0c;工具类提供了一个方法就是Util.CallMet…

口袋参谋:30秒导出淘宝同行的全部数据,是如何做到的?

作为一名淘宝天猫的商家&#xff0c;想要了解产品当下的市场行情数据。 则可以通过&#xff0c;【同类目数据导出】功能&#xff1a; 一键获取相同类目下&#xff0c;所有店铺市场推广数据。 ​【同类目数据导出】功能使用 1、安装插件 2、登录千牛后台→数据→生意参谋→市…

C# 海康威视平台API接入 和网页摄像头部署

文章目录 前言相关网址综合安防管理平台网址获取Appkey和Secret/密码和密钥测试个人魔改工具类 海康视频接入获取摄像头Id下载海康Web插件原生Html导入网页设置 JS封装封装代码使用设置成功&#xff01; 前言 最近有个需求是将海康的摄像头视频画面传到我们平台上&#xff0c;…

C++简单的栈模型示例

前言 最近在学习C&#xff0c;由于该语言是手动管理内存&#xff0c;所以要对内存池、栈、数组等相关模型要多多了解&#xff0c;下面是一个简单的栈模型。 // dome.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #define _CRT_SECURE_NO_WARNIN…

【踩坑记】js用a.push(...b)进行数组组合报栈溢出

建议&#xff1a;进行数组合并时&#xff0c;若不确定数组最终长度或者数组长度超过下述表中数据&#xff0c;建议使用 concat 最近踩了个坑&#xff0c;在进行数组合并时出现了栈溢出的报错。 示例代码&#xff1a; const arr [] for (let i 0; i < 500000; i) {arr.pu…

iOS自动混淆测试处理笔记

1 打开 ipa&#xff0c;导出ipa 路径和配置文件路径会自动填充 2 点击 开始自动混淆测试处理 自动混淆测试是针对 oc 类和oc方法这两个模块进行自动混淆ipa&#xff0c;并ipa安装到设备中运行&#xff0c;通过检测运行ipa包是否崩溃&#xff0c;来对oc类和oc方法进行筛选。如果…

COSCon'23 真·黑客马拉松准备出发!

众多开源爱好者翘首期盼的开源盛会&#xff1a;第八届中国开源年会&#xff08;COSCon23&#xff09;将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01;各位新老朋友们&#xff0c;欢迎到成都&a…

【java学习—九】模板方法(TemplateMethod)设计模式(4)

文章目录 1. 在java中什么是模板2. 模板方法设计解决了什么问题&#xff1f;3. 代码化理解 1. 在java中什么是模板 抽象类体现的就是一种模板模式的设计&#xff0c;抽象类作为多个子类的通用模板&#xff0c;子类在抽象类的基础上进行扩展、改造&#xff0c;但子类总体上会保留…

windows安装最新pip官方教程

在执行pip的pip install --upgrade pip更新时&#xff0c;出现如下错误&#xff0c;怎么也无法重新安装&#xff1a; 根据官网的安装教程来 命令的方式一&#xff1a; • 卸载PIP的命令&#xff1a;python -m pip uninstall pip • 重装PIP的命令&#xff1a;python -m ensure…

语雀P0级故障复盘,有9个字亮了

大家好&#xff0c;我是洋子 最近语雀不是出了个号称 “载入史册” 的 P0 级事故嘛 —— 连续宕机接近8个小时无法使用&#xff0c;作为一个大厂知名产品&#xff0c;这个修复速度属实让人无法理解 故障公告原文&#xff1a;https://mp.weixin.qq.com/s/WFLLU8R4bmiqv6OGa-QMc…

【算法设计】贪心算法设计——均分纸牌、线段覆盖问题(C++实现)

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 更多算法分析与设计知识专栏:算法分析🔥 给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ 目录…

私藏小技巧:让微信朋友圈营销方便化的小窍门!

微信&#xff0c;这个拥有十亿用户的社交软件&#xff0c;已经成为生活中不可或缺的一部分。 而朋友圈&#xff0c;这个微信的基础功能&#xff0c;是聚宝盆&#xff0c;也是一切流量的尽头。 现在公域&#xff0b;私域的流量增长变现体系很火。朋友圈是一切公域流量的尽头&a…