Electron笔记
Electron是什么?
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。
注意 因为 Electron 将 Node.js 嵌入到其二进制文件中,你应用运行时的 Node.js 版本与你系统中运行的 Node.js 版本无关。
安装
node --version
npm --version
npm install -g electron
electron --version
# 运行
electron ./main.js
入门、文件读写
main.js进行窗口创建。设置主进程
窗口创建时就是load一个index.html。 html里可以有js,比如view.js。这个就是渲染进程。
渲染进程也可以进行文件读写和进行http请求。
Electron - 原生节点库 os,网络模块
渲染进程可以用主进程一样的东西,只不过此时用的是remote的electron。
进程模型
chrome进程模型
chrome默认会启动主进程,和两个子进程,然后每打开一个标签页会启动两个进程,当页面加载完成其中一个进程会结束,只剩一个进程用于渲染和交互和网络请求,以后每个标签页都会重复这个过程。
electron
Electron 为我们提供了 2 个 IPC(进程间通信)模块,分别称为 ipcMain 和 ipcRenderer。
ipcMain 模块用于从主进程异步通信到渲染进程。 在主进程中使用时,该模块处理从渲染器进程(网页)发送的异步和同步消息。 从渲染器发送的消息将被发送到此模块。
ipcRenderer 模块用于从渲染器进程到主进程的异步通信。 它提供了一些方法,因此您可以将同步和异步消息从渲染器进程(网页)发送到主进程。 您还可以接收来自主进程的回复。
我们将创建一个主进程和一个渲染器进程,它们将使用上述模块相互发送消息。
事例请参考
主进程
// Event handler for asynchronous incoming messages
ipcMain.on('asynchronous-message', (event, arg) => {
// Event emitter for sending asynchronous messages
event.sender.send('asynchronous-reply', 'async pong')
})
// Event handler for synchronous incoming messages
ipcMain.on('synchronous-message', (event, arg) => {
// Synchronous event emmision
event.returnValue = 'sync pong'
})
渲染进程
// Synchronous message emmiter and handler
console.log(ipcRenderer.sendSync('synchronous-message', 'sync ping'))
// Async message handler
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg)
})
// Async message sender
ipcRenderer.send('asynchronous-message', 'async ping')
小结
send函数是异步的
sendSync是同步的。
只能渲染进程给主进程主动 同步/异步推消息,然后主进程根据情况同步/异步回消息。对于同步消息只能同步回。 个人理解 待确定
建议不要在渲染器进程上执行繁重/阻塞任务的计算。 始终使用 IPC 将这些任务委托给主进程。 这有助于保持应用程序的速度。
系统UI
对话框、菜单等
const {dialog} = require('electron')
const fs = require('fs')
dialog.showOpenDialog(xxxx....
打开文件对话框只能在主进程里操作。渲染进程发消息给主进程,主进程打开对话框选文件,然后文件内容发给渲染进程。
桌面应用程序带有两种类型的菜单——应用程序菜单(在顶部栏)和上下文菜单(右键菜单)。
我们将使用两个模块 - Menu 和 MenuItem 模块。 请注意,Menu 和 MenuItem 模块仅在主进程中可用。 要在渲染器进程中使用这些模块,您需要 remote 模块。
可以是系统菜单,也可以是鼠标右键菜单,可以替换的。如果是鼠标右键菜单是在渲染进程里。
- Electron - 系统托盘 系统托盘是应用程序窗口之外的菜单。 在 MacOS 和 Ubuntu 上,它位于屏幕的右上角。 在 Windows 上,它位于右下角。 我们可以使用 Electron 在系统托盘中为我们的应用程序创建菜单。
系统托盘操作在渲染进城里。
- Electron - 定义快捷方式 快捷方式,快捷键
globalShortcut.register('CommandOrControl+O', () => {
ipcRenderer.send('openFile', () => {
console.log("Event sent.");
})
ipcRenderer.on('fileData', (event, data) => {
document.write(data)
})
})
调试
| 序号 | 变量 & 说明 |
|---|---|
| 1 | ELECTRON_ENABLE_LOGGING将 Chrome 的内部日志打印到控制台。 |
| 2 | ELECTRON_ENABLE_STACK_DUMPING在 Electron 崩溃时将堆栈跟踪打印到控制台。 |
| 3 | ELECTRON_DEFAULT_ERROR_MODEElectron 崩溃时显示 Windows 的崩溃对话框。 |
export ELECTRON_ENABLE_LOGGING=true
export ELECTRON_ENABLE_STACK_DUMPING=true
export ELECTRON_DEFAULT_ERROR_MODE=true
我们有两个进程运行我们的应用程序 — 主进程和渲染器进程。
由于渲染器进程是在我们的浏览器窗口中执行的,我们可以使用 Chrome 开发工具对其进行调试。
要调试在主进程中执行的 JavaScript,您需要使用外部调试器并使用 –debug 或 –debug-brk 开关启动 Electron。 请参考原文。可用vscode。可以加断点。
打包
打包成mac.app 或者win.exe等。
参考 打包您的应用程序
forge使用
安装
npm install --save-dev @electron-forge/cli
npx electron-forge import
打包
npm run make
该脚本最终运行了 electron-forge make 命令。
npm run用了package.json转成了上述命令。
然后就可以看到app了。