mirror of
https://github.com/WeBankFinTech/fes.js.git
synced 2025-10-15 12:02:18 +08:00
fix: qiankun支持多页签keepalive
This commit is contained in:
parent
f7185ea24e
commit
5347dadadf
@ -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" />
|
||||||
|
@ -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"
|
||||||
|
@ -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';
|
||||||
|
@ -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');
|
||||||
|
@ -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) {
|
||||||
const status = microApp.getStatus();
|
return;
|
||||||
if(status === 'MOUNTED'){
|
}
|
||||||
await microApp.unmount();
|
const status = microApp.getStatus();
|
||||||
}
|
if (status === 'MOUNTED') {
|
||||||
|
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>;
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
@ -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
|
||||||
},
|
},
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user