qiankun是基于Single-SPA的微前端实现库。
qiankun中的每一个微前端应用都有自己独立的生命周期和上下文环境,每个微前端内可以使用自己的技术栈。
qiankun的核心设计理念
简单:qiankun对于开发者而言就是一个类似jQuery的库,只需要调用几个qiankun的API就可以完成应用的微前端改造。qiankun使用HTML entry和沙箱设计,接入微应用就像使用iframe一样简单。
解耦以及技术栈无关:微前端的核心目标是将巨石应用拆解成多个可以自治的松耦合微应用,qiankun使用这一原则。qiankun的HTML entry、沙箱、应用间通信等确保了微应用可以独立开发独立运行。
qiankun如何在项目中使用
主应用中注册微应用
- 安装qiankun
- 在主应用中注册微应用
js1 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', container: '#yourContainer', activeRule: '/yourActiveRule', }, { name: 'vue app', entry: { scripts: ['//localhost:7100/main.js'] }, container: '#yourContainer2', activeRule: '/yourActiveRule2', }, ]);
start();
|
浏览器的URL发生变化后,qiankun会自动匹配规则,所有activeRule
规则(路由匹配)匹配上的微应用都会被插入到指定的container中,同时一次调用微应用暴露出的生命周期钩子。
如果微应用不是直接跟路由关联的时候,你也可以选择手动加载微应用的方式:
js1 2 3 4 5 6 7
| import { loadMicroApp } from 'qiankun';
loadMicroApp({ name: 'app', entry: '//localhost:7100', container: '#yourContainer', });
|
微应用
微应用不需要额外安装任何其他依赖即可接入qiankun主应用。
- 导出相应的生命周期钩子
微应用需要在自己的入口js(通常就是你配置的webpack的entry js)导出bootstrap、mount、unmount三个生命周期钩子,以供主应用在适当的时机调用。
js1 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
|
export async function bootstrap() { console.log('react app bootstraped'); }
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'), ); }
export async function update(props) { console.log('update props', props); }
|
- 配置微应用的打包工具
除了代码中暴露出相应的生命周期钩子之外,为了让主应用能正确识别微应用暴露出来的一些信息,微应用的打包工具需要增加如下配置:
webpack v5:
js1 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:
js1 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}`, }, };
|
参考
- https://qiankun.umijs.org/zh