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

View File

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