快速上手

主应用

1. 安装 qiankun

  1. $ yarn add qiankun # 或者 npm i qiankun -S

2. 在主应用中注册微应用

  1. import { registerMicroApps, start } from 'qiankun';
  2. registerMicroApps([
  3. {
  4. name: 'react app', // app name registered
  5. entry: '//localhost:7100',
  6. container: '#yourContainer',
  7. activeRule: '/yourActiveRule',
  8. },
  9. {
  10. name: 'vue app',
  11. entry: { scripts: ['//localhost:7100/main.js'] },
  12. container: '#yourContainer2',
  13. activeRule: '/yourActiveRule2',
  14. },
  15. ]);
  16. start();

当微应用信息注册完之后,一旦浏览器的 url 发生变化,便会自动触发 qiankun 的匹配逻辑,所有 activeRule 规则匹配上的微应用就会被插入到指定的 container 中,同时依次调用微应用暴露出的生命周期钩子。

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

  1. import { loadMicroApp } from 'qiankun';
  2. loadMicroApp({
  3. name: 'app',
  4. entry: '//localhost:7100',
  5. container: '#yourContainer',
  6. });

微应用

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

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

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

  1. /**
  2. * bootstrap 只会在微应用初始化的时候调用一次,下次微应用重新进入时会直接调用 mount 钩子,不会再重复触发 bootstrap。
  3. * 通常我们可以在这里做一些全局变量的初始化,比如不会在 unmount 阶段被销毁的应用级别的缓存等。
  4. */
  5. export async function bootstrap() {
  6. console.log('react app bootstraped');
  7. }
  8. /**
  9. * 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
  10. */
  11. export async function mount(props) {
  12. ReactDOM.render(<App />, props.container ? props.container.querySelector('#root') : document.getElementById('root'));
  13. }
  14. /**
  15. * 应用每次 切出/卸载 会调用的方法,通常在这里我们会卸载微应用的应用实例
  16. */
  17. export async function unmount(props) {
  18. ReactDOM.unmountComponentAtNode(
  19. props.container ? props.container.querySelector('#root') : document.getElementById('root'),
  20. );
  21. }
  22. /**
  23. * 可选生命周期钩子,仅使用 loadMicroApp 方式加载微应用时生效
  24. */
  25. export async function update(props) {
  26. console.log('update props', props);
  27. }

qiankun 基于 single-spa,所以你可以在这里快速上手 - 图1找到更多关于微应用生命周期相关的文档说明。

无 webpack 等构建工具的应用接入方式请见这里

2. 配置微应用的打包工具

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

webpack:

  1. const packageName = require('./package.json').name;
  2. module.exports = {
  3. output: {
  4. library: `${packageName}-[name]`,
  5. libraryTarget: 'umd',
  6. jsonpFunction: `webpackJsonp_${packageName}`,
  7. },
  8. };

相关配置介绍可以查看 webpack 相关文档快速上手 - 图2