Electron(一)
Electron(一)
Electron是一个js桌面端框架,让html,js 打包为桌面应用成为可能,已经有非常多的应用使用了这门技术,如:vscode,notion,figma,思源笔记等等

一 整体交互形式
桌面应用最重要的是什么,或者说和浏览器页面有什么区别?大的来说就是可以和操作系统交互,那么什么叫可以和操作系统交互?让我们回顾下浏览器,浏览器就像一个盒子,里面的所有页面的权利是有限的,就比如,
- 我想在浏览器自己写的一个html页面通过js函数,在文档这个文件夹下创建一个文件,或者修改一个文件
- 调用系统通知api,使用系统通知
- 修改系统音量?
这些都是做不到的,这些都涉及了操作系统的api,那electron是如何做到的呢,我们看下这个图:

Electron就相当于一个中间层,为js提供了一个曲线访问系统api的能力,做任何和系统有关的操作,都要通过electron
一个简单的例子,我想通过,文件选择器,拿到一个文件的路径,该如何实现?你可能会想到,浏览器也可以呀,通过选择器,选择一个文件,还要Electron干嘛?
是没问题,可以选到一个文件,但是文件的路径是获取不到的,简单思考下,如果一个普通的网页,点击就能获取到你本机文件的路径,甚至别的操作系统信息,你做为浏览器的开发者会允许这样吗?这样对浏览器使用者来讲显然是非常危险的,点开个网页信息泄密了,甚至电脑上文件丢了。
因此,我们要使用的文件选择器是操作系统的文件选择器,这个显然是js办不到的,因此有了Electron,它提供了这样的api:文档详见:https://www.electronjs.org/zh/docs/latest/api/dialog
1 | import {dialog} from "electron"; |
文件选择器是有了,我们该如何通知Electron呢?换句话说就是,上面的js函数是显示层调用不到的,因此Electron提供了一种方式,让我们可以与它交互。这种方式类似js的发布订阅模型,发布一个事件,消费者监听事件。
文档详见:https://www.electronjs.org/zh/docs/latest/api/ipc-renderer
js端通过ipcRenderer.send发送一个事件通过Electron
1 | const electron = window.electron |
electron端通过ipcMain.on监听js端发送过来的事件,那当这件事情处理完成了,想要告诉js端怎么办?通过event.reply发送一个事件,携带数据给js,和上面的ipcRenderer.send是类似的
1 | import {ipcMain} from "electron" |
js端该如何处理呢?以React为例:useEffect中,通过ipcRenderer.on,监听这个事件,然后处理,一定要在[]这个useEffect,代表页面创建就运行这个函数,监听这个事件,在return中删除这个事件,不然每次每次页面加载都会创建一个监听,这样会越建越多
1 | useEffect(() => { |
到这里就完成了一个交互,是不是很简单。
二 打包
打包全靠配置,这个是我的配置:
1 | /** |
参考: 我的音乐播放器项目
三 注意事项
1 在linux下窗口关闭前做一件事
看环境,比如kde下是做不到比如隐藏窗口的,在kde下,点击关闭按钮,window对象对直接就销毁了。(曲线方式,我们可以不用系统自带的顶栏,自己实现一个,这样就不会有这样的问题了)
1 | app.on('closed', () => { |
2 linux 下,英伟达显卡涉及到动画的页面报错(暂未解决)
报错内容
1 | libva error: vaGetDriverNameByIndex() failed with unknown libva error, driver_name = (null) |
- 标题: Electron(一)
- 作者: chalmery
- 创建于 : 2023-06-22 00:00:00
- 更新于 : 2023-06-22 00:00:00
- 链接: https://github.com/chalmery/2402782093/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。