HiKid架构拆解:electron-vite三进程模型构建跨平台桌面应用完整实践
【免费下载链接】hi-kidHiKid - Your AI English Pal. A desktop app built with React and TypeScript, targeting children in non-English-speaking countries who want to practice English speaking and listening.项目地址https://gitcode.com/gh_mirrors/hi/hi-kid点击查看免费下载HiKid 是一款免费开源的AI 英语陪练桌面应用专为非英语国家儿童设计支持语音对话、故事讲述与单词游戏且完全离线运行。本文将完整拆解 HiKid 如何基于electron-vite 三进程模型Main 主进程、Preload 预加载、Renderer 渲染进程构建跨平台桌面应用覆盖目录结构、IPC 通信、路径别名与 electron-builder 打包全流程。HiKid 是什么先看效果HiKid 的界面是一只可爱的小猫Kitten按住麦克风说话AI 会理解你的英语并用语音回答。所有录音、语音识别ASR、大模型对话与语音合成TTS都在本地完成数据不出机器。技术上HiKid 的核心选型非常主流层面选型说明桌面框架Electron 39提供窗口、文件系统、子进程等系统能力构建工具electron-vite 5 Vite 7一条命令同时构建三个进程前端React 19 TypeScript 5.9渲染进程是一个标准 React SPA打包electron-builder 26一键产出 win / mac / linux 安装包测试Vitest 4主进程服务层单元测试目录结构三进程一目了然electron-vite 项目最直观的特点就是src/下按进程划分的目录HiKid 完全遵循这一约定hi-kid/ ├── electron.vite.config.ts # electron-vite 构建配置三个构建目标 ├── electron-builder.yml # 跨平台打包配置 ├── package.json # 启动/构建/打包脚本 ├── src/ │ ├── main/ # ① 主进程Node.js 环境 │ │ ├── index.ts # 应用入口窗口创建、生命周期 │ │ ├── ipc/channels.ts # IPC 通道注册业务逻辑中枢 │ │ ├── services/ # 服务层agent、recorder、servers… │ │ └── __tests__/ # Vitest 单元测试 │ ├── preload/ # ② 预加载脚本安全桥 │ │ ├── index.ts # contextBridge 暴露 window.api │ │ └── index.d.ts # 渲染进程可用的全局类型声明 │ ├── renderer/ # ③ 渲染进程React SPA │ │ ├── index.html │ │ └── src/ # App.tsx、组件、hooks │ └── shared/ # ④ 三进程共享代码i18n 等这套结构的直接好处每个文件属于哪个进程、能用哪些 API一眼就能判断。比如services/recorder.ts用了 Node 的fs和子进程它只能在主进程而Kitten.tsx只用 React属于渲染进程。主进程Main应用的生命线主进程入口是 src/main/index.ts职责清晰创建 BrowserWindow900×860 的无边框菜单栏窗口并通过webPreferences.preload挂上预加载脚本区分开发/生产加载开发环境加载ELECTRON_RENDERER_URL支持 HMR 热更新生产环境加载打包后的本地index.html管理生命周期app.whenReady()时注册 IPC、创建窗口before-quit/window-all-closed时调用cleanup()停止本地 TTS/ASR 服务与语音播放避免残留子进程跨平台细节macOS 自定义应用菜单显示 HiKid、Windows 设置 AppUserModelId、Linux 单独设置窗口图标。业务逻辑则集中在 src/main/ipc/channels.ts它通过ipcMain.handle注册了全部请求通道服务启停、录音、模型下载、配置读写等并借助webContents.send主动向渲染进程推送事件。底层的实际能力由 src/main/services/ 下的模块化服务承担agent.ts— 大模型对话 Agent含打断、流式输出recorder.ts— 带 VAD静音检测的录音servers.ts— 本地 TTS / ASR 服务进程管理download.ts/releases.ts— 模型下载与安装清单config.ts— 用户配置持久化~/.config/hi-kidlogger.ts、window.ts— 日志与主窗口引用这种入口薄、通道集中、服务独立的分层是三进程项目保持可维护性的关键实践。Preload 进程安全的关键桥梁渲染进程运行在沙箱浏览器环境里无法直接访问 Node.js。electron-vite 的三进程模型中Preload 正是补上这一环的角色——它通过contextBridge.exposeInMainWorld把白名单式的 API 挂到window上。看 src/preload/index.ts 的收尾代码if (process.contextIsolated) { contextBridge.exposeInMainWorld(electron, electronAPI) contextBridge.exposeInMainWorld(api, api) }这里暴露了两个对象window.electron— 来自electron-toolkit/preload提供窗口控制最小化、关闭等window.api— HiKid 自定义 API全部基于ipcRenderer.invoke的 Promise 调用例如sendMessage(text)、startRecording()、setConfig(config)。更值得一提的是类型安全src/preload/index.d.ts 用全局declare global声明了window.api的完整接口渲染进程里写window.api.startRecording()时能获得完整的智能提示和参数校验——新增一个 IPC 功能只需四处改动preload 定义 → d.ts 类型 → main 处理 → renderer 调用流程在 CLAUDE.md 中有明确约定。渲染进程Renderer一个标准 React SPA渲染进程与做 Web 前端没有任何区别src/renderer/src/main.tsx 挂载根组件src/renderer/src/App.tsx 负责屏幕状态机loading → 依赖检查 → 模型下载 → 引导页 → 对话页并通过两个 hooks 与主进程解耦useConversation— 订阅kitten:state、transcription、llm:delta等事件驱动小猫状态机idle / listening / thinking / speaking与聊天气泡useConfig— 读取与保存 AI 名称、System Prompt、模型接入地址等配置。组件按功能拆分在 src/renderer/src/components/Kitten、VoiceButton、ChatBubbles、SettingsPanel 等共享的 i18n 资源放在src/shared/实现同一份文案在中英文界面复用。IPC 通信设计invoke 请求 事件推送HiKid 的 IPC 分为两类这也是桌面应用通信的通用范式方向机制典型通道渲染 → 主请求/响应ipcRenderer.invokeipcMain.handleservices:start、recorder:start、config:set、models:download主 → 渲染事件推送webContents.sendipcRenderer.onkitten:state、transcription、llm:delta、tts:event、download:progress、error请求/响应通道天然适合有返回值的操作如读取配置而语音对话天然是流式的——识别出文字推transcription、模型逐字输出推llm:delta、开始/停止发音推tts:event。渲染进程只需订阅事件UI 就会自动活起来。订阅类 API 在 preload 中还统一返回一个取消函数onKittenState(cb)返回() unsubscribe配合 React 的useEffect清理函数能优雅避免事件监听泄漏——这是一个很值得抄作业的细节。路径别名与构建electron.vite.config.ts 只需十几行三进程项目的构建配置出奇地简单因为 electron-vite 默认就按src/main、src/preload、src/renderer三个约定目录分别构建。HiKid 的配置 electron.vite.config.ts 只额外做了两件事为 renderer 注入renderer→src/renderer/src、shared→src/shared的路径别名启用vitejs/plugin-react支持 JSX 与 HMR。三个 TypeScript 工程tsconfig.json、tsconfig.node.json、tsconfig.web.json分别覆盖 mainpreload、web 与渲染层npm run typecheck可分别校验。构建产物统一输出到out/目录main / preload / renderer 三份 bundlepackage.json的main字段直接指向./out/main/index.js。开发体验方面package.json 提供了完整的脚本链npm run dev # electron-vite dev三进程并行构建 热更新 npm start # 生产模式预览 npm run build:win # 打包 Windows 安装包 npm run build:mac # 打包 macOS 应用 npm run build:linux# 打包 Linux 版本跨平台打包与工程化打包交给 electron-builderelectron-builder.yml 描述通用配置另有 electron-builder.bundled.yml 用于内嵌依赖的 macOS 精简发行包配合 scripts/prepare-bundled.js 预处理。工程化配套同样齐整单元测试src/main/tests/ 下对 agent、config、i18n、logger、recorder、window 等服务逐一覆盖npm test即跑 Vitest规范检查ESLint 9 flat config Prettiernpm run lint/npm run format需求与计划文档docs/plans/ 与 docs/brainstorms/ 保留了语音对话集成、可配置 AI 等特性的需求与实施记录是很好的功能演进参考安装文档INSTALL.md / INSTALL-cn.md 分中英文说明依赖准备。动手跑起来本地环境要求 Node.js ≥ 20git clone https://gitcode.com/gh_mirrors/hi/hi-kid cd hi-kid npm install npm run dev # 开发模式带热更新总结三进程模型的实践要点通过 HiKid 这个项目可以提炼出 electron-vite 三进程架构的 5 个可复用实践目录即进程src/main/src/preload/src/renderer物理隔离杜绝跨进程误用 API白名单暴露preload 只暴露最小 API 面并用.d.ts让调用方享受完整类型提示双向通信分层请求用invoke流式状态用send 订阅订阅 API 返回取消函数入口薄、服务厚主进程入口只管窗口与生命周期业务下沉到services/便于单测一条命令跨平台electron-vite 管构建electron-builder 管打包build:win/mac/linux各一行。这套模式简单、可预期是构建跨平台 Electron 桌面应用的可靠起点。赞分享【免费下载链接】hi-kidHiKid - Your AI English Pal. A desktop app built with React and TypeScript, targeting children in non-English-speaking countries who want to practice English speaking and listening.项目地址https://gitcode.com/gh_mirrors/hi/hi-kid点击查看免费下载相关推荐SimVLA-LIBERO部署实战快速将模型应用到真实机器人系统SimVLA LIBERO部署实战快速将模型应用到真实机器人系统 想要快速将先进的视觉 语言 动作VLA模型部署到真实机器人系统吗SimVLA LIBE让旧 Mac 运行新版 macOS 的免费完整方案 OpenCore Legacy Patcher让旧 Mac 运行新版 macOS 的免费完整方案 OpenCore Legacy Patcher 新版 macOS 不再列出你的机型升级却不必就此停下。Op操作系统固件驱动开发daisyUI × Electron用纯 CSS 组件库构建跨平台桌面应用 UI 的完整实践daisyUI × Electron用纯 CSS 组件库构建跨平台桌面应用 UI 的完整实践 本文围绕 daisyUI 官方文档 Electron compo前端UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

