TNotes.electron
1. TNotes.electron 笔记简介
2. Electron 学习资源
- 0057. electron 源码仓库
- 0058. electron 官方文档
- 0050. 《Electron 实战:入门、进阶与性能优化》
- 0051. 掘金小册 - 《Electron 应用开发实践指南》
- 0053. 掘金小册 - 《Electron + Vue 3 桌面应用开发》
- 0054. 掘金小册 - 《Electron + React 从 0 到 1 实现简历平台实战》
- 0055. WebStudyBooks 免费的前端掘金小册
3. Electron 应用
4. Electron 核心概念
- 0045. Electron 核心概念
5. Electron 应用的最小组成
6. contextBridge 上下文桥接
7. IPC 基础
- 0046. 认识 IPC 相关模块
- 0037. 使用 ipcRenderer.send、ipcMain.on 实现从渲染进程到主进程的单向 IPC 通信
- 0035. 使用 ipcRenderer.invoke、ipcMain.handle 实现从渲染进程到主进程的单向 IPC 通信
- 0043. 主进程通过 BrowserWindow 实例的 webContents.send 方法主动给指定的渲染进程发消息
- 0038. 使用 send、on 实现主进程和渲染进程之间的双向 IPC 通信
- 0039. 使用 ipcRenderer.sendSync、ipcMain.on 实现主进程和渲染进程之间的双向 IPC 通信
- 0036. 使用 ipcRenderer.invoke、ipcMain.handle 实现主进程和渲染进程之间的双向 IPC 通信
8. IPC 进阶
- 0047. 分析渲染进程之间的通信
- 1. 📒 错误做法 ❌
- 2. 📒 主进程转发消息
- 3. 📒 主进程转发 ID
- 4. 📒 走消息端口
- 注意:mermaid 在 vitepress 中无法正常渲染,后续会将 mermaid 集成到 TNotes 中,在看笔记的时候,先点击标题,跳转到 github 上查看 mermaid 图。
- 0042. 通过主进程转发消息的方式实现两个渲染进程之间互相通信
- 1. 📺 视频 - demos.1
- 2. 💻 demos.1
- 3. 📺 视频 - demos.2
- 4. 💻 demos.2
- 本节一共有 2 个 demo
- demos.1 的写法是存在一些问题的(需要理解 demos.1 的写法存在的问题)
- demos.2 对 demos.1 的问题进行了修复(需要理解 demos.2 是如何解决 demos.1 遇到的问题的)
- 类似于 demos.2 的效果,在工作中实践过,使用起来感觉没啥问题,还 OK。需要注意的是 channel 的语义化,如果 channel 的数量比较多,那么可以尝试通过一些特殊的自定义命名规则来区分哪些 channel 是用于在两个渲染进程之间互相通信的。当然,除了通过自定义命名规范来区分,还可以单独写一个全局对象来存储 channel,比如
CHANNEL_LIST.r2r.xxx
、CHANNEL_LIST.r2m.xxx
、CHANNEL_LIST.m2r.xxx
。
- 0041. 通过主进程获取另一个渲染进程的 ID 来实现两个渲染进程之间的通信
- 1. 📺 视频
- 2. 🔍 查看 electron 官方文档 -> breaking-changes
- 3. 💻 demos.1 - 通过主进程获取另一个渲染进程的 ID 来实现两个渲染进程之间的通信
- 本文介绍了两个渲染进程之间实现互相通信的一种方式 —— 通过主进程获取另一个渲染进程的 ID 来实现两个渲染进程之间的通信。
- 0040. 使用 MessagePort 实现两个渲染进程之间的互相通信
- 0034. 仿观察者模式实现两个渲染进程之间的互相通信
- 0004. 使用 web api MessageChannel 实现主进程和渲染进程之间的互相通信
- 0003. 比较消息端口 MessageChannel 和 ipcRenderer.invoke、ipcMain.handle 的性能
- 1. 📺 视频
- 2. 💻 demos.1 - MessageChannel vs. ipcRenderer.invoke、ipcMain.handle
- 本文通过一个 Electron 应用示例对比了
MessageChannel
和ipcRenderer.invoke
/ipcMain.handle
两种 IPC 通信方式的性能差异。
9. 窗口
9.1. 不同系统的窗口行为兼容适配
- 0016. 适配 Windows 和 macOS 上的窗口交互行为
- 1. 🔍 官方文档 - 查看主进程的 app 模块上的 activate、window-all-closed 事件的相关描述
- 2. 💻 demos.1 - 适配 Windows 和 macOS 上的窗口交互行为
- 适配 Windows 和 macOS 上的窗口交互行为的处理逻辑很简单,重点在于理解两种系统中窗口交互的一些差异点。
9.2. 窗口首次加载的白屏问题
9.3. 无边框窗口
- 0048. 认识无边框窗口
- 1. 🔗 links
- 2. 📝 创建无边框窗口
- 3. 📒 无边框窗口的特点
- 4. 📒 特点 - 可以自定义窗口控制按钮
- 5. 📒 特点 - 可以自定义窗口的形状和样式
- 6. 📒 特点 - 需要手动实现窗口的拖拽和窗口的尺寸调整
- 如何创建一个无边框窗口
- 无边框窗口的特点
- 了解无边框窗口的特点,如果你创建的窗口要求具备这些特性,可以考虑使用无边框窗口来实现。
- 0018. 创建一个无边框窗口
- 1. 📺 视频
- 2. 🔗 links
- 3. 💻 demo
- 创建无边框窗口 frame: false
- 无边框窗口的特点
- 0019. 让无边框的窗口可以被拖拽
- 1. 📺 视频
- 2. 🔗 links
- 3. 💻 demo
- 通过 css 来解决无边框的窗口的拖拽问题
- 0020. macos 隐藏窗口标题栏但是不隐藏交通灯
- 1. 💻 demo
- 只需要调整 BrowserWindow 的配置即可实现在 macos 中隐藏窗口标题栏但是不隐藏交通灯,并且可以微调交通灯的位置。
9.4. 窗口层级
- 0017. 窗口置顶
- 1. 🔗 links
- 2. 💻 demo
- 本文介绍了两种使窗口置顶的方式,以及它们之间的一些区别。
- 做法 1:在 new BrowserWindow 的时候,丢一个配置项
alwaysOnTop: true
进去,暴力置顶。 - 做法 2:通过 BrowserWindow 实例 win 的
setAlwaysOnTop
方法实现置顶,可以进行更细粒度的控制置顶的层级。
10. 菜单
10.1. 不同系统的菜单适配
- 0010. macos 应用菜单第一项的问题
- 1. 📺 视频
- 2. 🔗 links
- 3. 💻 demo1
- 4. 💻 demo2
- 5. 🤔 问:在 macos 中,第一项菜单的名称如何自定义呢?
- macos 应用菜单第一项的有什么问题【demo1】
- 如何解决 macos 应用菜单第一项的有什么问题【demo2】
- 【demo1】介绍了 macos 应用菜单第一项的问题 —— 始终显示应用程序的名称,我们配置的 label 不生效。
- 【demo2】介绍了让我们配置的菜单项信息能够完整展示出来的一种解决方案 —— 对 macos 特殊处理,往菜单列表中 unshift 一项内容作为第一项。
- Q:实际开发中会存在这个问题吗?应该如何解决呢?
- A:不存在,解决方式也很简单。
- 在实际开发中会使用一些主流工具(比如 electron-builder)来出包,这时候 macos 菜单的第一项可以很方便地自定义配置,只需要配置 pageage.json 中的 productName 即可。
json{ // ... "productName": "xxx", // 在这里配置你的应用名称 // ... }
1
2
3
4
5
10.2. 页面右键菜单
- 0012. 使用 Menu 模块实现页面中的右键菜单
- 1. 🔗 links
- 2. 💻 demo
- 在页面上创建右键菜单,这是桌面端应用中很常见的一个功能点。本文的介绍了如何使用 Menu 模块来创建一个右键菜单。
- 本节介绍如何如何使用 Menu 模块来创建一个右键菜单。这里提到的右键菜单,又称为上下文菜单,也就是你在一些应用程序的界面上,点击鼠标右键所弹出的内容。
10.3. Dock 菜单
- 0009. 设置 macos 的 Dock 菜单
- 1. 🔗 links
- 2. 📒 Dock 菜单是什么
- 3. 💻 demo
- 如何通过 Menu 模块来创建 macos 上的 Dock 菜单
10.4. 自定义菜单
- 0011. 自定义系统菜单覆盖默认菜单问题
- 1. 🔗 links
- 2. 📒菜单项冲突问题
- 3. 📒如何解决冲突问题
- 4. 💻 demo1 - 手写调试工具切换的触发逻辑
- 5. 💻 demo2 - 使用预设的 role 来快速配置菜单项
- 6. 🤔 问:role 是什么?
- 自定义系统菜单和默认菜单的冲突问题是什么
- 如何解决冲突问题
10.5. Tray 菜单
11. app
11.1. 路径
- 0024. 通过 app 模块获取应用相关路径
- 1. 🔗 links
- 2. 📒
app.getPath(name)
- 3. 💻 demo
app.getPath(name)
的基本使用- 本文介绍了通过 app 模块中的 app.getPath 方法来获取应用程序的相关路径。其中很多路径在都是很重要的,不要再使用 nodejs 去组装这些路径信息了,现尝试到 app.getPath 中找找看有没有现成的。
12. 快捷键
12.1. 页面级别
- 0023. 页面级别的快捷键
- 1. 🔗 links
- 2. 💻 demo
- 本节通过一个很简单的 demo,介绍如何实现页面级别的快捷方式。
- 全局快捷键可以使用 Electron 提供的模块 globalShortcut 来实现,这是一个主进程模块。但是,就文档中要求的页面级别的快捷方式,完全可以使用原生的 Web API
window.onkeydown = function(e) { ... }
来实现。
12.2. 全局级别
- 0022. 全局级别的快捷键
- 1. 🔗 globalShortcut
- 2. 💻 demo
- 学习如何注册全局(系统)级别的快捷方式
- 全局级别的快捷键,也称系统级别的快捷键,这玩意儿在很多桌面应用程序中多多少少都会有一些。对于一些常用的操作和交互行为,绑定好快捷键,还是蛮必要的。
- globalShortcut 是一个主进程中的模块,其作用是 在应用程序没有键盘焦点时,监听键盘事件。
- Q:什么叫“应用程序没有键盘焦点”?
- A:就是你当前鼠标点击的位置并非该应用,焦点不在这个应用身上。
13. 剪切板
- 0021. 使用 clipboard 模块向系统剪切板中读写文本
- 1. 🔗 links
- 2. 💻 demo
- 该笔记 clipboard 基本使用
- clipboard 是一个很常用也狠使用的模块,用于读写系统的剪切板。这篇文档介绍它的基本使用,实现剪切板的读写操作。
14. 系统通知
- 0026. 使用 Notification 模块弹出系统消息
- 1. 🔗 links
- 2. 💻 demo
- 如何使用 Notification 弹出系统通知
- 这个 demo 使用 electron 的内置模块 Notification 实现了一个简单的 demo,最终效果仅仅是将系统消息给展示出来,没有加其它多余的交互逻辑。
15. 桌面视频流
- 0029. 实现屏幕监听功能
- 1. 🔗 links
- 2. 📒
navigator.mediaDevices.getUserMedia()
的 video 配置结构问题 - 3. 💻 demo
- 这是参照官方示例实现一个屏幕实时监听的 demo。
- 0028. 模拟截图功能
- 1. 🔗 links
- 2. 💻 demo
- 使用 Electron 并结合传统的前端技术来实现一个截图应用
- 这篇文档是作者 mowuu 使用 Electron 内置模块结合前端技术 canvas 写的一个截图工具示例。
- demo 的核心逻辑简单了解了个大概,屏幕数据的获取使用的是 desktopCapture,页面上的图像最终是使用 canvas 来绘制的。实测在高分辨率的设备下截图效果异常模糊,几乎处于不可用的状态。
- 临时结论:使用 Electron 内置的原生模块来模拟截图效果,可以说几乎是不可用的。后续找时间去 github 搜一下看看其它解决方案。
- 0049. desktopCapturer 简介
- 1. 🔗 desktopCapturer 相关链接
- 2. 📒 desktopCapturer 是什么
- 3. 📒 desktopCapturer 的基本使用流程
- desktopCapturer 是什么
- desktopCapturer 的基本使用流程
- desktopCapturer 这是主进程中的一个模块,是一个用于处理桌面视频流(你可以理解为就是你眼睛看到的显示屏上的画面数据)的 API。
16. 插件化
- 0014. 使用 BrowserView 加载外部资源
- 1. 📺 视频
- 2. ⏰ TODO 为啥 BrowserView 被废弃掉了
- 3. 🔗 links
- 4. 💻 demo
- 如何使用 BrowserView 加载外部资源
- 这个 demo 使用 BrowserView 模块来加载第三方资源(掘金主页)到渲染进程的页面上。
- 0013. 基于 BrowserView 实现插件化能力
- 1. 📺 视频
- 2. 🔗 links
- 3. 💻 demo - BrowserView 实现插件化
- 基于 BrowserView 实现插件化能力
- 该 demo 模拟了使用 BrowserView 模块来加载第三方资源并注入 preload 脚本,使其具备原生能力。
16.1. 集成浏览器插件
- 其它第三方插件的集成方案基本都类似,集成 vue 调试工具 vue-devtools 的示例可以作为一个参考。
- 0006. 使用 vue-remote-devtools
- 1. 📺 视频
- 2. 🔗 links
- 3. 💻 demo
- 介绍 vue-remote-devtools 的基本使用
- 本文介绍如何让基于 Electron 搭建的 Vue 工程,能够远程地使用 Vue 调试工具。本节介绍的其实是一个通用的法子,那些在非浏览器环境下搭建的 Vue 工程,如果想要使用 vue-devtools 的能力,都可以参考文中提到的这种方式。
- 其它第三方插件的集成方案基本都类似,集成 vue 调试工具 vue-devtools 的示例可以作为一个参考。
- 0007. 使用手动安装的方式集成 vue-devtools
- 1. 🔗 links
- 2. 💻 demo
- 如何通过 session 模块在 Electron 工程中集成 vue-devtools
- 0005. 使用 electron-devtools-installer 安装 vue-devtools
- 1. 🔗 links
- 2. 💻 demo
- 按照官方提供的示例试了一下,最终结果是:没能安装成功。
- 如果不是自己写的测试用例有误,那就是 electron-devtools-installer 这个包过时了。
- 0008. 使用自动安装的方式集成 vue-devtools
- 1. 🔗 links
- 2. 💻 demo
- 3. 📒 如何获取 VUE_DEVTOOLS_ID
- 如何根据插件 ID 自动下载 chrome 插件源码
downloadChromeExtension.js
- 本文基于 electron-devtools-installer 中的下载 chrome 插件的逻辑,封装了一个 downloadChromeExtension.js 模块,在 electron.0007 的基础上,实现自动安装插件的功能。
- 其它第三方插件的集成方案基本都类似,集成 vue 调试工具 vue-devtools 的示例可以作为一个参考。
17. 其它功能
17.1. webContents startDrag 原生文件拖放
- 0027. 原生文件拖 & 放
- 1. 📺 视频
- 2. 🔗 links
- 3. 📒本文要实现一个什么样的效果
- 4. 💻 demo
- 原生文件拖 & 放是什么
- 如何实现原生文件拖 & 放效果
- 从视频的 0:50~2:30 开始展示最终的效果,可以从这开始看,快速了解下本节要实现的效果。
18. 第三方库
18.1. electron-reload
- 0031. 使用 electron-reload 实现热更
- 1. 📺 视频
- 2. 🔗 links
- 3. 💻 demo
- 如何使用 electron-reload 实现热更
- 使用 electron-reload 监听主进程和渲染进程内容的变更,一旦内容变化,就自动重启 electron。
- 额,这功能确实有点儿用,不过感觉也是可有可无,因为手动启动的成本也不算太高。
18.2. electron-builder
- 0030. 使用 electron-icon-builder、electron-builder 解决应用打包后的图标问题
- 1. 💻 demo
- 2. 📒electron, electron-builder, 和 electron-icon-builder 应该安装为开发依赖还是生产依赖呢?
- 使用 electron-icon-builder 处理应用图标
- 使用 electron-builder 出包
19. 小练习
19.1. 桌面时钟
- 0032. 实现一个桌面时钟
- 1. 🔗 links
- 2. 📒
- 3. 💻 demo
- 手写一个简单的桌面时钟摆件
- 最终效果:
- 0056. 实现一个桌面时钟-2
- 1. 📒 demo 功能简介
- 2. 📒 编写这个 demo 的初衷
- 3. 📒 启动
npm start
和出包npm run build
- 4. 📒 图标背景色
#9feaf9
- 从 0 到 1 实现一个简易的桌面时钟应用。
- 一共没几行代码,直接看 src 下边的源码即可。
- 在 0032 也练习了一个桌面时钟的应用,0032 是一个桌面时钟摆件,展示效果是以钟表形式来呈现的。
19.2. 微信读书助手
- 0044. weread-helper
- 1. 🔗 links
- 2. 📒Quick Start
- 套壳了微信读书的网页版,并注入了一些自定义脚本。
19.3. 自动定时截图工具
- 0033. ScreenCaptureApp
- demo - 自动截图程序
- 目前在测试 nodejs 的第三方库,看下是否能够支持实现定时定区域自动截图的功能,如果表现良好,可以考虑将其集成到 electron 中,出一个桌面端的自动截图工具。
- 应用场景:看外文视频的时候,自动定时截字幕。
- 功能:
- 定时截图
- 定区域截图
- ORC 识别(识别字幕,去重)