一张图简述single-spa原理
一. 对single-spa原理的思考
- 所谓加载,就是执行 registerApplication 的第二个参数函数,执行这个参数函数的结果就是拿到bootstap,mounted,unmounted三个函数。如果中间有自己写挂载script标签的逻辑,此时还会预加载子应用的js资源。
- registerApplication 只会加载路由匹配的子应用。
- registerApplication 的第二个参数函数是async函数,加载过程是异步的,这也就意味着,加载还未结束,就可能切换路由,此时新的子应用会被加载,但先前的子应用还没来得及挂载。
- 加载期间(registerApplication的第三个async参数return前)如果没有中断,必定要去挂载。但若被中断,就会导致子应用进入 “NOT_MOUNTED”。
- registerApplication 的第二个参数 loadApp 并不会在 registerApplication 执行期间就立刻执行。在效果上,只有初始化路由匹配了 activeWhen 才会执行 loadApp。
- loadApp 的逻辑由用户编写,所以不一定会做什么事,但一定要返回子应用暴露的即生命周期(接入协议)。通常情况下,loadApp就是去加载并执行子应用的script。
- 只有在执行 start() 之后子应用才会调用暴露的mount生命周期,然后渲染。但子应用的js已经在loadApp中加载完成并执行完成。为什么之前子应用的js已经加载并执行,但子应用还未渲染呢?是因为子应用复写了子应用的渲染逻辑。暴露的生命周期中包含着渲染逻辑,如果在子应用mount生命周期执行前就执行渲染逻辑是一种错误的实践方式。
- 能在 appToLoad、appToUnmounted、appToMounted这三个集合中的,一定是当前路由符合activeWhen,或者不符合activeWhen,现在需要删除的。从未拿到接入协议的(register时的第二个loadApp函数),且不符合activeWhen的不在这三个分类中。
二. 流程图
