Note
Hello World
在项目文件夹下新建两个文件: main.html
& main.js
|
|
|
|
然后打开cmd命令行, cd到项目的根目录, 执行命令
|
|
项目根目录就会生成一个 package.json
文件
|
|
然后就可以在 cmd命令行
中执行命令来启动项目
|
|
效果如下:
也可以自己添加 main.css
编写样式, 让界面更好看.
所有命名不固定.
主进程与渲染进程
主进程
Electron 运行
package.json
的main属性
的进程被称为主进程每个应用只有一个主进程
作用:
- 管理原生GUI , 典型的窗口(BrowserWindow , Tray, Dock, Menu)
- 创建渲染进程
- 控制应用生命周期 (app)
模块:
- **(常用): **app , BrowserWindow , ipcMain , Menu , Tray , MenuItem , dialog , Notification , webContents , autoUpdater , globalShortcut , clipboard , crashReporter
- SystemPreferences , TouchBar , netLog , powerMonitor , inAppPurchase , net , powerSaveBlocker , contentTracing , BrowserView , session , protocol , Screen , shell , nativelmage
渲染进程
- 展示web页面的进程称为渲染进程
- 一个应用可以有多个渲染进程
- 作用: 通过Node.js, Electron提供的API可以跟系统底层打交道
- 常用模块:
- **(常用): **ipcRenderer , remote , desktopCapture , clipboard , crashReporter
- webFrame , shell , nativelmage
进程间通信
通信工具: IPC通信模块
- Electron 提供了IPC通信模块, 主进程的
ipcMain
和渲染进程的ipcRenderer
ipcMain
和ipcRenderer
都是EventEmitter
对象
从渲染进程到主进程 (render to main)
- Callbake写法:
- ipcRenderer.send( channer, …args) // 渲染进程中发送
- ipcMain.on(channel, handler) // 主进程中响应
|
|
- Promise写法 (Electron 7.0之后, 处理请求 + 响应模式):
- ipcRenderer.invoke(channel, …args) // 渲染进程中发送
- ipcMain.handle(channel, handler) // 主进程中响应
从主进程到渲染进程 (main to render)
- ipcRenderer.on(channel, handler) // 渲染进程中响应
- webContents.send(channel) // 主进程中发送
|
|
从渲染进程到渲染进程 (render to render) 页面间通信
页面之间的通信主要做两件事情: 1. 通知事件; 2. 数据共享
通知事件
- ipcRenderer.sendTo( webContentsId, channel, …args )
|
|
|
|
|
|
数据共享
- 使用web技术( localStorage , sessionStorage , indexedDB )
调试
渲染进程的调试
- 用代码打开 Chromiun的开发者工具
|
|
- 输入命令行
electron .
之后, 在窗口按下快捷键Ctrl + Shift + i
主进程的调试
Electron 主进程是一个 Node.js 进程。Node.js 在 8 之后引入了 --inspect
参数用于调试,同样也适用于 Electron 主进程:
|
|
默认会监听 9229 端口,应用启动后,在 Chrome 浏览器(或其他基于 Chromium 开发的浏览器)中打开 chrome://inspect
即可看到对应的调试会话,点击会话链接即可打开 devtools 进行调试。
另外,可以在命令行参数中指定端口号,实现同时调试多个应用中的多个进程而不产生冲突:
|
|
步骤
1.开启命令行开关
启动electron的时候需要带上inspect开关,并配置调试端口.
有两个开关,分别是 --inspect=[port]
和 --inspect-brk=[port]
,区别在于后者会暂停在第一行js代码
这里建议在 package.json
的 script
字段添加如下内容
|
|
2.设置chrome调试器
打开chrome,然后新开一个标签进入chrome://inspect ,这里我们要先配置监听的端口,不然的话,Remote Target列表里是不会出现要调试的electron程序的
>_
>_
然后在项目目录下就可以直接使用命令
|
|
就可以看到如下画面:
>_
3.调试
点击 inspect 就可以进行调试了.
在 VSCode 中调试
上述方法均会打开 devtools 界面,所有的调试操作均在 devtools 中进行。对于某些操作比如代码断点调试,可以进一步与编辑器或 IDE 相结合,提升开发体验。以下将简要介绍如何在 VSCode 进行调试。
以 Electron 官方的模板 electron-quick-start 为例,首先需要为 VSCode 安装一个扩展:Debugger for Chrome(用于调试渲染进程)。克隆代码仓库到本地并安装依赖:
|
|
然后在仓库中添加文件 .vscode/launch.json
,内容如下:
|
|
注意: Windows系统的路径分隔符要写作 “\\”
if 普通安装electron
then 把"用户名"改成"你系统的用户名";
else 自定义安装electron
then 找到你的 electron.cmd;
复制路径;
到 json中修改;
if Linux用户
then 系统.路径分隔符 = “/”
if (项目根目录/node_modules/.bin/electron).isExist
then
1 2 3 4
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", "windows": { "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" }
然后在 VSCode 左侧选择 debug 面板,启动 All
这一项开始调试,此时就可以在 main.js
或 renderer.js
文件中添加断点了:
配置文件中的一些要点解释如下:
configurations
中的两项分别对应主进程和渲染进程。compounds
中指定了一个组合会话All
,选择All
将会同时启动这两个会话。- Renderer 配置中的
webRoot
参数直接使用了${workspaceFolder}
,是因为在这个工程中,HTML 引用的静态资源位于根目录下。实际使用的时候需要更新到对应的路径才会生效。 - 实际开发中可能会有编译的流程,比如使用 TypeScript 配合打包工具 Webpack,最终生成的代码与源代码并不在一个路径下。这种情况下需要产出 source map 来建立映射关系。
>_
经验技巧
少用remote模块
因为每次remote会触发底层的同步IPC事件, 特别影响性能, 处理的不好容易进程卡死
不要用sync模式
一旦写的不好就会整个应用卡死
在请求+响应的通信模式下,需要自定义超时限制
在响应的时候需要设置一个时长限制, 当应用响应超时, 需要response一个异常的超时事件让业务处理, 然后去做对应的交互