fix: qiankun支持多页签keepalive

This commit is contained in:
wanchun 2022-04-19 21:07:42 +08:00
parent f7185ea24e
commit 5347dadadf
8 changed files with 4565 additions and 4391 deletions

View File

@ -3,7 +3,7 @@
main main
<FTabs v-model="activeKey"> <FTabs v-model="activeKey">
<FTabPane name="Tab 1" value="1"> <FTabPane name="Tab 1" value="1">
<MicroAppWithMemoHistory key="1" name="app1" url="/app1" /> <MicroAppWithMemoHistory key="1" name="app1" url="/app1" a="1" />
</FTabPane> </FTabPane>
<FTabPane name="Tab 2" value="2"> <FTabPane name="Tab 2" value="2">
<MicroAppWithMemoHistory key="2" name="app1" url="/app1/test" /> <MicroAppWithMemoHistory key="2" name="app1" url="/app1/test" />

View File

@ -32,7 +32,7 @@
"@fesjs/utils": "^2.0.4", "@fesjs/utils": "^2.0.4",
"address": "^1.1.2", "address": "^1.1.2",
"lodash-es": "^4.17.15", "lodash-es": "^4.17.15",
"qiankun": "^2.4.4" "qiankun": "^2.7.0"
}, },
"devDependencies": { "devDependencies": {
"npm-run-all": "^4.1.5" "npm-run-all": "^4.1.5"

View File

@ -1,3 +1,4 @@
export const defaultMainRootId = 'root-master';
export const defaultHistoryType = 'hash'; export const defaultHistoryType = 'hash';
export const qiankunStateForMicroModelNamespace = 'qiankunStateForMicro'; export const qiankunStateForMicroModelNamespace = 'qiankunStateForMicro';
export const qiankunStateFromMainModelNamespace = 'qiankunStateFromMain'; export const qiankunStateFromMainModelNamespace = 'qiankunStateFromMain';

View File

@ -2,6 +2,7 @@ import { readFileSync, existsSync } from 'fs';
import { join } from 'path'; import { join } from 'path';
import { resolvePkg } from '@fesjs/utils'; import { resolvePkg } from '@fesjs/utils';
import { import {
defaultMainRootId,
defaultHistoryType, defaultHistoryType,
qiankunStateForMicroModelNamespace qiankunStateForMicroModelNamespace
} from '../constants'; } from '../constants';
@ -25,6 +26,12 @@ export default function (api) {
enableBy: () => isMasterEnable(api) enableBy: () => isMasterEnable(api)
}); });
// 避免跟子应用冲突
api.modifyDefaultConfig(config => ({
...config,
mountElementId: defaultMainRootId
}));
modifyRoutes({ api, namespace }); modifyRoutes({ api, namespace });
const absMicroAppPath = join(namespace, 'MicroApp.js'); const absMicroAppPath = join(namespace, 'MicroApp.js');

View File

