Skip to content

App 嵌套运行报错

问题背景

当前项目架构采用的是 Platform + Multiple Apps 的方式,在 App 平铺的情况下是正常运行的。但是业务又想要在一个 App 中通过微前端加载另一个 App。这就产生了 App "嵌套" 的问题,最终运行时报错“非法调用”:

问题原因

App 嵌套时,window 的创建方式也是嵌套的,例如 A > B > C 的嵌套结构。

A 为原始 windowB 为基于原始 windowproxyWindowC 为基于 BproxyWindowproxyWindow

这就导致一个问题:B window 上设置的值,会被 C "继承"。在 qiankun 中,C 会通过 defineProperty 设置 B window 上的该属性:

但是 C 中定义完该属性后,就没法再次通过 defineProperty 设置值了,导致 can not redefined

另外,qiankun 中对 window 上的方法还会进行 rebindTarget2Fn 包装,包装多次后导致非法调用。

解决方案

App window "拍平",让他们都以同一个基准 window 来创建。qiankun 正好也提供给了该方法:

window 拍平之后,就没有嵌套产生的各种问题了,并且 window 间都是相互独立的。