显著变化
1. Electron版本发布周期变化
从 Electron 15 开始,新的 major 版本发布周期会从 12 周改为 8 周。
New Electron Release Cadence
此外,到 2022 年 5 月前,Electron 会由原来支持最新 3 个版本改为支持最新 4 个版本。
Electron Versioning
2. 技术栈变化
Electron 16 使用以下版本:
- Chromium 96
- Node.js 16.9.1
- V8 9.6
亮点特性
1. 支持 WebHID API
WebHID API 是浏览器提供的支持人机界面设备的 API,通过这个 API 你就能连接如 Switch 的 Joy-Con 控制器之类的硬件设备。
PR 链接
2. app.requestSingleInstanceLock 支持传参以在两个实例间共享数据
回顾一下,app.requestSingleInstanceLock() 方法的返回值表示你的应用程序实例是否成功取得了锁。如果它取得锁失败并退出,你可以假设另一个应用实例已经存在且取得了锁并仍旧在运行。一般用于确保当前应用只有一个实例。
但有些场景启动应用想带上参数,而原来的 app.requestSingleInstanceLock() 不支持传参,当第二个实例启动后因为锁的存在而被退出,但命令带的参数并没有被传给第一个实例去执行。
这次 Electron 16 支持了可以往 app.requestSingleInstanceLock() 传一个 JSON 对象作为参数,当第二个实例启动后,第二个实例的参数会被传给第一个实例,在第一个实例中可以通过监听 ‘second-instance’ 事件 来获取传来的参数:
const { app } = require('electron')let myWindow = nullconst additionalData = { myKey: 'myValue' }const gotTheLock = app.requestSingleInstanceLock(additionalData)if (!gotTheLock) {app.quit()} else {app.on('second-instance', (event, commandLine, workingDirectory, additionalData) => {// commandLine 是第二个实例的命令行参数的数组, workingDirectory 是这个实例当前工作目录,additionalData 是第二个实例的参数console.log(additionalData);// 当运行第二个实例时,将会聚焦到myWindow这个窗口if (myWindow) {if (myWindow.isMinimized()) myWindow.restore()myWindow.focus()}})// 创建 myWindow, 加载应用的其余部分, etc...app.whenReady().then(() => {myWindow = createWindow()})}
PR 链接
此外,我看已经有 PR 在讨论加一个事件提供给第二个实例,用以第一个实例传参给第二个实例。
3. setPermissionRequestHandler() 支持传 securityOrigin 给 media请求
ses.setPermissionRequestHandler(handler) 是主进程的 session 模块下处理权限请求的方法。之前遇到 media 类型的权限请求,如摄像头、麦克风、扬声器设备的权限请求时,handler 并没有传请求的 security_origin。
但在配套的API ses.setPermissionCheckHandler(handler) 的 handler 里,参数 details 又提供了 securityOrigin,所以为了保持一致减少歧义,Electron 16 也给 ses.setPermissionRequestHandler(handler) 加上了 securityOrigin:
const { session } = require('electron')session.fromPartition('some-partition').setPermissionRequestHandler((webContents, permission, callback, details) => {if (webContents.getURL() === 'some-host' && permission === 'notifications' && details.securityOrigin === undefined) {return callback(false) // 拒绝请求}callback(true)})
至于这俩 API 的不同,参考这个 issue:
- setPermissionRequestHandler:处理可以被异步响应的权限请求。
- setPermissionCheckHandler:处理必须被同步响应的权限检查。
4. 新增 API - commandLine.removeSwitch
喜大普奔!Electron 官方终于支持关闭 Chromium 命令行开关了!相信很多应用都想关闭线上包的命令行开关,来防止用户执行一些开发者不想让用户执行的命令。现在可以通过设置这一属性,来关闭 Chromium 命令行开关了:
app.commandLine.appendSwitch('foobar3', 'test');console.log(app.commandLine.hasSwitch('foobar3')); // trueapp.commandLine.removeSwitch('foobar3');console.log(app.commandLine.hasSwitch('foobar3')); // false
更多特性,可看 Electron 16 发布版本通知
突破性变化
1. config.gypi 不再继承运行时 process.config
config.gypi 文件将继承自 $nodedir/include/node/config.gypi,不再从运行时的 process.config 对象继承,具体原因参考 issue。
对于使用 node-gyp 的应用,需要考虑使用 --force-process-config ,可以强制切回到原来的表现,即强制使用运行时 process.config 对象生成 config.gypi 文件。
具体有三种使用 node-gyp 构建的情况(更多细节请看 PR):
- 为官方 Node.js 二进制文件构建带有官方头文件的模块
- 使用
$nodedir/include/node/config.gypi或者process.config都可以
- 使用
- 为第三方 Node.js 二进制文件构建带有官方头文件的模块
- 使用
$nodedir/include/node/config.gypi可能会有问题,因为一些第三方 Node.js 库使用了与官方头文件不同的构建配置。
- 使用
- 为自定义 Node.js 二进制文件或 Node.js 嵌入式应用程序构建带有自定义头文件的模块
- 必须使用
$nodedir/include/node/config.gypi而非process.config,因为只有前者包含构建目标的正确构建配置。
- 必须使用
2. Linux 上 crashReporter 的实现转移到了 Crashpad
Linux 上 crashReporter API 的基础实现已经从 Breakpad 转移到了 Crashpad,与 Windows 和 Mac 保持一致。现在子进程会被自动监视,所以也不再需要在 Node 子进程调用 process.crashReporter.start (也不建议,因为这将启动 Crashpad 记录器的第二个实例)。
更多未来的突破性变化,可看 Planned Breaking Changes
版本支持
结束支持 Electron 12.x.y。接下来的版本支持时间表:
| E15 (21年9月) | E16 (21年11月) | E17 (22年2月) | E18 (22年3月) | E19 (22年5月) |
|---|---|---|---|---|
| 15.x.y | 16.x.y | 17.x.y | 18.x.y | 19.x.y |
| 14.x.y | 15.x.y | 16.x.y | 17.x.y | 18.x.y |
| 13.x.y | 14.x.y | 15.x.y | 16.x.y | 17.x.y |
| 12.x.y | 13.x.y | 14.x.y | 15.x.y | — |