@ -11,26 +11,26 @@ import { loadMicroApp } from "{{{QIANKUN}}}";
import {mergeWith} from "{{{LODASH_ES}}}"; import {mergeWith} from "{{{LODASH_ES}}}";
// eslint-disable-next-line import/extensions // eslint-disable-next-line import/extensions
import { getMasterOptions } from "./masterOptions"; import { getMasterOptions } from "./masterOptions";
import { onBeforeRouteLeave } from "@@/core/coreExports";
async function unmountMicroApp(microApp) { function unmountMicroApp(microApp) {
if (microApp) { if (!microApp) {
return;
}
const status = microApp.getStatus(); const status = microApp.getStatus();
if(status === 'MOUNTED'){ if (status === 'MOUNTED') {
await microApp.unmount(); microApp.unmount();
} }
}
return Promise.resolve();
} }
export const MicroApp = defineComponent({ export const MicroApp = defineComponent({
props: { props: {
name: { name: {
type: String, type: String,
required: true, required: true
}, },
settings: Object, settings: Object,
lifeCycles: Object, props: Object,
lifeCycles: Object
}, },
setup(props, { attrs }) { setup(props, { attrs }) {
const { const {
@ -40,8 +40,6 @@ export const MicroApp = defineComponent({
...globalSettings ...globalSettings
} = getMasterOptions(); } = getMasterOptions();
const stateForSlave = reactive({});
// 挂载节点 // 挂载节点
const containerRef = ref(null); const containerRef = ref(null);
const microAppRef = ref(); const microAppRef = ref();
@ -68,6 +66,14 @@ export const MicroApp = defineComponent({
const propsFromParams = attrs; const propsFromParams = attrs;
const propsConfigRef = computed(() => {
return {
...propsFromConfigRef.value,
...props.props,
...propsFromParams
};
});
// 只有当name变化时才重新加载新的子应用 // 只有当name变化时才重新加载新的子应用
const loadApp = () => { const loadApp = () => {
const appConfig = appConfigRef.value; const appConfig = appConfigRef.value;
@ -75,21 +81,21 @@ export const MicroApp = defineComponent({
// 加载新的 // 加载新的
microAppRef.value = loadMicroApp( microAppRef.value = loadMicroApp(
{ {
name: name, // 保证唯一
name: `${name}_${Date.now()}`,
entry: entry, entry: entry,
container: containerRef.value, container: containerRef.value,
props: { props: propsConfigRef.value
...propsFromConfigRef.value,
...stateForSlave,
...propsFromParams,
},
}, },
{ {
...globalSettings, ...globalSettings,
...(props.settings || {}), ...(props.settings || {})
}, },
mergeWith({}, globalLifeCycles || {}, props.lifeCycles || {}, (v1, v2) => mergeWith(
concat(v1 ?? [], v2 ?? []) {},
globalLifeCycles || {},
props.lifeCycles || {},
(v1, v2) => concat(v1 ?? [], v2 ?? [])
) )
); );
}; };
@ -106,9 +112,9 @@ export const MicroApp = defineComponent({
updatingPromiseRef.value = updatingPromiseRef.value.then( updatingPromiseRef.value = updatingPromiseRef.value.then(
() => { () => {
const canUpdate = (app) => const canUpdate = (app) =>
app?.update && app.getStatus() === "MOUNTED"; app?.update && app.getStatus() === 'MOUNTED';
if (canUpdate(microApp)) { if (canUpdate(microApp)) {
if (process.env.NODE_ENV === "development") { if (process.env.NODE_ENV === 'development') {
if ( if (
Date.now() - Date.now() -
updatingTimestampRef.value < updatingTimestampRef.value <
@ -127,11 +133,7 @@ export const MicroApp = defineComponent({
} }
// 返回 microApp.update 形成链式调用 // 返回 microApp.update 形成链式调用
return microApp.update({ return microApp.update(propsConfigRef.value);
...propsFromConfigRef.value,
...stateForSlave,
...propsFromParams,
});
} }
} }
); );
@ -152,16 +154,10 @@ export const MicroApp = defineComponent({
loadApp(); loadApp();
}); });
onBeforeRouteLeave(async () => { watch(propsConfigRef, () => {
return await unmountMicroApp(microAppRef.value);
});
watch(()=>{
return {...{}, ...propsFromConfigRef.value, ...stateForSlave, ...propsFromParams}
}, () => {
updateApp(); updateApp();
}); });
return () => <div ref={containerRef}></div>; return () => <div ref={containerRef}></div>;
}, }
}); });

View File

@ -15,6 +15,7 @@ export const MicroAppWithMemoHistory = defineComponent({
required: true required: true
}, },
settings: Object, settings: Object,
props: Object,
lifeCycles: Object, lifeCycles: Object,
url: String url: String
}, },

View File

@ -110,11 +110,7 @@ export function genUpdate() {
export function genUnmount() { export function genUnmount() {
return async (props) => { return async (props) => {
const history = getHistory(); const history = getHistory();
history.destroy(); history.destroy(); // 会触发app.unmount
if (cacheAppPromise) {
const app = await cacheAppPromise;
app.unmount();
}
destroyRouter(); destroyRouter();
const slaveRuntime = getSlaveRuntime(); const slaveRuntime = getSlaveRuntime();
if (slaveRuntime.unmount) { if (slaveRuntime.unmount) {

8869
yarn.lock

File diff suppressed because it is too large Load Diff