CubeSandbox:企业级安全工作流的可信执行底座

CubeSandbox:企业级安全工作流的可信执行底座

1. 项目概述:为什么企业安全执行面需要 CubeSandbox 这个“保险箱”最近在给三家制造业客户做安全架构复盘时,反复被问到一个问题:“我们部署了 OpenClaw 做自动化响应,也装了 DSH(Defense Shell)做终端策略…

2026/10/14 15:18:12 阅读更多 →
Go语言内存优化利器:betteralign工具实战指南

Go语言内存优化利器:betteralign工具实战指南

1. 项目概述:betteralign 工具的核心价值betteralign 是一个专门为 Go 语言开发者设计的内存优化工具,它通过智能分析结构体字段排列顺序,可以显著减少内存占用。在实际测试中,这个工具能让典型结构体的内存消耗降低 30-50%&#…

2026/10/14 15:18:12 阅读更多 →
Codex 半年使用总结:省 Token 技巧与计划模式实战

Codex 半年使用总结:省 Token 技巧与计划模式实战

1. 半年迭代里,Codex 到底变了哪些东西从去年底开始把 Codex 当作日常主力编码助手用到现在,差不多半年时间。这半年里它的更新节奏不算快,但每一次改动都挺有针对性,尤其是围绕 Token 消耗和交互模式这两块,变化比我一…

