01 · 核心架构概述
定位
Qiankun 是面向浏览器的微前端运行时:在不改造子应用构建产物语义的前提下,通过 HTML 入口拉取子应用,在宿主页内完成 DOM 注入、脚本执行环境隔离、样式与动态插入行为约束,并把子应用暴露的 bootstrap / mount / unmount 交给 single-spa 做应用级生命周期与路由驱动调度。
本仓库 next 分支(v3)相对历史版本的核心变化可概括为:
- 流式 HTML 解析:入口 HTML 以
ReadableStream方式消费,边下边解析边挂 DOM,而不是等整页 HTML 文本到齐再一次性innerHTML。 - 沙箱模型:以 Proxy 膜(Membrane)+
with(this)执行腔(Compartment) 组织「伪全局对象」,脚本经转译后以 Blob URL 等方式在受限全局上执行。 - 包拆分:
loader/sandbox/shared独立包,qiankun包做门面编排。
顶层数据流(从 entry 到子应用导出)
- 宿主调用
registerMicroApps+start或loadMicroApp。 loadApp(packages/qiankun/src/core/loadApp.ts)组合:- 可选
createSandboxContainer→ 得到子应用视角的globalThis与latestSetProp等; loadEntry(@qiankunjs/loader)拉流、替换<head>、写入容器 DOM;- 默认
nodeTransformer内调用transpileAssets,对script/link做沙箱执行、依赖复用、preload 修正等。
- 可选
loadEntry返回的 Promise 在「入口脚本」执行完成后 resolve,解析值为沙箱上最近一次window.xxx = ...赋值对应的属性(即入口 bundle 挂到伪全局上的导出对象)。getLifecyclesFromExports从该对象(或window[appName]等 fallback)取出生命周期函数,封装成 single-spa 的 ParcelConfigObject。
与 Umi 的关系(易混淆点)
- Qiankun:运行时微前端框架(本仓库)。
- Umi:前端应用框架;通过插件把子应用构建成可被 Qiankun 消费的形态(如 publicPath、生命周期导出等)。
理解本仓库时,应把「子应用如何打包」与「Qiankun 如何执行 HTML/JS」分开:Qiankun 假设入口 HTML 中能通过约定(如带 entry 的外链脚本)找到唯一入口脚本,并从其执行副作用中拿到导出。