一,umijs/plugin-qiankun 特点

✔︎ 基于 qiankun
✔︎ 支持主应用和子应用都用 umi
✔︎ 支持通过 组件引入子应用
✔︎ 父子应用通讯
✔︎ 子应用运行时配置自定义 bootstrap()、mount() 和 unmount()
✔︎ 主应用、子应用联调
✔︎ 嵌套子应用
搭建页面
1, 主应用的搭建(使用umi配合内置的layout)
2,子应用搭建 (搭建了多个子应用(umi,vue)

二,主应用效果

三,主应用搭建

1,通过官方工具创建项目

yarn create @umijs/umi-app

注意: Umi 内置了以下别名:

 @,项目 src 目录@@,临时目录,通常是 src/.umi 目录umi,当前所运行的 umi 仓库目录react-router 和 react-router-dom,底层路由库,锁定版本,打包时所有依赖了他们的地方使用同一个版本react 和 react-dom,默认使用 16.x 版本,但如果项目里有依赖,会优先使用项目中依赖的版本

2,安装乾坤插件

npm i @umijs/plugin-qiankun -D 或者 yarn add @umijs/plugin-qiankun -D

3,修改配置,编辑 .umirc.ts, 例如:

import { defineConfig } from 'umi';
export default defineConfig({title: 'qiankun-demo', favicon: 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fblog%2F202012%2F04%2F20201204182229_e1a0a.thumb.1000_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1653034439&t=1a24e65fd2a3d82a7390ca82cfad6041', // 修改浏览器上的iconnodeModulesTransform: {type: 'none',},// 内置 antd,目前内置版本是 ^4.0.0antd: {// dark: true,compact: true,},layout: {name: '乾坤微应用demo', //产品名称locale: false, //是否开启国际化,开启后路由配置的菜单名会被当做菜单名国际化的keylogo:'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fblog%2F202012%2F04%2F20201204182229_e1a0a.thumb.1000_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1653034439&t=1a24e65fd2a3d82a7390ca82cfad6041'},routes: [{ path: '/', component: '@/pages/index' },{path: '/dashboard',name: '显示方式',icon: 'dashboard',routes: [{path: '/dashboard/analysis',icon: 'AreaChartOutlined',name: '微应用直接显示',component: '@/pages/Dashboard/Analysis',// 微应用直接显示microApp: 'app2'},{path: '/dashboard/monitor',icon: 'DesktopOutlined',name: '主应用中嵌套MicroApp',// 在主应用中嵌套MicroAppcomponent: '@/pages/Dashboard/Monitor',},],},{path: '/app1',name: 'App1-umi子应用',icon: 'RadarChartOutlined',microApp: 'app1',props: {onClick: (event:number) => console.log(event),name: 'App1-umi子应用props',age: 1,},},{path: '/app2',name: 'APP2-umi子应用',icon: 'AreaChartOutlined',microApp: 'app2',props: {onClick: (event:any) => console.log(event),name: 'name: App2-umi子应用props',age: 1,},},{path: '/app-vue',name: 'vue子应用',icon: 'DotChartOutlined',microApp: 'qiankun-vue',props: {onClick: (event:any) => console.log(event),name: 'name: vue子应用props',age: 1,},},{path: '/vue-ayp',name: 'anyapeng',icon: 'smile',microApp: 'vue-ayp',props: {onClick: (event:any) => console.log(event),name: 'vue-ayp子应用props',age: 1,},},],fastRefresh: {},//快速刷新(Fast Refresh),开发时可以保持组件状态,同时编辑提供即时反馈。qiankun: {master: {// 注册子应用信息apps: [{name: 'app1', // 唯一 identry: '//localhost:8001', // html entry},{name: 'app2', // 唯一 identry: '//localhost:8002', // html entry},{name: 'qiankun-vue', // 唯一 identry: '//localhost:8888', // html entry},{name: 'vue-ayp', // 唯一 identry: '//localhost:10000/', // html entry},],},},
});

4oo,根目录下面建立 app.ts 。umi会自动找到暴露的useQiankunStateForSlave,传递路由配置的props参数
主应用:例如

import {useState} from 'react'
export  function useQiankunStateForSlave() {const [Number, setNumber] = useState({});return {Number,setNumber,};}

useModel路由、MicroApp通用的子应用接收:例如

import { useModel } from 'umi';
function MyPage() {//useModel('@@qiankunStateFromMaster')进行接收参数const masterProps = useModel('@@qiankunStateFromMaster');const { numberF, onChange } = masterPropsconst onAdd = () => {onChange()}return (<div>{numberF ? <div><Button onClick={() => { onAdd() }}>App1-umi本地应用点击加一</Button><div>{numberF}</div></div>: 'App1-umi本地应用无点击事件'}</div>)
}

四,子应用搭建

1,umi搭建的子应用

1,安装乾坤插件

npm i @umijs/plugin-qiankun -D 或者 yarn add @umijs/plugin-qiankun -D

2,配置app.ts ,没有app.ts的根目录创建一个app.ts,暴露qiankun对象

export const qiankun = {// 应用加载之前async bootstrap(props:object) {console.log('app1-umi子应用bootstrap1111',props);},// 应用 render 之前触发async mount(props:object) {console.log('app1-umi子应用mount1111',props);},// 应用卸载之后触发async unmount(props:object) {console.log('app1-umi子应用卸载11111',props);},};

3,对 .umirc.ts 进行配置

import { defineConfig } from 'umi';
export default defineConfig({nodeModulesTransform: {type: 'none',},routes: [{ path: '/', component: '@/pages/index' },{path: '/app1/app2',name: 'vue',icon: 'DotChartOutlined',microApp: 'app2'},],fastRefresh: {},qiankun: {slave: {}, // 必写master: {// 注册子应用信息apps: [{name: 'app2', // 唯一 identry: '//localhost:8002', // html entry},],},},
});

4,对 .env进行配置,进行端口限定

PORT=8001

2,vue搭建的子应用

1,安装乾坤插件

npm i @umijs/plugin-qiankun -D 或者 yarn add @umijs/plugin-qiankun -D

2, 配置vue.config.js

const { name } = require('./package');
const path = require('path')
module.exports = {devServer: {headers: {'Access-Control-Allow-Origin': '*',},},configureWebpack: {// 设置别名resolve: {alias: {"@": path.resolve(__dirname, "src"),},},output: {// 微应用的包名,这里与主应用中注册的微应用名称一致library: `${name}-[name]`,// 将你的 library 暴露为所有的模块定义下都可运行的方式libraryTarget: 'umd',// 按需加载相关,设置为 webpackJsonp_MicroAppPlugin 即可jsonpFunction: `webpackJsonp_vue`,},},
};

3, 在根目录 main.js 暴露qiankun 钩子

import Vue from 'vue'
import VueRouter from 'vue-router';
import  routes from './router.js';
console.log(routes,'routes')
// import store from './store';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue'
Vue.use(ElementUI);
Vue.use(VueRouter)
Vue.config.productionTip = falselet router = null;
let instance = null;function render(props = {}) {const { container } = props;router = new VueRouter({//  微应用配置路由 基础路径base: window.__POWERED_BY_QIANKUN__ ? '/app-vue/' : '/',mode: 'history',routes,});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子应用bootstrap');
}
export async function mount(props) {console.log('vue子应用mount', props);render(props);
}
export async function unmount(props) {console.log('vue子应用卸载', props);instance.$destroy();instance.$el.innerHTML = '';instance = null;router = null;
}

4,对 .env进行配置,进行端口限定

PORT=8001

五,父子应用通信

1,使用MicroApp 通信

1,父应用

mport { MicroApp } from 'umi';
import { useState } from 'react';
import { Button } from 'antd';export default function IndexPage() {const [ age ,setAge] = useState(1)const onAdd = ()=>{setAge(age+1)}return (<div><Button onClick ={()=>{onAdd()}}>父应用增加年龄</Button><div>{age}</div>{/* MicroApp 像props一样传参 */}<MicroApp name="vue-ayp" onChange={onAdd} age={age} /></div>);
}

2,子应用

import { useModel } from 'umi';function MyPage() {//  useModel('@@qiankunStateFromMaster') 子应用可以在其内部全局拿到父应用传递过来的参数const masterProps = useModel('@@qiankunStateFromMaster');const { numberF, onChange } = masterPropsconst onAdd = () => {onChange()}return (<div>{numberF ? <div><Button onClick={() => { onAdd() }}>App1-umi本地应用点击加一</Button><div>{numberF}</div></div>: 'App1-umi本地应用无点击事件'}</div>)
}

2,使用路由传参 通信(官网的例子)

类似 react 中组件间通信的方案
主应用中配置 apps 时以 props 将数据传递下去

// src/app.jsexport const qiankun = fetch('/config').then((config) => {return {apps: [{name: 'app1',entry: '//localhost:2222',props: {onClick: (event) => console.log(event),name: 'xx',age: 1,},},],};
});

2,子应用在生命周期钩子中获取 props 消费数据

基于umijs/plugin-qiankun 的微前端 配置(vue+umi)相关推荐

  1. 微前端应用及基于qiankun的微前端实践

    示例代码仓库: yl-qiankun-base:https://gitee.com/dongche/yl-qiankun-base.git yl-qiankun-child-vue:https://g ...

  2. jsp给前端注入值失败_基于 qiankun 的微前端最佳实践(图文并茂) 应用间通信篇...

    引言 大家好~ 本文是基于 qiankun 的微前端最佳实践系列文章之 应用间通信篇,本文将分享在 qiankun 中如何进行应用间通信. 在开始介绍 qiankun 的应用通信之前,我们需要先了解微 ...

  3. 基于 qiankun 的微前端最佳实践(万字长文) - 从 0 到 1 篇

    写在开头 微前端系列文章: 基于 qiankun 的微前端最佳实践(万字长文) - 从 0 到 1 篇 基于 qiankun 的微前端最佳实践(图文并茂) - 应用间通信篇 万字长文+图文并茂+全面解 ...

  4. qiankun 部署微前端-vue2(一)

    自从前后端分离以来,一直都有个困惑,就是随着项目的功能的不断拓展,项目变得不断臃肿,每次打包编译,都要把整个项目编译,非常耗时.如果前端也能像后端一样,在项目搭建初期,有类似微服务的功能,那就好了.现 ...

  5. 基于 qiankun 的微前端实践

    前言 微前端(Micro-Frontends)是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用. 微前端并不是前端领域的 ...

  6. 基于 qiankun 的微前端应用实践

    业务背景 云音乐广告 Dsp(需求方平台)平台分为合约平台(Vue 框架)和竞价平台(React 框架),因历史原因框架选型未能统一,最近来了新需求,需要同时在两个平台增加一样的模块,因为都是 Dsp ...

  7. 基于qiankun的微前端最佳实践 -(同时加载多个微应用)

    介绍 qiankun 在正式介绍 qiankun 之前,我们需要知道,qiankun 是一个基于 single-spa 的微前端实现库,旨在帮助大家能更简单.无痛的构建一个生产可用微前端架构系统. 微 ...

  8. vue项目落地(qiankun.js)微前端服务

    什么是微前端? 网上抄的: 微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将单页面前端应用由单一的单体应用转变为多个小型前端应用聚合为一的应用.各个前端应用还可以独立开发.独立部署 ...

  9. 微前端在Vue项目的实践

    文章的参考:微前端在美团外卖的实践 我将讲解微前端如何在Vue项目中实践和应用,业务逻辑参考文中介绍的,文章中介绍的逻辑比较清晰,但是并没有提供过多的业务代码,对微前端如何应用到具体的项目我们就无从而 ...

最新文章

  1. web自动化测试从入门到持续集成(selenium webdriver)
  2. 散列基础知识总结(思维导图)
  3. 数据库系统概论:第十一章 并发控制
  4. bios设置_大白菜U盘启动BIOS设置教程
  5. 01背包问题:回溯法和限界分支、递归和迭代方式
  6. 博客园代码高亮显示教程
  7. 【ES8(2017)】Object 扩展 values() / entries() / getOwnPropertyDescriptors()
  8. java.net.URLEncoder 、URLDecoder 编码与解码
  9. LANC环链电动葫芦的结构设计与组成
  10. 使用GCJ编译Java程序供Matlab调用Java对象方法实践
  11. 编辑中的word变成只读_打开Word文件是只读,怎么修改
  12. 安装U8后服务器开机加载信息慢,用友U8 安装ADSL后,连接服务器非常慢
  13. SDRAM内存的接口和设计方法(并行输送接口)
  14. z370完美黑苹果_完工!搞掂i5-8600K 华硕PRIME Z370-P GTX 1060黑苹果安装
  15. 大数据时代的安全威胁
  16. graphpad画生存曲线怎么样去掉删失点_Graphpad Prism 绘制散点图
  17. 常见测试场景用例设计(1):登录页面测试用例
  18. 利用R语言进行线性/非线性回归拟合实例(1)
  19. 廖雪峰python教程笔记:装饰器
  20. python大学生生活信息交互平台的设计与实现毕业设计源码031315

热门文章

  1. 抖音seo优化排名搜索算法规则,关键词下拉框搜索栏标签流量技术代码分享
  2. PHP怎么统计下载次数(下载量代码)
  3. python读取pdf文件_python读取pdf文件
  4. 智能设备是如何连接云的
  5. 2020-08-09周末实验-王鹏程
  6. python中math模块
  7. 唤起 App 在转转的实践
  8. Set集合遍历的几种方式
  9. 4.5 并发技术:同步调度
  10. Autodesk infraworks 开发资料