微前端-qiankun

文摘   2024-08-13 20:21   吉林  

简单

任意 js 框架均可使用。微应用接入像使用接入一个 iframe 系统一样简单,但实际不是 iframe。

完备

几乎包含所有构建微前端系统时所需要的基本能力,如 样式隔离、js 沙箱、预加载等。

生产可用

已在蚂蚁内外经受过足够大量的线上系统的考验及打磨,健壮性值得信赖。

安装

$ yarn add qiankun  # or npm i qiankun -S

使用

import { loadMicroApp } from 'qiankun';

// 加载微应用
loadMicroApp({
  name'reactApp',
  entry'//localhost:7100',
  container'#container',
  props: {
    slogan'Hello Qiankun',
  },
});

基于路由配置

1.registerMicroApps(apps, lifeCycles?)

  • • apps - Array- 必选,微应用的一些注册信息

  • • lifeCycles - LifeCycles - 可选,全局的微应用生命周期钩子

示例

import { registerMicroApps } from 'qiankun';

registerMicroApps(
  [
    {
      name'app1',
      entry'//localhost:8080',
      container'#container',
      activeRule'/react',
      props: {
        name'kuitos',
      },
    },
  ],
  {
    beforeLoad: (app) => console.log('before load', app.name),
    beforeMount: [(app) => console.log('before mount', app.name)],
  },
);

2.start(opts?)

  • • opts - Options 可选

示例

import { start } from 'qiankun';

start(); //启动 qiankun。

3.setDefaultMountApp(appLink)

  • • appLink - string - 必选

示例

import { setDefaultMountApp } from 'qiankun';

//设置主应用启动后默认进入的微应用。  
setDefaultMountApp('/homeApp'); 

4.runAfterFirstMounted(effect)

  • • effect - () => void - 必选

示例

import { runAfterFirstMounted } from 'qiankun';
  
//第一个微应用 mount 后需要调用的方法,比如开启一些监控或者埋点脚本。
runAfterFirstMounted(() => startMonitor());

手动加载微应用

适用于需要手动 加载/卸载 一个微应用的场景。

通常这种场景下微应用是一个不带路由的可独立运行的业务组件。微应用不宜拆分过细,建议按照业务域来做拆分。业务关联紧密的功能单元应该做成一个微应用,反之关联不紧密的可以考虑拆分成多个微应用。一个判断业务关联是否紧密的标准:看这个微应用与其他微应用是否有频繁的通信需求。如果有可能说明这两个微应用本身就是服务于同一个业务场景,合并成一个微应用可能会更合适。

1.loadMicroApp(app, configuration?)

  • • app - LoadableApp - 必选,微应用的基础信息

  • • configuration - Configuration - 可选,微应用的配置信息

示例

import { loadMicroApp } from 'qiankun';
import React from 'react';

class App extends React.Component {
  containerRef = React.createRef();
  microApp = null;

  componentDidMount() {
    this.microApp = loadMicroApp({
      name'app1',
      entry'//localhost:1234',
      containerthis.containerRef.current,
      props: { brand'qiankun' },
    });
  }

  componentWillUnmount() {
    this.microApp.unmount();
  }

  componentDidUpdate() {
    this.microApp.update({ name'kuitos' });
  }

  render() {
    return <div ref={this.containerRef}></div>;
  }
}

2.prefetchApps(apps, importEntryOpts?)

  • • apps - AppMetadata[] - 必选 - 预加载的应用列表

  • • importEntryOpts - 可选 - 加载配置

    示例

import { prefetchApps } from 'qiankun';

 //手动预加载指定的微应用静态资源。仅手动加载微应用场景需要,基于路由自动激活场景直接配置 prefetch 属性即可。
prefetchApps([
  { name'app1'entry'//localhost:7001' },
  { name'app2'entry'//localhost:7002' },
]);

全局

1. addGlobalUncaughtErrorHandler(handler)

  • • handler - (...args: any[]) => void - 必选

示例

import { addGlobalUncaughtErrorHandler } from 'qiankun';

//添加全局的未捕获异常处理器。
addGlobalUncaughtErrorHandler((event) => console.log(event));

2. removeGlobalUncaughtErrorHandler(handler)

  • • handler - (...args: any[]) => void - 必选

示例

import { removeGlobalUncaughtErrorHandler } from 'qiankun';

//移除全局的未捕获异常处理器。
removeGlobalUncaughtErrorHandler(handler);

3. initGlobalState(state)

  • • state - Record<string, any> - 必选

用法

定义全局状态,并返回通信方法,建议在主应用使用,微应用通过 props 获取通信方法。

返回

MicroAppStateActions

onGlobalStateChange: (callback: OnGlobalStateChangeCallback, fireImmediately?: boolean) => void
在当前应用监听全局状态,有变更触发 callback,fireImmediately = true 立即触发 callback
setGlobalState: (state: Record<string, any>) => boolean
按一级属性设置全局状态,微应用中只能修改已存在的一级属性
offGlobalStateChange: () => boolean
移除当前应用的状态监听,微应用 umount 时会默认调用

示例

主应用:

import { initGlobalState, MicroAppStateActions } from 'qiankun';

// 初始化 state
const actionsMicroAppStateActions = initGlobalState(state);

actions.onGlobalStateChange((state, prev) => {
// state: 变更后的状态; prev 变更前的状态
console.log(state, prev);
});
actions.setGlobalState(state);
actions.offGlobalStateChange();

微应用:

// 从生命周期 mount 中获取通信方法,使用方式和 master 一致
export function mount(props) {
props.onGlobalStateChange((state, prev) => {
  // state: 变更后的状态; prev 变更前的状态
  console.log(state, prev);
});

props.setGlobalState(state);
}

我希望这篇文章对您有所帮助。

Thank you for reading.


推荐阅读

全栈开发ck
叩首问路,码梦为生