共计 2793 个字符,预计需要花费 7 分钟才能阅读完成。
开发环境搭建与项目初始化
首先需要安装 Node.js(建议 v16+)和 npm/yarn。然后通过以下步骤创建项目:

-
创建项目目录并初始化:
mkdir chatgpt-desktop && cd chatgpt-desktop npm init -y -
安装 Electron 和 React 相关依赖:
npm install electron electron-builder --save-dev npm install react react-dom @types/react @types/react-dom --save -
创建基础 Electron 应用结构:
// main.js (Electron 主进程) const {app, BrowserWindow} = require('electron') let mainWindow function createWindow() { mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, contextIsolation: false } }) mainWindow.loadFile('index.html') } app.whenReady().then(createWindow)
Electron 进程通信机制
Electron 采用主进程 + 渲染进程的架构:
- 主进程:管理应用生命周期、原生 GUI
- 渲染进程:显示网页内容(类似浏览器标签页)
通信方式主要有:
-
IPC(进程间通信):
// 主进程 const {ipcMain} = require('electron') ipcMain.on('message', (event, arg) => {console.log(arg) // 打印来自渲染进程的消息 event.reply('reply', 'pong') // 回复消息 }) // 渲染进程 const {ipcRenderer} = require('electron') ipcRenderer.send('message', 'ping') ipcRenderer.on('reply', (event, arg) => {console.log(arg) // 打印 'pong' }) -
Remote 模块(已不推荐):
// 渲染进程中 const {remote} = require('electron') const mainWindow = remote.getCurrentWindow()
ChatGPT API 集成
建议封装独立的 API 服务模块:
// services/chatgpt.js
const axios = require('axios')
class ChatGPT {constructor(apiKey) {
this.client = axios.create({
baseURL: 'https://api.openai.com/v1',
headers: {'Authorization': `Bearer ${apiKey}` }
})
}
async sendMessage(prompt) {
try {
const response = await this.client.post('/completions', {
model: 'text-davinci-003',
prompt,
max_tokens: 150
})
return response.data.choices[0].text
} catch (error) {console.error('API Error:', error.response?.data || error.message)
throw new Error('Failed to get response from ChatGPT')
}
}
}
module.exports = ChatGPT
数据存储方案
根据数据量大小选择存储方式:
-
少量数据:使用 localStorage
// 渲染进程中 localStorage.setItem('apiKey', 'sk-...') const key = localStorage.getItem('apiKey') -
大量结构化数据:使用 IndexedDB
// 使用 Dexie.js 简化操作 import Dexie from 'dexie' const db = new Dexie('ChatHistoryDB') db.version(1).stores({chats: '++id, timestamp, content'}) // 添加记录 await db.chats.add({timestamp: Date.now(), content: 'Hello ChatGPT' })
多窗口管理
实现多窗口聊天界面:
// main.js
const path = require('path')
function createChatWindow(chatId) {
const win = new BrowserWindow({
width: 600,
height: 800,
webPreferences: {preload: path.join(__dirname, 'preload.js')
}
})
win.loadFile(`chat.html?chatId=${chatId}`)
return win
}
ipcMain.handle('open-new-chat', () => {const chatId = Date.now()
createChatWindow(chatId)
return chatId
})
性能优化建议
- 减少 IPC 通信:批量发送消息而不是频繁小消息
- 使用 Web Workers 处理 CPU 密集型任务
- 启用硬件加速(在 BrowserWindow 配置中设置
webPreferences: {hardwareAcceleration: true}) - 对于频繁更新的 UI,考虑使用 React 虚拟列表(如 react-window)
避坑指南
打包问题
使用 electron-builder 时常见问题:
- 图标无法加载:确保图标文件路径正确,建议使用 512×512 PNG
- 打包后无法运行:检查是否包含所有依赖,测试
npm run package和npm run make - 杀毒软件误报:考虑代码签名(需要购买证书)
跨平台兼容性
- 路径处理始终使用
path.join() - 避免使用平台特定 API(如 Windows 注册表)
- 测试各平台菜单栏差异
API 密钥安全
- 不要硬编码在代码中
- 不要提交到版本控制
- 推荐方案:
- 首次运行时让用户输入
- 使用 electron-store 加密保存
- 考虑使用密钥管理服务
进一步学习
建议探索方向:
1. 如何实现对话历史同步到云端?
2. 语音输入 / 输出集成方案
3. 插件系统设计
思考问题
- 如何实现离线模式下的部分功能?
- 当 API 响应慢时,如何优化用户体验?
- 如何设计可扩展的插件架构?
希望这篇指南能帮助你快速入门 ChatGPT 桌面端开发!遇到问题可以查阅 Electron 和 React 的官方文档,或者参与相关社区讨论。
正文完
发表至: 未分类
近两天内
