用于注册子应用信息,为 Garfish 实例方法。
Garfish.run()
中 apps 应用信息注册底层就是依赖 registerApp
的注册能力;registerApp
为 Garfish 实例方法,用户可调用该 API 动态注册子应用信息,若出现 Garfish.run()
中的同名 app 应用信息,将覆盖Garfish.run()
中的 app 应用信息(merge, not override);AppInfo 为子应用 app 配置类型,此配置与 Garfish.run() 全局配置中 app 相关参数含义相同。
Garfish 处理 app 参数的原则是:
对于同名字段,子应用中的配置具备更高优先级;
默认情况下,Garfish 使用全局配置作为每个子应用配置;
针对单个子应用的信息配置不影响其它子应用;
Type: string
子应用的基础路径,可选,默认值为全局 basename;
通过路由驱动自动加载子应用时实际传递给子应用的 basename 为 basename + activeWhen
计算的值
若手动载入渲染应用时 basename
为实际传入的值
通过 provider 函数 的 basename
参数透传给子应用,子应用需要将 basename 设置为相应子应用的基础路由,这是必须的;
子应用的默认挂载点,可选,没有默认值,若省略需要在子应用 AppInfo 中单独指定。二者同时存在时,子应用指定优先级更高;
当提供 string
类型时需要其值是 selector
, Garfish 内部会使用 document.querySelector(domGetter)
去选中子应用的挂载点
当提供 string
类型的 domGetter
时,子应用在触发渲染后并不会若当前文档流上并不存在挂载点,Garfish
框架内部在 3s
内轮讯是否有挂载点
当提供函数时,将在子应用挂载过程中执行此函数,并期望返回一个 dom 元素;
若 domGetter
在子应用渲染时无法查询到挂载点,则会丢出 domGetter
无效的异常
provider
导出函数 生命周期方法中将接收到此数据;Type: SandboxConfig | false 可选,默认值为 全局 sandbox 配置,当设置为 false 时关闭沙箱;
SandboxConfig:
请注意:
如果你在沙箱内自定义的行为将会产生副作用,请确保在 recover 函数中清除你的副作用,garfish 将在应用卸载过程中执行 recover 函数销毁沙箱副作用,否则可能会造成内存泄漏。
在什么情况下我应该关闭 sandbox ?
Garfish 目前已默认支持沙箱 esModule 能力,若需要在 vm 沙箱支持 esModule 应用,请使用
@garfish/es-module
garfish 官方插件支持此能力,但这会带来严重的性能问题,原因。如果你的项目不是很需要在 vm 沙箱下运行,此时可以关闭沙箱;
若开启快照沙箱,请注意:
Type: string | ((path: string) => boolean)
子应用的激活路径或激活条件,是子应用配置中的重要配置项,接收 string 和 函数类型,可选。
activeWhen
使用场景为基于路由模式加载子应用时,计算当前应激活的子应用的判断条件,当使用手动加载 loadApp 时将忽略 activeWhen
选项。如果你的应用是基于路由驱动式挂载子应用,你应该始终传递 activeWhen
;
在每次发生路由变化时,Garfish 都会触发 activeWhen 的校验逻辑去判断当前应该激活的子应用;
当参数为 string 类型时:
activeWhen
应设置为子应用的一级路由
Garfish 将使用字符串最短匹配原则作为激活判断条件匹配子应用,各子应用的 activeWhen
参数应保持唯一(即:Garfish 能够精准匹配到当前应该激活的子应用,应避免子应用间出现 activeWhen
重合的情况;
在路由驱动模式下,子应用中接收到的 basename
参数将是 basename
+ activeWhen
:
activeWhen: '/vue-app',(basename:'/')
当参数为 function 类型时:
true
表示激活当前应用,否则应返回 false
;basename
+ 子应用最长激活路径
传递给子应用参数;什么时候不需要设置 activeWhen?
activeWhen 为基于路由模式加载子应用时的激活路径(或条件),目的是为了寻找当前应该激活的子应用。当用户使用 loadApp 手动挂载应用时,此时可省略
activeWhen
参数。
子应用如果本身具备路由,在微前端的场景下,必须把 basename 作为子应用的基础路径,没有基础路由,子应用的路由可能与主应用和其他应用发生冲突;
我们强留建议不要使用根路径作为子应用的激活条件,为什么?
true
;provider
函数,可选,默认为 true;