创建一个项目
初始化项目
太简单了
入口文件
起始就主进程的起始入口文件。
index.js
就以上代码做具体分析 说明:
- 定义全局变量,应用那么复杂,总有用得到的时候,你想用 redux 等管理?请自便。
- 把创建窗口的逻辑提取出去,因为这部分比较独立(一个应用可以创建多个窗口)。
- icp 的主进程与 preload 和渲染进程沟通的关键点,这里单独提出去,并且在主进程中注册 ipcHandler(后边细讲)
- 快捷键的处理,electron 中快捷键跟窗口绑定(每个窗口可以有不同的快捷键),不过窗口关闭的时候理应注销所有热键。
窗口的创建
窗口相关的这块代码和功能都比较独立,因此我们提取出一个单独的模块
window.js
注意,创建窗口的时候,有一些事情要做
- 注册快捷键
- 向 preload 暴漏 ipcHandler(因为是发布订阅模式的参与,所以要求每次创建窗口都需要执行,若是静态的则不要[后边讲])
- 创建菜单
- 窗口加载页面
注册快捷键
注意的是因为 快捷键是跟窗口有关系的(electron 规定的),所以我们会在窗口创建的时候去编写快捷键相关的逻辑,因为比较独立,因此也可以提取出去
./shortcut.js
进程通信
因为按照 electron 的官方教程来看,我们实现一个 主进程-渲染进程两边通信的话,要写很多代码(主进程、preload.js),
慢慢的你就会发现会有很多重复性的代码,因此做了优化!
定义 ipcMain 的 Handler
创建一个目录,里边定义你的 ipcMain 的 Handler。
ipcmain-handler/other.js
注入到主进程
ipc-helper.js
此方法在主进程的入口文件 index.js 中执行。
注入到 preload
因为 preload 是 主进程沟通渲染进程的核心文件,所以我们也的得动这里
preload.js
通过上代码我们可以看出,需要 触发 ipcmainHandlerKeys 事件,才能初始化 contextBridge.exposeInMainWorld,所以我们在窗口创建的时候,发射事件即是最佳时机。
ipc-helper.js
菜单
自带的菜单不好看,但是兼容性好
./menu.js
页面加载
页面其实是在窗口中加载的,所以和窗口息息相关。
因为这块比较独立,所以我也建议将其提出去,同样也是在窗口创建后引入它。。
server.js
全局变量
全局变量最好是以一个对象的形式挂载到 global 中管理,在程序入口文件处进行初始化
global-data.js