Electron16的新特性

1,571 阅读4分钟

显著变化

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

V8 9.6 支持「Reference Types 提案」,V8 9.5 新特性「Intl.DisplayNames v2版」,更多请看《V8 9.x 新特性》

亮点特性

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 = null

const 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:处理必须被同步响应的权限检查。

PR 链接

4. 新增 API - commandLine.removeSwitch

喜大普奔!Electron 官方终于支持关闭 Chromium 命令行开关了!相信很多应用都想关闭线上包的命令行开关,来防止用户执行一些开发者不想让用户执行的命令。现在可以通过设置这一属性,来关闭 Chromium 命令行开关了:

app.commandLine.appendSwitch('foobar3', 'test');
console.log(app.commandLine.hasSwitch('foobar3'));  // true
app.commandLine.removeSwitch('foobar3');
console.log(app.commandLine.hasSwitch('foobar3'));  // false

PR 链接

更多特性,可看 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):

  1. 为官方 Node.js 二进制文件构建带有官方头文件的模块

    • 使用 $nodedir/include/node/config.gypi 或者 process.config 都可以
  2. 为第三方 Node.js 二进制文件构建带有官方头文件的模块

    • 使用 $nodedir/include/node/config.gypi 可能会有问题,因为一些第三方 Node.js 库使用了与官方头文件不同的构建配置。
  3. 为自定义 Node.js 二进制文件或 Node.js 嵌入式应用程序构建带有自定义头文件的模块

    • 必须使用 $nodedir/include/node/config.gypi 而非 process.config ,因为只有前者包含构建目标的正确构建配置。

PR 链接

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.y16.x.y17.x.y18.x.y19.x.y
14.x.y15.x.y16.x.y17.x.y18.x.y
13.x.y14.x.y15.x.y16.x.y17.x.y
12.x.y13.x.y14.x.y15.x.y--

原文链接

Electron 16.0.0

本文搬运自我的语雀文章《Electron16的新特性》,欢迎关注我的语雀个人主页。同时欢迎关注我的掘金专栏,这个专栏将会持续分享学习各种前端/桌面端相关技术(Electron、node.js、V8、Chromium等)的新特性