微前端框架micro-app简单用法

微前端

micro-app简单实现

image.png

主应用

安装依赖
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) 导出 bootstrapmountunmount 三个生命周期钩子,以供主应用在适当的时机调用

/**
 * 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}`,
  },
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值