实例嵌套
实例嵌套,等价于容器(Container)嵌套。
显然,容器嵌套能够实现的一个必要条件是容器(实例)能够实现销毁。
你可以在子应用中创建新的容器,同时注意仍然需要手动适配与主应用之间的路由兼容性,以及手动触发销毁。
// 主应用
const container = new Container({
name: "app",
root: "#app",
});
container.registerApp({
name: "foo",
activeWhen: "/foo",
});
// 子应用
const subContainer = new Container({
name: "foo",
root: "#foo",
});
subContainer.registerApp({
name: "foo-about",
activeWhen: "/foo/about", // 必须在/foo之下
});
// 手动触发销毁
onBeforeUnmount(() => {
subContainer.destroy();
});
主子应用都是 Router 类型的情况下,我们可以将其类比为 vue-router/react-router 的主子路由,只不过这里主子应用并没有感知对方。这是由于微前端架构的特性决定的。
在实际的业务场景中,主-子应用以及子-子应用往往是独立的工程,即独立仓库、独立构建以及独立发布,甚至有独立的域名以及独立的维护团队。我们不希望它们有太多的耦合。
因此,上面代码的一种实践是,主子工程分别独立导入 Haploid.js,这可能造成页面上有多个 Haploid.js 副本。
当然你也可以利用技术手段来达到 Haploid.js 的唯一性,但是 Haploid.js 在设计上就尽可能地兼容了多副本的同时运行,也就是说,主子应用可以有自己不同版本的 Haploid.js 导入。这也是 Haploid.js 在实现多实例、实例嵌套上的一种努力。
注意
当然,长期来看,不同版本的 Haploid.js 之间有不兼容的可能,Haploid.js 本身已经做了内部判断。我们建议主子应用尽可能保持相同或相近版本,这样它们就可以完全解耦地独立运行。