docs/archives/105-output-display-v2/implementation.md
本文档记录了 OutputDisplay V2 的实现过程,包括设计实现、问题修复和验证测试的完整流程。
V2 版本采用了全新的组件架构,核心变化包括:
OutputDisplay.vue (包装器)
├── OutputDisplayCore.vue (核心组件)
│ ├── 统一顶层工具栏
│ ├── 推理面板 (可选)
│ └── 主内容区域
└── OutputDisplayFullscreen.vue (全屏模式)
└── OutputDisplayCore.vue (复用核心组件)
isHovering, isEditing, manualToggleActive 等internalViewMode 驱动视图切换V2 版本采用了更纯粹的依赖注入模式:
interface OutputDisplayCoreProps {
// ... 其他 props
compareService: ICompareService // 必需的服务依赖
}
在 V2 重构过程中,发现了一个关键的依赖注入不完整问题:
根本原因:依赖注入不完整。
OutputDisplayCore.vue 被正确修改,期望从 props 接收 compareServiceOutputDisplay.vue 和 OutputDisplayFullscreen.vue 没有进行配套修改错误表现:
OutputDisplayCore.vue:317 Uncaught (in promise) Error: CompareService is required but not provided
采用分层修复策略,确保依赖注入链条完整:
// packages/ui/src/types/services.ts
export interface AppServices {
// ... 现有服务
compareService: ICompareService; // 新增
}
// packages/ui/src/composables/useAppInitializer.ts
// Web 和 Electron 环境都创建 CompareService 实例
const compareService = createCompareService();
// packages/ui/src/index.ts
export { createCompareService } from '@prompt-optimizer/core'
export type { ICompareService } from '@prompt-optimizer/core'
<template>
<OutputDisplayCore
:compareService="compareService"
<!-- 其他 props -->
/>
</template>
<script setup lang="ts">
// 注入服务
const services = inject<Ref<AppServices | null>>('services');
const compareService = computed(() => {
// fail-fast 错误检查
if (!services?.value?.compareService) {
throw new Error('CompareService未初始化');
}
return services.value.compareService;
});
</script>
<template>
<OutputDisplayCore
:compareService="compareService"
<!-- 其他 props -->
/>
</template>
<script setup lang="ts">
// 相同的注入和错误检查逻辑
</script>
CompareService 特性分析:
结论:CompareService 可以直接在渲染进程中运行,无需 IPC 代理。
修复方案遵循了现有架构模式:
inject 获取服务(与其他组件一致)应用启动验证
操作:访问 http://localhost:18181
预期:应用正常加载,无控制台错误
结果:✅ 通过
基础功能测试
操作:输入原始提示词 "请帮我写一个简单的Python函数"
预期:输入框正常响应,对比按钮出现
结果:✅ 通过 - 对比按钮 (ref=e176) 正常显示
优化功能测试
操作:点击 "开始优化 →" 按钮
预期:优化过程正常,生成详细的提示词
结果:✅ 通过 - 生成了完整的 Python 代码生成助手提示词
对比功能核心测试
操作:点击 "对比" 按钮
预期:
- 切换到对比视图
- 显示文本差异高亮
- 对比按钮变为禁用状态
- 无控制台错误
结果:✅ 完全通过
- 对比视图正常激活
- 差异高亮正确显示:
* 红色删除:原始文本片段
* 绿色添加:优化后的详细内容
- 按钮状态正确(disabled)
- 控制台无任何错误
对比功能激活后的界面状态:
+----------------------------------------------------------------------+
| [渲染] [原文] [对比*] [复制] [全屏] |
+----------------------------------------------------------------------+
| 请帮我 | # Role: Python代码生成助手 ## Profile - language: 中文... |
| 写 | ...详细的角色定义、技能描述、规则和工作流程... |
| 一 | ... |
| 个简单的Python函数 | ... |
+----------------------------------------------------------------------+
* 对比按钮处于禁用状态,表示当前处于对比模式
红色部分:原始文本中被删除的内容
绿色部分:优化后新增的详细内容
关键日志记录:
[LOG] [AppInitializer] 所有服务初始化完成
[LOG] All services and composables initialized.
[LOG] 流式响应完成
无错误日志:整个测试过程中没有出现任何 JavaScript 错误或警告。
本次修复成功解决了 OutputDisplay V2 重构中的依赖注入不完整问题:
OutputDisplay V2 现已完全就绪,对比功能正常工作,为用户提供了优秀的文本差异查看体验。