|
|
3 дней назад | |
|---|---|---|
| resources | 1 месяц назад | |
| scripts | 1 месяц назад | |
| src | 3 дней назад | |
| .gitignore | 1 месяц назад | |
| README.md | 3 недель назад | |
| electron.vite.config.ts | 1 месяц назад | |
| logo.png | 1 месяц назад | |
| logo_big.png | 1 месяц назад | |
| package.json | 3 дней назад | |
| tsconfig.json | 1 месяц назад | |
| tsconfig.node.json | 1 месяц назад | |
| tsconfig.web.json | 1 месяц назад |
这是一个使用 Electron 和 React 构建的仿微信 PC 客户端桌面应用。
项目名称: 韫珠IM
项目类型: 基于 Electron 的桌面即时通讯客户端
技术栈: Electron + React + TypeScript + Vite
local_client/
├── src/
│ ├── main/ # 主进程代码
│ │ └── index.ts # 窗口管理、IPC通信、系统托盘等
│ ├── preload/ # 预加载脚本
│ │ └── index.ts # 安全地暴露 Electron API 给渲染进程
│ └── renderer/ # 渲染进程(React应用)
│ ├── index.html # HTML入口
│ └── src/
│ ├── App.tsx # 主应用组件
│ ├── components/ # React组件
│ │ ├── Login.tsx # 登录组件
│ │ ├── ContactList.tsx # 联系人列表
│ │ ├── ChatWindow/ # 聊天窗口组件
│ │ ├── Navigation.tsx # 导航栏
│ │ └── Modals/ # 模态框组件
│ ├── hooks/ # 自定义Hooks
│ │ ├── useAuth.ts # 认证Hook
│ │ ├── useContacts.ts # 联系人Hook
│ │ ├── useMessages.ts # 消息Hook
│ │ └── useWebSocket.ts # WebSocket Hook
│ ├── services/ # API和WebSocket服务
│ │ ├── api.ts # REST API调用
│ │ └── websocket.ts # WebSocket连接管理
│ ├── pages/ # 页面组件
│ │ └── ChatPage.tsx # 聊天页面
│ ├── types/ # TypeScript类型定义
│ │ └── index.ts
│ └── utils/ # 工具函数
│ ├── logger.ts # 日志工具
│ ├── timeUtils.ts # 时间工具
│ ├── messageUtils.ts # 消息工具
│ └── avatarUtils.tsx # 头像工具
├── resources/ # 资源文件(logo等)
├── logs/ # 日志文件
├── out/ # 构建输出目录
├── package.json # 项目配置
├── electron.vite.config.ts # Electron-Vite配置
└── tsconfig.json # TypeScript配置
npm install
npm run dev
这将:
http://127.0.0.1:3000/api → https://api.hnyunzhu.comelectron.vite.config.ts:
externalizeDepsPlugin/api 代理到 https://api.hnyunzhu.com主要开发文件:
src/main/index.ts: 主进程逻辑(窗口、IPC、系统托盘)src/renderer/src/App.tsx: 主应用组件src/renderer/src/services/api.ts: REST API 调用src/renderer/src/services/websocket.ts: WebSocket 连接管理npm run preview
首先需要构建项目(编译 TypeScript,打包资源):
npm run build
该命令会:
out/main/out/preload/out/renderer/项目使用 electron-builder 进行打包。
npm run pack
npm run dist
这将执行 build 和 pack 两个步骤,生成完整的安装包。
打包完成后,安装包将输出到 dist/ 目录:
韫珠IM Setup x.x.x.exe (NSIS 安装程序)韫珠IM-x.x.x.dmg (DMG 镜像)韫珠IM-x.x.x.AppImage (AppImage 格式)打包配置位于 package.json 的 build 字段:
com.hnyunzhu.im韫珠IMdist/resources/icon.ico,macOS/Linux 使用 resources/logo.pngscripts/afterPack.js(通过 rcedit 将图标嵌入 Windows exe)如果需要为特定平台打包,可以使用环境变量:
# Windows
npm run dist -- --win
# macOS
npm run dist -- --mac
# Linux
npm run dist -- --linux
应用使用 electron-updater 配合自建更新服务器实现自动更新,仅在生产环境生效(开发模式不检测更新)。
更新地址在 package.json 的 build.publish 中配置:
"publish": {
"provider": "generic",
"url": "https://api.hnyunzhu.com:9004/app-updates/1773848909/windows/update/"
}
客户端会请求该 URL 下的 latest.yml 判断是否有新版本。
package.json 中将 version 改为新版本号(如 1.0.5)。npm run dist,在 dist/ 目录得到:
韫珠IM Setup x.x.x.exe(安装包)latest.yml(更新元数据,electron-updater 据此检测与下载)dist/latest.yml,在末尾增加 releaseNotes 字段,应用会在「有更新」和「下载完成」时展示该内容: releaseNotes: |
1. 修复若干问题
2. 新增 xxx 功能
3. 优化性能
单行可写为:releaseNotes: "1. 修复若干问题;2. 新增 xxx 功能"
dist/latest.yml 和 dist/韫珠IM Setup x.x.x.exe(及同名的 .exe.blockmap,若有)上传到上述 publish.url 对应目录,保证可通过 https://api.hnyunzhu.com:9004/app-updates/1773848909/windows/update/latest.yml 和同目录下的 exe 被访问。latest.yml 中有 releaseNotes)。electron-updater(见 package.json 的 dependencies)。src/main/index.ts 中注册 autoUpdater 事件、check-for-updates IPC、5 小时定时检测及 quit-and-install。src/renderer/src/App.tsx 中监听更新事件、展示下载进度与强制更新弹窗;src/renderer/src/components/Modals/SettingsModal.tsx 中「检查更新」按钮与状态展示。主进程 (src/main/index.ts)
渲染进程 (src/renderer/)
预加载脚本 (src/preload/index.ts)
electron: ^28.0.0 - Electron 框架electron-vite: ^2.0.0 - Electron + Vite 构建工具react: ^18.2.0 - React UI 框架typescript: ^5.0.2 - TypeScript 语言vite: ^5.0.0 - 构建工具crypto-js: ^4.2.0 - 加密库(用于签名认证)electron-builder: ^26.8.1 - 打包工具在 src/main/index.ts 中:
mainWindow.webContents.setWindowOpenHandler((details) => {
// 拦截所有 http/https 链接
if (details.url.startsWith('http')) {
createInternalBrowserWindow(details.url)
return { action: 'deny' } // 阻止默认行为
}
return { action: 'allow' }
})
在 src/renderer/src/App.tsx 中:
链接必须带有 target="_blank" 属性才能触发上述拦截。
<a href="..." target="_blank">...</a>
项目支持多种窗口类型:
WebSocket 服务位于 src/renderer/src/services/websocket.ts,支持:
API 配置:
https://api.hnyunzhu.com日志文件:
logs/ 目录2026-02-26.log)资源文件:
app_icon.png 用于应用图标(已配置)resources/logo.png 用于其他资源app_icon.png 已满足要求窗口管理:
安全设置:
contextIsolation 和 sandbox 模式确保安全性打包注意事项:
image must be at least 256x256 错误,说明图标尺寸不够,需要准备至少 256x256 像素的图标文件,或暂时移除图标配置winCodeSign),其压缩包中包含 macOS 符号链接文件,在非管理员模式下解压会失败。当前配置已通过 forceCodeSigning: false、signAndEditExecutable: false 和环境变量禁用代码签名。npm run dist:portable 生成便携版(不需要签名)dist/win-unpacked/韫珠IM.exe 运行应用Windows exe 图标嵌入机制:
signAndEditExecutable: false 会导致 electron-builder 跳过图标嵌入步骤,exe 文件和任务栏将无法显示自定义图标afterPack 钩子 (scripts/afterPack.js) 使用 rcedit 手动将 resources/icon.ico 嵌入到 exe 中,绕过了 winCodeSign 的下载问题scripts/afterPack.js 文件和 rcedit 依赖,否则打包后 exe 和任务栏将没有图标resources/icon.ico 即可。ico 文件建议包含多尺寸(16x16、32x32、48x48、256x256),Windows 在不同场景使用不同尺寸:
src/main/index.ts 中的 Tray 在运行时从文件加载,不依赖 exe 嵌入signAndEditExecutable 影响npm run dev: 启动开发服务器npm run build: 构建项目(编译 TypeScript,打包资源)npm run preview: 预览构建结果npm run pack: 仅打包(不重新构建)npm run dist: 构建并打包 NSIS 安装程序(推荐用于生产环境)npm run dist:portable: 构建并打包便携版(单 exe,无需安装)MIT