2026/10/14 15:18:12 阅读更多 →

最新新闻

shadcn-dashboard-landing-template部署指南:Vercel、Netlify与静态托管方案对比

shadcn-dashboard-landing-template部署指南:Vercel、Netlify与静态托管方案对比

【免费下载链接】shadcn-dashboard-landing-template Accelerate your development with a sleek, open-source admin dashboard and landing page built on Vite-React, Next.js, Tailwind CSS, and Shadcn/UI which is fully customizable and production-ready. 项目地址&am…

2026/10/14 16:06:12 阅读更多 →
推箱子自动寻路实战:IDA*搜索与死锁检测优化

推箱子自动寻路实战:IDA*搜索与死锁检测优化

推箱子自动寻路,这东西看起来是个小游戏,真做起来才知道水有多深。网上讲这个主题的文章不少,但大多是拿BFS跑个小地图就收工,真正能处理中等规模关卡、能跑完不爆内存、不卡死的完整实现其实不多。我这边之前写过一个版本&#x…

2026/10/14 16:06:12 阅读更多 →
Godot TorusMesh 环面网格完整指南:参数详解、代码创建与实战应用

Godot TorusMesh 环面网格完整指南:参数详解、代码创建与实战应用

文档教程游戏开发 【免费下载链接】godot-docs Godot Engine official documentation 项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs 点击查看 免费下载 引言:为什么需要 TorusMesh TorusMesh(环面网格,即甜甜圈…

2026/10/14 16:06:12 阅读更多 →
Kong网关7.5分SQL注入:混合模式的信任假设错了

Kong网关7.5分SQL注入:混合模式的信任假设错了

2026 年 10 月 12 日,Kong Gateway 的一个 SQL 注入漏洞公开:CVE-2026-1907,CVSS v4.0 评分 7.5(High),影响 Kong Enterprise Gateway 与开源版 Kong Gateway。漏洞的位置很具体:混合模式&#…

2026/10/14 16:06:12 阅读更多 →
腾讯云Python服务生产级部署:systemd+nginx+venv实战

腾讯云Python服务生产级部署:systemd+nginx+venv实战

简介:本资源是一份面向高校计算机专业学生与Python初学者的实战部署指南,聚焦疫情期间无法返校使用本地服务器时,如何借助腾讯云短期免费资源快速运行Python3.7PyTorch CPU版代码。文档详细覆盖从新用户微信认证领15天云服务器、CentOS/Ubunt…

2026/10/14 16:06:12 阅读更多 →
社交类iOS开发:即时通讯链路与性能优化实战地图

社交类iOS开发:即时通讯链路与性能优化实战地图

提到iOS开发,很多人第一反应是"不就是用Swift画页面嘛"。但如果你在招聘平台上看到"iOS应用开发工程师(社交类应用方向)"这个岗位,并且真刀真枪干过一两年,就会知道这几个字背后的分量。我从一线i…

2026/10/14 16:05:10 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →