微前端
micro-app简单实现
主应用
安装依赖
npm i @micro-zoe/micro-app --save
初始化micro-app
// main.js
import microApp from '@micro-zoe/micro-app'
microApp.start()
记载子应用
<template>
<!-- name:应用名称, url:应用地址 -->
<micro-app name='my-app' url='http://localhost:3000/'></micro-app>
</template>
子应用
设置跨域支持
vite默认开启跨域支持,不需要额外配置。
module.exports = {
devServer: {
headers: {
'Access-Control-Allow-Origin': '*',
}
}
}
注册卸载函数
// main.js
const app = new Vue(...)
// 卸载应用
window.unmount = () => {
app.$destroy()
}
完成以上步骤微前端即可正常渲染
主应用向子应用发送数据
使用 <micro-app>
组件的 data
给子应用发送数据,此时只接受对象类型,数据变化时会自动重新发送。
<!-- 第一种 -->
<template>
<div>
<micro-app name="my-app" url="http://localhost:8381/" baseroute="/my-app" :data="data" />
</div>
</template>
<script setup lang="ts">
const data = { msg: '通过 data 发送给子应用的数据' }
// 第二种
// 发送数据给子应用 my-app,setData第二个参数只接受对象类型
microApp.setData('my-app', { msg: '手动发送给子应用的数据' })
</script>
子引用接受数据
// 获取主应用下发的 data 数据
const data = window.microApp.getData()
子引用像父应用发送数据
// dispatch只接受对象作为参数
window.microApp.dispatch({ msg: '子应用发送的数据' })
主应用接受数据
// 获取指定子应用发送的数据
const childData = microApp.getData(appName)
发送全局数据
// setGlobalData 只接受对象作为参数
microApp.setGlobalData({ msg: '全局数据' })
获取全局数据
const globalData = window.microApp.getGlobalData()
qiankun
安装qiankun
$ yarn add qiankun # 或者 npm i qiankun -S
在主应用中注册微应用
import { registerMicroApps, start } from 'qiankun'
// 根据路由配置
registerMicroApps([
{
name: 'vue-app', // 必须与微应用注册名字相同
entry: 'http://localhost:8081', // 入口路径,开发时为微应用所启本地服务,上线时为微应用线上路径
container: '#vue-app-container', // 微应用挂载的节点
activeRule: '/micro-vue', // 当访问路由为 /micro-vue 时加载微应用
props: {
msg: "我是来自主应用的值-vue" // 主应用向微应用传递参数
}
},
{
name: 'react-app',
entry: 'http://localhost:8082',
container: '#react-app-container',
activeRule: '/micro-react',
props: {
msg: "我是来自主应用的值-react"
}
}
])
start()
当微应用信息注册完之后,一旦浏览器的 url 发生变化,便会自动触发 qiankun 的匹配逻辑,所有 activeRule 规则匹配上的微应用就会被插入到指定的 container 中,同时依次调用微应用暴露出的生命周期钩子。
如果微应用不是直接跟路由关联的时候,你也可以选择手动加载微应用的方式:
import { loadMicroApp } from 'qiankun';
loadMicroApp({
name: 'app',
entry: '//localhost:7100',
container: '#yourContainer',
});
微应用
微应用不需要额外安装任何其他依赖即可接入 qiankun 主应用。
导出相应的生命周期钩子
微应用需要在自己的入口 js (通常就是你配置的 webpack 的 entry js) 导出 bootstrap
、mount
、unmount
三个生命周期钩子,以供主应用在适当的时机调用
/**
* bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
* 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
*/
export async function bootstrap() {
console.log('react app bootstraped');
}
/**
* 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
*/
export async function mount(props) {
ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));
}
/**
* 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
*/
export async function unmount(props) {
ReactDOM.unmountComponentAtNode(
props.container ? props.container.querySelector('#root') : document.getElementById('root'),
);
}
/**
* 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
*/
export async function update(props) {
console.log('update props', props);
}
配置微应用的打包工具
const packageName = require('./package.json').name;
module.exports = {
output: {
library: `${packageName}-[name]`,
libraryTarget: 'umd',
chunkLoadingGlobal: `webpackJsonp_${packageName}`,
},
};