自定义容器

Haploid.js 内置两种容器:ManualContainerRouterContainer

容器的作用有两个:

  • 注册和管理一系列子应用,为其提供 DOM 挂载点
  • 驱动子应用进行装载和卸载

而不同的容器的本质区别仅在于驱动子应用的条件有所不同:ManualContainer 以开发者的意志作为条件,而 RouterContainer 则响应用户对浏览器路由的操作。

如果有其它驱动条件,你完全可以定义自己的容器,下面我们将以 message 作为驱动条件为例实现一个 MessageContainer。

import { Container } from "haploid";

class MessageContainer extends Container {
  private onMessage: ((event: Event) => void) | null;

  // 自定义的启动函数,默认不需要启动
  public start(): void {
    this.onMessage = (event) => {
      const { appname, action } = event.data;
      if ("activateapp" === action && appname) {
        // 调用父类的activateAppByName函数来激活特定子应用
        this.activateAppByName(appname);
      }
    };

    window.addEventListener("message", this.onMessage, false);
  }

  // 覆写destroy函数,清理资源
  public override destroy(): Promise<void> {
    if (this.onMessage) {
      window.removeEventListener("message", this.onMessage, false);
      this.onMessage = null;
    }

    return super.destroy();
  }
}

const mc = new MessageContainer();
mc.start();
// mc.destroy();