DuRT 前端开发指南

1. 技术选型与版本

- **核心框架**: Electron 24.0.0 (支持 macOS 原生 API 集成)
- **UI 框架**: React 18.2 + TypeScript 5.0 
- **状态管理**: Jotai 2.0 (轻量级原子状态)
- **样式方案**: Tailwind CSS 3.3 + CSS Modules
- **关键依赖**:
  - `system-sounds`: 1.2.0 (麦克风访问)
  - `electron-positon`: 2.1.3 (悬浮窗定位)
  - `onnxruntime-web`: 1.15.0 (本地模型推理)
- **构建工具**: Vite 4.3 + electron-builder 24.5

2. 架构设计

🔄 正在加载流程图...

graph TD A[主进程] -->|IPC通信| B[渲染进程] B --> C[语音捕获模块] B --> D[本地AI服务] B --> E[悬浮窗UI] D --> F[ONNX模型] C -->|音频流| D D -->|识别结果| E

3. 核心模块实现

3.1 悬浮窗系统

// FloatingWindow.tsx
import { useDraggable } from '@dnd-kit/core';

export default function FloatingWindow() {
  const { attributes, transform } = useDraggable({ id: 'durt-window' });
  
  return (
    <div 
      className="fixed shadow-2xl rounded-lg bg-opacity-90 backdrop-blur-md"
      style={{ 
        transform: `translate3d(${transform?.x}px, ${transform?.y}px, 0)`,
        top: '10%',
        right: '2%',
        zIndex: 9999 
      }}
      {...attributes}
    >
      <TranslationResultDisplay />
      <MicrophoneIndicator />
    </div>
  );
}

3.2 语音处理流程

// speechService.js
const { ipcRenderer } = require('electron');

const startRecognition = () => {
  navigator.mediaDevices.getUserMedia({ audio: true })
    .then(stream => {
      const processor = new AudioWorkletNode('recognition-processor.worklet');
      processor.port.onmessage = ({ data }) => {
        ipcRenderer.send('audio-chunk', data); // 发送到主进程AI推理
      };
    });
};

// 主进程处理
ipcMain.on('audio-chunk', (_, chunk) => {
  const results = ortSession.run({ input: new Float32Array(chunk) });
  mainWindow.webContents.send('translation-update', results);
});

3.3 性能优化策略

  1. 渲染优化
    • 使用 React.memo 避免结果文本重复渲染
    • Canvas 绘制音频波形替代 DOM 操作
  2. 内存管理
    • 音频流分块处理(200ms/块)
    • Web Workers 处理音频预处理
  3. GPU加速
    .floating-window {
      will-change: transform, opacity;
      contain: strict;
    }

4. 安全与隐私实现

### 4.1 数据安全
- 所有音频处理在本地完成(无网络请求)
- 使用 Electron 的 `safeStorage` 加密用户配置
- 禁用远程模块:`webPreferences: { nodeIntegration: false }`

### 4.2 权限控制
```javascript
// main.js
app.on('ready', () => {
  systemPreferences.askForMediaAccess('microphone'); // macOS权限请求
});

5. 可扩展性设计

// 插件接口设计
interface ITranslationPlugin {
  id: string;
  process(text: string): Promise<string>;
}

const pluginManager = {
  register(plugin: ITranslationPlugin) {
    // 注册第三方翻译引擎
  }
};

// 示例:DeepL插件集成
pluginManager.register({
  id: 'deepl',
  async process(text) {
    return await deepLTranslate(text); 
  }
});

6. 开发流程

# 环境配置
npm install -g electron-forge

# 启动开发
npm run dev # 同时启动React和Electron

# 构建命令
npm run make -- --platform=darwin

# 测试要点
- 悬浮窗置顶测试 (CMD+Tab切换验证)
- 内存泄漏测试 (持续录音1小时)
- 隐私合规测试 (使用Consolation.app监控API调用)

7. 异常处理机制

// 全局错误捕获
process.on('uncaughtException', (err) => {
  logService.sendCrashReport(err);
  showErrorOverlay('系统遇到意外错误');
});

// 音频恢复策略
navigator.mediaDevices.ondevicechange = () => {
  if (!currentStream.active) {
    reconnectAudio();
  }
};

最佳实践建议

  1. 使用 electron-updater 实现静默更新
  2. 悬浮窗添加 NSScreen 边界检测防止越界
  3. 采用 CoreML 替代 ONNX 提升M系列芯片性能30%

本指南覆盖了从架构设计到具体实现的关键路径,重点解决本地AI集成、高性能悬浮窗、隐私保护三大核心需求。通过模块化设计保证后续可扩展第三方翻译服务,同时严格遵循Apple人机交互指南确保原生体验。