正常操作,正常分析,你好,我是d1n910
以下内容基本上是手工制作的学习笔记,因此大部分内容都与
完全相同的
相同
其中会有不间断的自己理解~
建议直接去看 qiankun 官方文档✅
加油加油
【qiankun官方文档学习进度 2/3】
API说明(资深调用API机器人蛋糕兴奋起来了)
qiankun的 API 目前是分三种类型的
类型A:基于路由配置微应用要用到的 API;
-
registerMicroApps(app, lifeCycles?)
-
start(opts?)
-
setDefaultMountApp(appLink)
-
runAfterFirstMounted(effect)
类型B:手动加载微应用要用到的 API;
-
loadMicroApp(app, configuration?)
-
prefetchApps(app, importEntryOpts?)
类型C:全局(全部微应用)能够同时用到的API。
-
addErrorHandler/removeErrorHandler
-
addGlobalUncaoughtErrorHandler(handler)
-
removeGlobalUncaughtErrorHandler(handler)
-
initGlobalState(state)
基于路由配置
适用于 route-base 场景。
通过将微应用关联到一些 url 规则的方式,当浏览器url发生变化的时候,自动加载相应的微应用。
registerMicroApps(apps, lifeCycles?)
-
参数(这里的类型主要用的是 TypeScript 的表示 —— 说起来,我之前学的 TypeScript 没有学完)
apps – Array<RegistrableApp> – 必选,微应用的一些注册信息
lifeCycles – LifeCycles- 可选,全局的微应用生命周期钩子
-
类型
RegistrableApp
· name – string- 必选,微应用的名称,微应用之间必须确保唯一。(页面上一般也不会有两个重复的长得一模一样的内容嘛)
· entry – string | { scripts?: string[]; styles?: string[]; html?: string } – 必选,微应用的入口
>>> 配置为字符串时,表示微应用的访问地址。如果微应用部署在二级目录,则最后面的 /不可省略。例如,微应用的访问地址是:
>>> 配置为对象时,html 的值是微应用的 html 内容字符串,而不是微应用的访问地址。微应用的 publicPath 将会被设置为 /。
· container – string | HTMLElement – 必选,微应用的容器节点的选择器或者Element实例。如 container: ‘#root’ 或 container: doument.querySelector(‘#root’)。
· activeRule – string | (location: Location) => boolean | Array<string | (location: Location) => boolean> – 必选,微应用的激活规则。
>>> 支持直接配置字符串或字符串数组,如 activeRule: ‘/app1’ 或 activeRule: [‘/app1’, ‘/app2’],当配置为字符串时会直接跟 url 中的路径部分做前缀匹配,匹配成功表明当前应用会被激活。
>>> 支持配置一个 acrive function 函数或一组 active function。函数会传入当前location 作为参数,函数返回 true 时表明当前微应用会被激活。如 location => location.pathname.startsWith(‘/app1’)。
规则示例
‘/app1’
-
‘/users/:userId/profile’
-
‘/pathname/#/hash’
-
[‘/pathname/#/hash’, ‘/app1’]
-
浏览器 url 发生变化会调用 activeRule 里的规则, activeRule 任意一个返回 true 时表示该微应用需要被激活。
-
loader – (loading: boolean) => void – 可选,loading 状态发生变化时会调用的方法。
-
props – object – 可选,主应用需要传递给微应用的数据。
LifeCycles
全局的微应用生命周期钩子的类型
type Lifecycle = (app: RegistrableApp) => Promise<any>;
-
beforeLoad – Lifecycle | Array<Lifecycle> – 可选
-
beforeMount – Lifecycle | Array<Lifecycle> – 可选
-
afterMount – Lifecycle | Array<Lifecycle> – 可选
-
beforeUnmount – Lifecycle | Array<Lifecycle> – 可选
-
afterUnmount – Lifecycle | Array<Lifecycle> – 可选
用法
注册微应用的基础配置信息。当浏览器url发生变化时,会自动检查每一个微应用注册的 activeRule 规则,符合规则的应用将会被自动激活。
示例
import { registerMicroApps } from ‘qiankun’;
registerMicroApps(
[
{
name: ‘app1’,
entry: ‘//localhost:8080’,
container: ‘#container’,
activeRule: ‘/react’,
props: {
name: ‘kuitos’,
}
}
],
{
beforeLoad: app => console.log(‘before load’, app.name),
beforeMount: [
app => console.log(‘before mount’, app.name),
],
},
);
-
prefetch – boolean | ‘all’ | string[] | ((apps: RegistrableApp[])) => { criticalAppNames: string[]; minorAppsName: string[] } – 可选,是否开启预加载,默认为 true。
配置为 true 则会在第一个微应用 mount 完成后开始预加载其他微应用的静态资源;
配置为 ‘all’ 则主应用 start 之后即开始预加载所有微应用静态资源;
配置为 string[] 则会在第一个微应用 mounted 后开始加载数组内的微应用资源;
配置为 function 则可以完全自定义应用的资源加载时机(首屏应用及次屏应用)
-
sandbox – boolean | { strictStyleIsolation?: boolean, experimentalStyleIsolation?: boolean } – 可选,是否开启沙箱,默认为 true。
当配置为 { strictStyleIslation: true } 表示开启严格的样式隔离模式。这种模式下qiankun会为每个微应用的容器包裹上一个 shadow dom(这个相当于浏览器自带的原生组件,能够保证样式等是独立出来的)节点,从而确保微应用的样式不会对全局造成影响。
而除此以外,qiankun 还提供了一种实验性的方式来支持样式隔离,当 experimentalStyleIsolation 被设置为 true 时,qiankun 将会通过动态改写一个特殊的选择器约束来限制css的生效范围,应用的样式会按照如下模式改写:
// 假设应用名是 react16
.app-main {
font-size: 14px;
}
div[data-qiankun-react16] .app-main {
font-size: 14px;
}
注意:@keyframes, @font-face,@impprt, @page 将不被支持(i.e.不会被改写)P.S:在目前的阶段,该功能还不支持动态的、使用<link />标签来插入外联的样式,但考虑在未来支持这部分场景。
singular – boolean | (app: RegistrableApp<any> => Promise<boolean>); – 可选,是否为单实例场景,单实例指的是同一时间只会渲染一个微应用。默认为 true。
fetch – Function – 可选,自定义的 fetch 方法
getPublicPath – (entry: Entry) => string – 可选,参数是微应用的 entry 值。
getTemplate – (tpl:string) => string – 可选。
excludeAssetFilter – (assetUrl: string) => boolean – 可选,指定部分特殊的动态加载的微应用资源(css/js)不被 qiankun 挟持处理。
用法
启动 qiankun
示例
import { start } from ‘qiankun’;
start();
start(opts?)
参数
opts – Options (可选)
类型
Options
setDefaultMountApp(appLink)
参数
appLink – string – 必选
用法
设置主应用启动后默认进入的微应用。
示例
import { setDefaultMountApp } from ‘qiankun’;
setDefaultMountApp(‘/homeApp’);
runAfterFirstMounted(effect)
参数
effect – () => void – 必选
用法
第一个微应用 mount 后需要调用的方法,这里可以开启一些监控或者埋点脚本。
示例
import { runAfterFirstMounted } from ‘qiankun’;
runAfterFirstMounted(() => startMonitor());
手动加载微应用
适用于需要手动 加载/卸载 一个微应用的场景。
通常这种场景下微应用是一个不带路由的可独立运行的业务组件。比如是表单等等。
微应用不宜拆分过细,建议按照业务域来做拆分。业务关联紧密的功能单元应该做成一个微应用,反之关联不紧密的可以考虑拆分成多个微应用。一个判断业务关联是否紧密的标准:看这个微应用与其他微应用是否有频繁的通信需求。如果有可能说明这两个微应用本身就是服务于同一个业务场景,合并成一个微应用可能会更合适。
loadMircoApp(app, configuration?)
手动直接加载微应用。
【app】实际上就是前面registerMicroApps(apps, lifeCycles?) 的 apps类型。不需要activeRule属性。
【configuration】这个和 registerMicroApps 的 configuration 的属性是一样的。
调用这个方法会返回 MicroApp – 微应用示例。
有以下的属性:
-
mount(): Promise<null>;
-
unmount(): Promise<null>;
-
update(customProps: object): Promise<any>;
-
getStatus(): | “NOT_LOASED” | “LOADING_SOURCE_CODE” | “NOT_BOOTStrapPED” | “BOOTStrapPING” | “NOT_MOUNTED” | “MOUNTING” | “MOUNTED” | “UPDATING” | “UNMOUNTING” | “SKIP_BECAUSE_BROKEN” | “LOAD_ERROR”;
-
loadPromise: Promise<null>;
-
bootstrapPromise: Promise<null>;
-
mountPromise: Promise<null>;
-
unmountPromise: Promise<null>;
用法
手动加载一个微应用。
如果需要能支持主应用手动 update 微应用,需要微应用 entry 再多导出一个 update 钩子:
export async function mount(props) {
renderApp(props);
}
// 增加 update 钩子以便主应用手动更新微应用
export async function update(props) {
renderPatch(props);
}
主应用示例
import { loadMicroApp } from ‘qiankun’;
import React from ‘react’;
class App extends React.Component {
containerRef = React.createRef();
microApp = null;
// 初始化挂载
componentDidMount() {
this.microApp = loadMicroApp(
{
name: ‘app1’,
entry: ‘//localhost:1234’,
container: this.containerRef.current,
props: {
name: ‘qiankun’
}
}
)
}
// 卸载微应用
componentWillUnmount() {
this.microApp.unmount();
}
// 更新微应用
componentDidUpdate() {
this.microApp.update({
name: ‘kuitos’
});
}
// React 的渲染方法
render() {
return <div ref={this.containerRef}></div>
}
}
prefetchApps(apps, importEntryOpts?)
用法:手动预加载指定的微应用静态资源。仅手动加载微应用场景需要,基于路由自动激活场景直接配置 prefetch 属性即可
参数
apps – AppMetadata[] – 必选 – 预加载的应用列表
importEntryOpts – 可选 – 加载配置。
去查了源代码以后知道了,importEntryOpts 默认值为一个空对象。
– 传入为函数类型的时候,直接作为 `fetch` 使用
– fetch – `(url: string) => promise` – 可选,自定义的 fetch 方法, 用于获取远端的脚本和样式文件内容。 – 默认:浏览器 `fetch`
– getPublicPath – `(url: string) => publicPath:string` – 可选,用于获取静态资源 `publicPath`,将模板中外部资源为相对路径的,转换为绝对路径。- 默认:当前 `location.href` 为 `publicPath`。
– getDomain – `(url: string) => publicPath:string` – 可选,同 `getPublicPath` 。如果没有提供 `getPublicPath` 参数,则使用 `getDomain` ,两者都没有提供的时候,使用默认 `getPublicPath`。- 默认:无。
– getTemplate – `(html: string) => html:string` – 可选,用于在模板解析前,做一次处理。 – 默认:无处理
类型
AppMetadata
name – string – 必选 – 应用名
entry – string | { scripts?: string[]; styles?: string[]; html?: string } – 必选,微应用的 entry 地址
示例
import { prefetchApps } from ‘qiankun’;
prefetchApps([ { name: ‘app1’, entry: ‘//locahost: 7001’ }, { name: ‘app2’, entry: ‘//localhost:7002’ } ])
addErrorHandler/removeErrorHandler
addGobalUncaughtErrorHandler(handler)
参数
handler – (…args: any[]) => void – 必选
用法
添加全局的未捕获异常处理器。
示例
import { addGlobalUncaughtErrorHanlder } from ‘qiankun’;
addGlobalUncaughtErrorHandler(event => console.log(event));
removeGobalUncaughtErrorHandler(handler)
参数
handler – (…args: any[]) => void – 必选
用法
移除全局的未捕获异常处理器。
示例
import { removeGlobalUncaughtErrorHandler } from ‘qiankun’;
removeGlobalUncaughtErrorHandler(handler);
initGlobalState(handler)
参数
state – Record<string, any> – 必选
用法
定义全局状态,并返回通信方法,建议在主应用使用,微应用通过 props 获取通信方法。
返回
MicroAppStateActions
– onGlobalStateChange: (callback: OnGlobalStateChangeCallback, fireImmediately?: boolean) => void,在当前应用监听全局状态,有变更触发 callback。
设置 fireImmediately 为 true 可以初始化后立即触发 callback
– setGlobalState: (state: Record<string, any>) => boolean,按一级属性设置全局状态,微应用中只能修改已存在的一级属性
– offGlobalStateChange: () => boolean,移除当前应用的状态监听,微应用 umount 时会默认调用
示例
主应用:
imprort { initGlobalState, MicroAppStateActions } from ‘qiankun’;
// 初始化 state
const actions: MicroAppStateActions = initGlobalState(state);
actions.onGlobalStateChange((state, prev) => {
console.log(stave, prev);
})
actions.setGlobalState(state);
actions.offGlobalStateChange();
微应用:
// 从生命周期 mount 中获取通信方法,使用方式和 master 一致
export funciotn mount(props) {
props.onGlobalStateChange((state, prev) => {
console.log(state, prev);
})
props.setGlobalState(state);
}
本轮次的API说明文档阅读学习,基本上掌握了 qiankun 暴露出来的 api(考验记忆力)。看文档后,看到几个错别字,提了一个pr,还合并进去了,这里感觉非常好~大家要要多用用qiankun,然后多给开源项目共享~