chore: 子应用独立运行测试

This commit is contained in:
wangxuefeng 2025-03-14 13:00:14 +08:00
parent 8f14c9b2df
commit 946d66e456
2 changed files with 162 additions and 77 deletions

View File

@ -1,43 +1,29 @@
import type { RouteRecordRaw } from 'vue-router';
import { h } from 'vue';
import RendererAdapter from '@sy/vue3-renderer-adapter';
import { VITE_RENDERER_URL } from '#/constants';
import {
LOW_CODE_APPLICATION_ID,
LOW_CODE_PROJECT_ID,
} from '#/constants/low-code';
// 微前端路由
const moduleName = 'static-file';
const routes: Array<RouteRecordRaw> = [
const routes: RouteRecordRaw[] = [
{
path: '/static-file',
name: moduleName,
name: 'StaticFile',
meta: {
title: '静态文件管理',
icon: 'ant-design:file',
order: 2,
title: '静态文件管理',
},
children: [
{
path: 'list',
name: `${moduleName}-list`,
path: '/static-file/list',
name: 'StaticFileList',
component: RendererAdapter,
meta: {
icon: 'ant-design:file-text',
title: '静态文件列表',
keepAlive: false,
icon: 'ant-design:file',
},
component: () =>
h(RendererAdapter, {
url: VITE_RENDERER_URL,
name: 'y-code-platform-application-list',
applicationId: LOW_CODE_APPLICATION_ID,
projectId: LOW_CODE_PROJECT_ID,
fileId: '7pfr394d6',
}),
props: {
url: 'https://localhost:10012/?fileId=7pfr394d6&projectId=4',
accessToken: localStorage.getItem('y-code-access-token'),
},
},
],
},

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { getCurrentInstance, ref, watch } from 'vue';
import { getCurrentInstance, onMounted, ref, watch } from 'vue';
import { useQuery } from '@tanstack/vue-query';
import { jsonp, request } from '@vtj/utils';
@ -7,77 +7,176 @@ import { createProvider } from '@vtj/web';
import { ElLoading } from 'element-plus';
import Postmate from 'postmate';
import { getFile } from './io';
import { LowCodeService } from './service';
// import * as VtjUI from '@vtj/ui'
//
const renderer = ref();
const lowCodeService = new LowCodeService();
const isLoading = ref(false);
const handshakeCompleted = ref(false);
const accessToken = ref('');
const urlParams = ref(parseUrlParams());
const provider = ref(null);
// Postmate
const postmate = new Postmate.Model({
sayHi: (data: any) => {
console.log('sayHi', data);
},
});
// URL
function parseUrlParams() {
const urlParams = new URLSearchParams(window.location.search);
const params = {
fileId: urlParams.get('fileId') || '',
projectId: Number(urlParams.get('projectId')) || -1,
applicationId: Number(urlParams.get('applicationId')) || -1,
name: urlParams.get('name') || '',
};
console.log('解析URL参数:', params);
return params;
}
//
const model = {
name: '',
applicationId: -1,
projectId: -1,
fileId: '',
url: '',
accessToken: '',
// Postmate
const initPostmateHandshake = async () => {
const model = new Postmate.Model({
sayHi: (data: any) => {
console.log('sayHi', data);
},
});
return model.then((parent) => {
// accessToken
accessToken.value = parent.model.accessToken || '';
localStorage.setItem('y-code-access-token', accessToken.value);
parent.emit('renderer-ready', 'y-code-renderer is ready');
//
if (accessToken.value) {
initRequestConfig(accessToken.value);
}
handshakeCompleted.value = true;
return accessToken.value;
});
};
//
const { data: file, isFetching } = useQuery({
queryKey: ['getFile'],
queryFn: async () => {
await postmate.then((parent) => {
parent.emit('some-event', 'y-code-renderer is ready');
Object.assign(model, parent.model);
localStorage.setItem('y-code-access-token', model.accessToken || '');
});
//
const initRequestConfig = (token: string) => {
request.useRequest((req) => {
req.headers.set('Authorization', `Bearer ${token}`);
return req;
});
};
return getFile(model.fileId).then(() => {
request.useRequest((req) => {
req.headers.set('Authorization', `Bearer ${model.accessToken}`);
return req;
});
console.log('import.meta.env.NODE_ENV', import.meta.env.NODE_ENV);
const { provider, onReady } = createProvider({
nodeEnv: import.meta.env.NODE_ENV,
service: lowCodeService,
project: { id: model.projectId },
adapter: {
request,
jsonp,
},
});
// -
const initLowCodeEngine = async () => {
//
if (provider.value) return provider.value;
const token =
accessToken.value || localStorage.getItem('y-code-access-token') || '';
if (token) {
initRequestConfig(token);
}
const { provider: lowCodeProvider, onReady } = createProvider({
nodeEnv: import.meta.env.NODE_ENV,
service: lowCodeService,
project: { id: urlParams.value.projectId },
adapter: {
request,
jsonp,
},
});
provider.value = { provider: lowCodeProvider, onReady };
return { provider: lowCodeProvider, onReady };
};
//
const getRenderComponent = async () => {
isLoading.value = true;
ElLoading.service({ text: '低代码文件加载中...' });
try {
// 1.
const { provider: lowCodeProvider, onReady } = await initLowCodeEngine();
// 3.
return new Promise<any>((resolve) => {
onReady(async () => {
const instance = getCurrentInstance();
instance?.appContext.app.use(provider);
renderer.value = await provider.getRenderComponent(model.fileId);
instance?.appContext.app.use(lowCodeProvider);
try {
const renderComponent = await lowCodeProvider.getRenderComponent(
urlParams.value.fileId,
);
console.log('渲染组件获取成功');
resolve(renderComponent);
} catch (error) {
console.error('获取渲染组件失败:', error);
resolve(null);
}
});
});
},
});
//
watch(isFetching, (newVal) => {
if (newVal) {
ElLoading.service({ text: '低代码文件加载中...' });
} else {
} catch (error) {
console.error('获取渲染组件过程出错:', error);
return null;
} finally {
isLoading.value = false;
ElLoading.service().close();
}
};
// 使 useQuery 使
const { data: rendererComponent } = useQuery({
queryKey: ['getRenderer'],
queryFn: getRenderComponent,
enabled: false, //
});
// renderer
watch(rendererComponent, (newVal) => {
if (newVal) {
renderer.value = newVal;
console.log('渲染器组件已更新');
}
});
//
watch(handshakeCompleted, (newVal) => {
if (newVal) {
console.log('握手完成,开始获取渲染组件');
getRenderComponent().then((component) => {
if (component) {
renderer.value = component;
}
});
}
});
//
onMounted(async () => {
// 1.
await initLowCodeEngine();
// 2.
getRenderComponent().then((component) => {
if (component) {
renderer.value = component;
}
});
// 3.
initPostmateHandshake().catch((error) => {
console.warn('握手失败:', error);
});
});
</script>
<template>
<div style="padding: 20px">
<component :is="renderer" v-if="renderer" />
<div
v-else-if="!isLoading"
style="margin-top: 50px; color: red; text-align: center"
>
组件加载失败请检查控制台日志
</div>
</div>
</template>