从0到1落地微前端架构, MicroApp实战招聘网站「完zheng」

164 阅读4分钟

从0到1落地微前端架构, MicroApp实战招聘网站

核心代码,注释必读

// download:3w ukoou com

微前端架构体系的优势 微前端架构体系带来了许多优势,包括:

团队自治:不同团队可以独立开发和部署自己的应用组件,减少了团队之间的协调成本。 技术栈无关:每个应用组件可以使用不同的技术栈和框架,无需强制统一。 增量升级:每个应用组件可以独立升级,无需整体替换或停机。 更好的可扩展性:新的功能可以以应用组件的形式进行添加,而不是整体重构应用系统。 更好的代码复用:不同应用组件间可以共享和复用代码,加快开发速度。

微前端架构体系的适用场景 微前端架构体系适用于以下场景:

大型单体应用拆分:当一个应用系统逐渐变得庞大且难以维护时,可以将其拆分为多个应用组件,以提高系统的可维护性和可扩展性。 多团队协作开发:当不同的团队需要独立开发和维护不同的功能模块时,微前端架构体系可以提供团队自治的能力。 技术栈多样性:当应用系统中使用了不同的技术栈和框架时,可以使用微前端架构体系来组合和集成这些技术栈。

从0到1落地微前端架构, MicroApp实战招聘网站 - 微前端预加载

start 启动应用

  1. prefetch 可选,是否开启预加载,默认为 true。配置为 true 则会在第一个微应用 mount 完成后开始预加载其他微应用的静态资源,配置为 'all' 则主应用 start 后即开始预加载所有微应用静态资源。配置为 string[] 则会在第一个微应用 mounted 后开始加载数组内的微应用资源。配置为 function 则可完全自定义应用的资源加载时机 (首屏应用及次屏应用)。

  2. sandbox - boolean | { strictStyleIsolation?: boolean } - 可选,是否开启沙箱,默认为 true。当配置为 { strictStyleIsolation: true } 表示开启严格的样式隔离模式。这种模式下 qiankun 会为每个微应用的容器包裹上一个 shadow dom 节点,从而确保微应用的样式不会对全局造成影响。

  3. singular,是否为单实例场景,默认为 true。

export let frameworkConfiguration: FrameworkConfiguration = {};

export function start(opts: FrameworkConfiguration = {}) {
  // prefetch 默认 true
  frameworkConfiguration = { prefetch: true, singular: true, sandbox: true, ...opts };
  const { prefetch, sandbox, singular, urlRerouteOnly, ...importEntryOpts } = frameworkConfiguration;

  // 预加载
  if (prefetch) {
    // importEntryOpts 是预加载配置
    // microApps 是所有注册的 子应用
    doPrefetchStrategy(microApps, prefetch, importEntryOpts);
  }

  if (sandbox) {
    if (!window.Proxy) {
      console.warn('[qiankun] Miss window.Proxy, proxySandbox will degenerate into snapshotSandbox');
      // 快照沙箱不支持非 singular 模式
      if (!singular) {
        console.error('[qiankun] singular is forced to be true when sandbox enable but proxySandbox unavailable');
        frameworkConfiguration.singular = true;
      }
    }
  }

  // 调用 aingle spa start 事件
  startSingleSpa({ urlRerouteOnly });

  frameworkStartedDefer.resolve();
}

doPrefetchStrategy 预加载的实现,解析 prefetchStrategy 不同的配置,根据配置调用 prefetchImmediately 或者是 prefetchAfterFirstMounted

export function doPrefetchStrategy(
  apps: AppMetadata[],
  prefetchStrategy: PrefetchStrategy,
  importEntryOpts?: ImportEntryOpts,
) {
  // 定义了一个函数,appname --> app
  const appsName2Apps = (names: string[]): AppMetadata[] => apps.filter(app => names.includes(app.name));

  // prefetchStrategy 是数组,数组中的每个都是需要预加载的子应用名称
  if (Array.isArray(prefetchStrategy)) {
    // 调用 prefetchAfterFirstMounted 方法
    prefetchAfterFirstMounted(appsName2Apps(prefetchStrategy as string[]), importEntryOpts);
  } 

  // prefetchStrategy 是个函数
  else if (isFunction(prefetchStrategy)) {
    (async () => {
      // critical rendering apps would be prefetch as earlier as possible
      // 该函数返回两个数组,分别表示需要立即加载的,以及首个应用加载完毕后加载的
      const { criticalAppNames = [], minorAppsName = [] } = await prefetchStrategy(apps);
      prefetchImmediately(appsName2Apps(criticalAppNames), importEntryOpts);
      prefetchAfterFirstMounted(appsName2Apps(minorAppsName), importEntryOpts);
    })();
  } else {
    switch (prefetchStrategy) {
      case true:
        // 首个应用 mounted 之后开始 fetch 其余应用资源
        prefetchAfterFirstMounted(apps, importEntryOpts);
        break;

      case 'all':
        // 立刻开始 fetch 所有应用的资源
        prefetchImmediately(apps, importEntryOpts);
        break;

      default:
        break;
    }
  }
}

从0到1落地微前端架构, MicroApp实战招聘网站 - 微应用的组件复用

微应用的组件复用是指在微前端架构下,不同微应用之间共享和重用组件。这样做有助于减少重复开发,提高开发效率,并确保一致的用户体验。

实现微应用的组件复用通常可以采取以下几种方法:

  1. 独立组件库:将可复用的组件抽离出来形成一个独立的组件库,不同微应用可以引用该组件库来使用这些组件。这种方式可以通过npm包、私有npm服务或git submodule等方式进行管理和发布。

  2. Web Components:使用Web Components技术创建自定义元素或组件,在不同微应用中都能够使用这些自定义元素。这种方式需要确保微应用支持Web Components标准。

  3. 共享代码库:将共享的组件代码放在一个独立的代码库中,然后由不同的微应用引入和使用。这种方式可能需要处理好版本控制和依赖管理的问题。