ChatGPT桌面应用实战:如何打造类似豆包的Windows免费客户端

1次阅读
没有评论

共计 3310 个字符,预计需要花费 9 分钟才能阅读完成。

image.webp

背景痛点:为什么需要桌面客户端?

每次打开浏览器访问 ChatGPT 网页版时,总会遇到几个烦人的问题:

ChatGPT 桌面应用实战:如何打造类似豆包的 Windows 免费客户端

  • 历史记录管理困难:每次重新打开浏览器都要从头开始对话,找不到昨天的重要聊天记录
  • 多窗口混乱:和十几个其他标签页混在一起,经常误关闭或找不到 ChatGPT 标签
  • 功能局限:无法使用系统快捷键、没有本地存储空间、无法离线查看历史对话

桌面客户端能完美解决这些问题。就像豆包那样,一个独立的窗口,常驻任务栏,还能保存所有对话记录。更重要的是——我们可以自己动手做一个!

技术选型:为什么选择 Electron?

构建跨平台桌面应用主要有几个选择:

  1. Electron:
  2. 成熟稳定,GitHub、VSCode 等知名应用都在用
  3. 基于 Chromium,前端开发体验流畅
  4. 丰富的 npm 生态,各种现成插件

  5. Tauri:

  6. 更轻量,打包体积小
  7. Rust 编写,性能更好
  8. 但生态还不够完善,中文资料少

  9. NW.js:

  10. 类似 Electron 但社区更小
  11. 配置方式较老旧

综合来看,Electron 是最佳选择——资料多、坑少、适合快速开发。虽然打包体积大些(约 120MB),但对现代电脑根本不是问题。

核心实现步骤

1. 搭建基础框架

先初始化项目:

# 创建项目目录
mkdir chatgpt-desktop && cd chatgpt-desktop

# 初始化 package.json
npm init -y

# 安装 Electron
npm install electron --save-dev

# 安装 Vue3
npm install vue@next @vitejs/plugin-vue

创建 Electron 的主进程文件main.js:

const {app, BrowserWindow} = require('electron')
const path = require('path')

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  })

  // 加载 Vue 开发服务器或打包后的文件
  if(process.env.NODE_ENV === 'development') {win.loadURL('http://localhost:3000')
  } else {win.loadFile(path.join(__dirname, 'dist/index.html'))
  }
}

app.whenReady().then(createWindow)

2. 集成 ChatGPT API

首先获取 OpenAI API Key,然后封装请求方法:

// src/utils/chatgpt.js
export async function sendMessage(message, history = []) {
  const response = await fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${import.meta.env.VITE_OPENAI_KEY}`
    },
    body: JSON.stringify({
      model: 'gpt-3.5-turbo',
      messages: [...history, {role: 'user', content: message}]
    })
  })

  if (!response.ok) {throw new Error(`API 请求失败: ${response.status}`)
  }

  const data = await response.json()
  return data.choices[0].message.content
}

3. 实现本地存储

选择 IndexedDB 作为存储方案(比 localStorage 容量大,比 SQLite 简单):

// src/utils/db.js
const DB_NAME = 'chatgpt_db'
const STORE_NAME = 'conversations'

let db = null

export async function initDB() {return new Promise((resolve, reject) => {const request = indexedDB.open(DB_NAME, 1)

    request.onerror = (event) => {console.error('数据库打开失败', event)
      reject(event)
    }

    request.onsuccess = (event) => {
      db = event.target.result
      resolve(db)
    }

    request.onupgradeneeded = (event) => {
      const db = event.target.result
      if (!db.objectStoreNames.contains(STORE_NAME)) {db.createObjectStore(STORE_NAME, { keyPath: 'id'})
      }
    }
  })
}

export function saveConversation(conversation) {return new Promise((resolve, reject) => {const transaction = db.transaction(STORE_NAME, 'readwrite')
    const store = transaction.objectStore(STORE_NAME)
    const request = store.put(conversation)

    request.onsuccess = () => resolve()
    request.onerror = (event) => reject(event)
  })
}

性能优化技巧

  1. 内存泄漏预防:
  2. 在 Vue 组件卸载时取消所有未完成的 API 请求
  3. 使用 Electron 的 webContents.getZoomFactor() 防止内存暴涨

  4. 响应速度优化:

  5. 预加载常用界面
  6. 对 API 响应实现客户端缓存
// 预加载示例
win.webContents.on('did-finish-load', () => {
  win.webContents.executeJavaScript(`
    localStorage.setItem('cachedData', '...')
  `)
})

常见问题解决方案

  1. API 限流处理:
  2. 实现请求队列和自动重试
  3. 添加备用 API Key 轮换机制

  4. 安装包签名:

  5. 使用 electron-builder 配合 Windows 证书签名
  6. 或考虑购买便宜的代码签名证书

  7. 跨域问题:

  8. 在 electron-builder 配置中添加 extraFiles 包含证书文件
  9. 或配置代理服务器

进阶功能建议

  1. Markdown 渲染:
  2. 集成 markdown-it 库
  3. 添加代码高亮支持

  4. 快捷指令:

  5. 监听全局快捷键
  6. 实现类似 /save 这样的命令
// 全局快捷键示例
const {globalShortcut} = require('electron')

globalShortcut.register('CommandOrControl+Shift+C', () => {win.webContents.send('shortcut-copy')
})

打包发布

使用 electron-builder 打包:

  1. 安装依赖:

    npm install electron-builder --save-dev

  2. 配置 package.json:

    "build": {
      "appId": "com.example.chatgptdesktop",
      "win": {
        "target": "nsis",
        "icon": "build/icon.ico"
      }
    }

  3. 打包命令:

    npm run build

现在你就拥有了一个和豆包体验类似的 ChatGPT 桌面客户端!整个过程大约需要 2 - 3 天开发时间,但绝对值得——毕竟再也不用在浏览器标签海里找 ChatGPT 了。

下次可以试试添加更多功能,比如语音输入、对话导出 PDF,或者集成其他 AI 服务。桌面客户端的可能性是无限的!

正文完
 0
评论(没有评论)