qiankun源码分析-1.注册子应用

注册子应用

注册子应用,通过registerMicroApps方法,参数为MicroApp\[\]和LifeCycles,MicroApp为子应用的配置项,包含name、entry、container、activeRule、props等属性。

js 复制代码
registerMicroApps(
  [
    {
      name: 'react16',
      entry: '//localhost:7100',
      container: '#subapp-viewport',
      loader,
      activeRule: '/react16',
    },
    {
      name: 'vue',
      entry: '//localhost:7101',
      container: '#subapp-viewport',
      loader,
      activeRule: '/vue',
    },
  ],
  {
    beforeLoad: [
      (app) => {
        console.log('[LifeCycle] before load %c%s', 'color: green;', app.name);
      },
    ],
    beforeMount: [
      (app) => {
        console.log('[LifeCycle] before mount %c%s', 'color: green;', app.name);
      },
    ],
    afterUnmount: [
      (app) => {
        console.log('[LifeCycle] after unmount %c%s', 'color: green;', app.name);
      },
    ],
  },
);

第一个参是是我们的子应用数组,第二个参数是生命周期钩子函数,我们可以利用这些钩子在子应用挂载的不同的阶段插入一些事情,源码如下:

js 复制代码
export function registerMicroApps<T extends ObjectType>(
  apps: Array<RegistrableApp<T>>,
  lifeCycles?: FrameworkLifeCycles<T>,
) {
  // Each app only needs to be registered once
  // 过滤出未注册的app
  const unregisteredApps = apps.filter((app) => !microApps.some((registeredApp) => registeredApp.name === app.name));

  // 未注册的app合并到microApps
  microApps = [...microApps, ...unregisteredApps];

  // 遍历未注册的app,注册到single-spa
  unregisteredApps.forEach((app) => {
    const { name, activeRule, loader = noop, props, ...appConfig } = app;

   // 调用single-spa的registerApplication方法注册子应用
    registerApplication({
      name,
      app: async () => {
        await frameworkStartedDefer.promise;

        const { mount, ...otherMicroAppConfigs } = (
          await loadApp({ name, props, ...appConfig }, frameworkConfiguration, lifeCycles)
        )();

        return {
          mount: [async () => loader(true), ...toArray(mount), async () => loader(false)],
          ...otherMicroAppConfigs,
        };
      },
      activeWhen: activeRule,
      customProps: props,
    });
  });
}

总结下:

registerMicroApps的主要目的就是注册子q应用,最终调用single-spas的registerApplication方法注册子应用,single-spa的registerApplication我们在之前的文章中有介绍到,其目的是注册子应用,并且给子应用添加默认的 初始状态,然后调用reroute函数,继而会调用loadsApp去加载所有待加载的应用,其实此时是不会加载任何app的,因为我们的路由还没有匹配到任何子应用,所以也就不会调用loadApp去加载子应用,当路由匹配到子应用时,single-spa会调用loadApp去加载子应用,那么这个阶段的流程调用图如下:

下一节我们分析第二阶段:初始化全局数据

相关推荐
铁皮饭盒15 分钟前
Next.js 风格路由内置?Bun FileSystemRouter 凭啥这么香
javascript
乘风gg16 分钟前
多 Agent 不是万能的!搞懂这 5 个原则,少走 1 年弯路!
前端·agent·ai编程
猩猩程序员1 小时前
Vercel 推出 Agent 框架 Eve:让 AI Agent 像写 Web 应用一样简单
前端
小林ixn1 小时前
别再背八股了!从 5 个真实场景彻底搞懂 JavaScript 的 this
javascript
爱读源码的大都督1 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝1 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
小牛不牛的程序员2 小时前
我用 Claude Code 半天撸完了一个完整网站,AI 编程到底提升了多少效率?
前端
东风破_2 小时前
JavaScript 面试常考的字符串算法:从反转字符串到回文判断
前端·javascript
巴勒个啦2 小时前
D3.js 入门实战:用力导向图可视化项目依赖关系
javascript
ITOM运维行者2 小时前
从零搭建企业级服务器监控体系:踩坑实录与架构设计
前端·后端