【微前端】qiankun 到底是个什么鬼

前言

在上一篇文章【微前端】single-spa 到底是个什么鬼 聊到了 single-spa 这个框架仅仅实现了子应用的生命周期的调度以及 url 变化的监听。微前端的一个特点都没有实现,严格来说算不上微前端框架。

今天就来聊一个真正的微前端框架:qiankun。同样地,本文不会教大家怎么实现一个 Demo,因为官方的 Github 已经有一个很好的 Demo 了,如果你觉得官网的 Demo 太复杂了,也可以看我自己实现的小 Demo。

qiankun 到底做了什么

首先,qiankun 并不是单一个框架,它在 single-spa 基础上添加更多的功能。以下是 qiankun 提供的特性:

  • 实现了子应用的加载,在原有 single-spa 的 JS Entry 基础上再提供了 HTML Entry
  • 样式和 JS 隔离
  • 更多的生命周期:beforeMount, afterMount, beforeUnmount, afterUnmount
  • 子应用预加载
  • 全局状态管理
  • 全局错误处理

接下来不会一个特性一个特性地讲,因为这样会很无聊,讲完你也只能知道这是个啥,不能深入了解是怎么来的。所以我更愿意聊一下这些特性是怎么来的,它们是怎么被想到的。

多入口

先复习一下 single-spa 是怎么注册子应用的:

singleSpa.registerApplication(
  'appName',
  () => System.import('appName'),
  location => location.pathname.startsWith('appName'),
);

可以看到 single-spa 采用 JS Entry 的方式接入微应用,也即:输出一个 JS,然后 bootstrap, mount, unmount 函数。

但是事件并没有这么简单:我们项目一般都会将静态资源放到 CDN 上来加速。为了不受缓存的影响,我们还会将 JS 文件命名成 contenthash 的乱码文件名: jlkasjfdlkj.jalkjdsflk.js。这样一来,每次子应用一发布,入口 JS 文件名肯定又要改了,导致主应用引入的 JS url 又得改了。麻烦!

打包成单个 JS 文件的另一个问题就是打包的优化都没了:按需加载、首屏资源加载优化、css 独立打包等优化措施全 ️。

很多时候,子应用一般都已经是线上的应用了,比如 https://abcd.com。微前端融合多个子应用本质上不就是融合多个 HTML 嘛?那为什么不给你子应用的 HTML,主应用就自动接入收工了呢?操作起来应该和在