Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] 是否可以添加一个方法来手动卸载或触发activeRule规则检测来卸载微应用? #1858

Closed
ViavaCos opened this issue Dec 8, 2021 · 9 comments

Comments

@ViavaCos
Copy link

ViavaCos commented Dec 8, 2021

通过registerMicroApps方式注册的微应用不同于loadMicroApp手动挂载的形式,可以手动调用unmount卸载微应用。
似乎只有在路由发生变化的时候,才会触发activeRule传递的方法来检测当前哪些微应用卸载。

如果同时挂载了多个微应用的情况下,如果关闭了某个微应用的页签,此时路由未发生变化,所以不会触发校验从而卸载不需要的微应用。此时,应该卸载的微应用任处于挂载状态。

因此,这里是否可以提供一个方法来手动触发activeRule的规则匹配,从而直接卸载不需要的微应用,而不是在切换的时候才卸载呢?

@ViavaCos
Copy link
Author

ViavaCos commented Dec 9, 2021

[补充]

通过查找single-spa发现qiankun在registerMicroApps注册微应用时,在传入的lifeCycles中可以通过afterMount生命周期中通过app.props.singleSpa拿到single-spa的这个方法。

unloadApplication: 卸载微应用
(详情说明,参见 https://zh-hans.single-spa.js.org/docs/api/#unloadapplication)

想确认下,在这里调用该方法是否会与qiankn内部实现存在什么冲突,会有什么副作用吗? @gongshun

@gongshun
Copy link
Collaborator

gongshun commented Dec 9, 2021

多标签页就应该通过手动加载来控制比较合适,这个卸载没有触发qiankun内部的逻辑,会有问题的

@ViavaCos
Copy link
Author

ViavaCos commented Dec 9, 2021

ok.

@ViavaCos ViavaCos closed this as completed Dec 9, 2021
@ViavaCos
Copy link
Author

通过测试发现,上述手动卸载微应用的方式也会触发qiankun的unmountunmountSandbox并且在通过registerMicroApps注册微应用时传入的和微应用暴露的生命周期也正常触发。

另外,也有测试在微应用A中对window添加一级属性(为什么是一级,因为看issue说是proxySandbox仅代理第一级),在切换微应用B后手动卸载A,然后再重现进入A直接访问刚才设置的一级属性也是访问不到的(卸载时没有保留代理的属性)。

以上,是不是说明这个方式是可以无副作用使用的?如果存在副作用的话,可以举个例子么? @gongshun tks.

@gongshun
Copy link
Collaborator

通过测试发现,上述手动卸载微应用的方式也会触发qiankun的unmountunmountSandbox并且在通过registerMicroApps注册微应用时传入的和微应用暴露的生命周期也正常触发。

另外,也有测试在微应用A中对window添加一级属性(为什么是一级,因为看issue说是proxySandbox仅代理第一级),在切换微应用B后手动卸载A,然后再重现进入A直接访问刚才设置的一级属性也是访问不到的(卸载时没有保留代理的属性)。

以上,是不是说明这个方式是可以无副作用使用的?如果存在副作用的话,可以举个例子么? @gongshun tks.

你用 single-spa 提供的卸载方法,无法再次注册

@ViavaCos
Copy link
Author

你用 single-spa 提供的卸载方法,无法再次注册

可以的,使用的是unloadApplication 而不是 unregisterApplication
卸载微应用后再次进入依旧会触发sandbox.mount (位置: qiankun/es/sandbox/index.js) 且正常再次挂载。

使用后者的话,是将无法再次挂载。
图片

@ViavaCos
Copy link
Author

使用后者的话,是将无法再次挂载。

unloadApplication像是账户登录登出中的登出操作。
unregisterApplication更多意味着类似注销的操作。

我理解的是这样的 @gongshun

@gongshun
Copy link
Collaborator

使用后者的话,是将无法再次挂载。

unloadApplication像是账户登录登出中的登出操作。 而unregisterApplication更多意味着类似注销的操作。

我理解的是这样的 @gongshun

是这样的,unloadApplication 卸载子应用是可以,但是不太符合设计,应该是 url 改变导致 activeRule 不匹配,然后触发卸载,你可以修改 url 来触发卸载,activeRule 写成函数

@ViavaCos
Copy link
Author

使用后者的话,是将无法再次挂载。

unloadApplication像是账户登录登出中的登出操作。 而unregisterApplication更多意味着类似注销的操作。
我理解的是这样的 @gongshun

是这样的,unloadApplication 卸载子应用是可以,但是不太符合设计,应该是 url 改变导致 activeRule 不匹配,然后触发卸载,你可以修改 url 来触发卸载,activeRule 写成函数

确实如此。
但是对于多页签的应用下,关闭子应用可能并不需要触发url就可以做到,
所以也许手动操作(loadMicroApp)子应用的加载/卸载才是最好的办法吧。
感谢解答。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants