docs/archives/102-web-architecture-refactor/composables-refactor.md
解决在异步回调中调用 Vue Composable 函数导致的错误:Uncaught (in promise) SyntaxError: Must be called at the top of a 'setup' function。重构所有 Composable 文件,实现"顶层声明,响应式连接,内部自治"的设计模式。
packages/ui/src/types/services.ts 文件,定义 AppServices 接口services: Ref<AppServices | null> 参数error 状态services 对象与 AppServices 接口不匹配,特别是 dataManager 属性as any 临时解决,但仍有类型错误DataManager 类型定义和实现// ❌ 错误:在异步回调中调用Composable
onMounted(async () => {
const services = await initServices();
const modelManager = useModelManager(); // 错误:不在setup顶层调用
});
// ✅ 正确:顶层声明,响应式连接
const { services } = useAppInitializer(); // 在顶层调用
const modelManager = useModelManager(services); // 在顶层调用,传入services引用
// 内部实现:响应式连接
export function useModelManager(services: Ref<AppServices | null>) {
// 状态定义...
// 响应式连接:监听服务就绪
watch(services, (newServices) => {
if (!newServices) return;
// 使用已就绪的服务...
}, { immediate: true });
return { /* 返回状态和方法 */ };
}
// packages/ui/src/types/services.ts
export interface AppServices {
storageProvider: IStorageProvider;
modelManager: IModelManager;
templateManager: ITemplateManager;
historyManager: IHistoryManager;
dataManager: DataManager;
llmService: ILLMService;
promptService: IPromptService;
}
核心目标 80% 达成:
Must be called at the top of a 'setup' function 错误技术实现:
AppServices 接口useAppInitializer 的错误处理和日志记录架构特点:
<script setup> 顶层调用services: Ref<Services | null> 参数watch(services, ...) 响应服务就绪解决 App.vue 类型错误:
DataManager 类型定义和实现useAppInitializer 返回的对象结构AppServices 接口或服务实现添加错误处理UI:
useAppInitializer 返回的 error 状态编写架构指南:
<script setup> 顶层同步调用watch(services, ...) 模式处理服务的异步初始化任务状态: ⚠️ 部分完成,需要解决类型错误
完成度: 80%
最后更新: 2025-07-01