微前端架构方案——qiankun

微前端架构方案——qiankun

qiankun是基于Single-SPA的微前端实现库。

qiankun中的每一个微前端应用都有自己独立的生命周期和上下文环境,每个微前端内可以使用自己的技术栈。

qiankun的核心设计理念

  • 简单:qiankun对于开发者而言就是一个类似jQuery的库,只需要调用几个qiankun的API就可以完成应用的微前端改造。qiankun使用HTML entry和沙箱设计,接入微应用就像使用iframe一样简单。

  • 解耦以及技术栈无关:微前端的核心目标是将巨石应用拆解成多个可以自治的松耦合微应用,qiankun使用这一原则。qiankun的HTML entry、沙箱、应用间通信等确保了微应用可以独立开发独立运行。

qiankun如何在项目中使用

主应用中注册微应用

  1. 安装qiankun
bash
1
npm install -S qiankun
  1. 在主应用中注册微应用
js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { registerMicroApps, start } from 'qiankun';

// 注册多个微应用
registerMicroApps([
{
// 微应用的名称,唯一
name: 'react app',
// 微应用的入口
entry: '//localhost:7100',
// 微应用的容器节点id
container: '#yourContainer',
// 微应用的匹配规则
activeRule: '/yourActiveRule',
},
{
name: 'vue app',
entry: { scripts: ['//localhost:7100/main.js'] },
container: '#yourContainer2',
activeRule: '/yourActiveRule2',
},
]);

start();

浏览器的URL发生变化后,qiankun会自动匹配规则,所有activeRule规则(路由匹配)匹配上的微应用都会被插入到指定的container中,同时一次调用微应用暴露出的生命周期钩子。

如果微应用不是直接跟路由关联的时候,你也可以选择手动加载微应用的方式:

js
1
2
3
4
5
6
7
import { loadMicroApp } from 'qiankun';

loadMicroApp({
name: 'app',
entry: '//localhost:7100',
container: '#yourContainer',
});

微应用

微应用不需要额外安装任何其他依赖即可接入qiankun主应用。

  1. 导出相应的生命周期钩子

微应用需要在自己的入口js(通常就是你配置的webpack的entry js)导出bootstrap、mount、unmount三个生命周期钩子,以供主应用在适当的时机调用。

js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 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);
}
  1. 配置微应用的打包工具

除了代码中暴露出相应的生命周期钩子之外,为了让主应用能正确识别微应用暴露出来的一些信息,微应用的打包工具需要增加如下配置:

webpack v5:

js
1
2
3
4
5
6
7
8
9
const packageName = require('./package.json').name;

module.exports = {
output: {
library: `${packageName}-[name]`,
libraryTarget: 'umd',
chunkLoadingGlobal: `webpackJsonp_${packageName}`,
},
};

webpack v4:

js
1
2
3
4
5
6
7
8
9
const packageName = require('./package.json').name;

module.exports = {
output: {
library: `${packageName}-[name]`,
libraryTarget: 'umd',
jsonpFunction: `webpackJsonp_${packageName}`,
},
};

参考

  1. https://qiankun.umijs.org/zh

评论