Electron 团队很高兴地宣布 Electron 4 稳定版现已发布!您可以从 electronjs.org 或通过 `npm install electron@latest` 从 npm 安装。本次发布包含了大量的升级、修复和新功能,我们迫不及待地想看到您将用它们构建出什么。请继续阅读以了解本次发布的详细信息,并在探索过程中分享您的任何反馈!
有什么新内容?
Electron 的大部分功能由 Chromium、Node.js 和 V8 提供,它们是构成 Electron 的核心组件。因此,Electron 团队的一个关键目标是尽可能跟上这些项目的变化,让开发 Electron 应用的开发者能够访问新的 Web 和 JavaScript 功能。为此,Electron 4 对这些组件中的每一个都进行了大版本升级;Electron v4.0.0 包括 Chromium `69.0.3497.106`、Node `10.11.0` 和 V8 `6.9.427.24`。
此外,Electron 4 还包含对 Electron 特有 API 的更改。您可以在下面找到 Electron 4 主要变化的摘要;有关更改的完整列表,请查看 Electron v4.0.0 版本说明。
禁用 remote
模块
出于安全原因,您现在可以禁用 remote
模块。该模块可以为 BrowserWindow
和 webview
标签禁用。
new BrowserWindow({
webPreferences: {
enableRemoteModule: false
}
})
<webview src="http://www.google.com/" enableremotemodule="false"></webview>
有关更多信息,请参阅 BrowserWindow 和 <webview>
标签 文档。
过滤 remote.require()
/ remote.getGlobal()
请求
如果您不想在渲染器进程或 webview
中完全禁用 remote
模块,但又希望对可以通过 remote.require
加载的模块有额外的控制,那么此功能会很有用。
当在渲染器进程中通过 `remote.require` 请求模块时,会在 app
模块 上触发一个 `remote-require` 事件。您可以调用事件(第一个参数)的 `event.preventDefault()` 来阻止模块加载。发生请求的 WebContents
实例 作为第二个参数传递,模块名称作为第三个参数传递。相同的事件也会在 `WebContents` 实例上发出,但此时唯一的参数是事件和模块名称。在这两种情况下,您都可以通过设置 `event.returnValue` 的值来返回一个自定义值。
app.on('remote-require', function (event, webContents, requestedModuleName) {
});
browserWin.webContents.on(
'remote-require',
function (event, requestedModuleName) {
},
);
类似地,当调用 `remote.getGlobal(name)` 时,会触发一个 `remote-get-global` 事件。这与 `remote-require` 事件的工作方式相同:调用 `preventDefault()` 来阻止返回全局变量,并设置 `event.returnValue` 来返回一个自定义值。
app.on(
'remote-get-global',
function (event, webContents, requrestedGlobalName) {
},
);
browserWin.webContents.on(
'remote-get-global',
function (event, requestedGlobalName) {
},
);
有关更多信息,请参阅以下文档:
JavaScript 访问关于面板
在 macOS 上,您现在可以调用 `app.showAboutPanel()` 以编程方式显示“关于”面板,就像点击通过 `{role: 'about'}` 创建的菜单项一样。有关更多信息,请参阅 showAboutPanel
文档。
控制 WebContents
后台节流
WebContents
实例现在有一个 setBackgroundThrottling(allowed)
方法,用于在页面处于后台时启用或禁用计时器和动画的节流。
let win = new BrowserWindow(...)
win.webContents.setBackgroundThrottling(enableBackgroundThrottling)
有关更多信息,请参阅 setBackgroundThrottling
文档。
破坏性变更
不再支持 macOS 10.9
Chromium 不再支持 macOS 10.9 (OS X Mavericks),因此 Electron 4.0 及更高版本也不支持它。
单实例锁定
以前,要使您的应用程序成为单实例应用程序(确保任何给定时间只有一个应用程序实例在运行),您可以使用 `app.makeSingleInstance()` 方法。从 Electron 4.0 开始,您必须改用 `app.requestSingleInstanceLock()`。此方法的返回值表明此应用程序实例是否成功获得了锁。如果未能获得锁,您可以假定另一个应用程序实例已在运行并持有锁,然后立即退出。
有关使用 `requestSingleInstanceLock()` 的示例以及在各种平台上进行细微行为的信息,请参阅 `app.requestSingleInstanceLock()` 和相关方法 的文档以及 `second-instance` 事件。
win_delay_load_hook
在为 Windows 构建原生模块时,模块的 `binding.gyp` 中的 `win_delay_load_hook` 变量必须为 true(这是默认值)。如果缺少此钩子,原生模块将在 Windows 上加载失败,并出现类似 `Cannot find module` 的错误消息。有关更多信息,请参阅 原生模块指南。
以下重大更改已计划在 Electron 5.0 中进行,因此在 Electron 4.0 中已弃用。
为使用 nativeWindowOpen
打开的窗口禁用 Node.js 集成
从 Electron 5.0 开始,使用 nativeWindowOpen
选项打开的子窗口将始终禁用 Node.js 集成。
webPreferences
默认值
在使用 webPreferences
选项创建新的 BrowserWindow
时,以下 webPreferences
选项默认值将被弃用,转而使用下面列出的新默认值:
属性 | 已弃用的默认值 | 新默认值 |
---|
contextIsolation | false | true |
nodeIntegration | true | false |
webviewTag | nodeIntegration 的值(如果已设置),否则为 true | false |
请注意:目前存在一个 已知错误 (#9736),它会导致 `webview` 标签在 `contextIsolation` 开启时无法正常工作。请关注 GitHub issue 以获取最新信息!
在 Electron 安全文档中了解有关 context isolation、Node 集成和 webview
标签的更多信息。
Electron 4.0 仍将使用当前的默认值,但如果您不为它们设置显式值,您将看到一个弃用警告。为了让您的应用程序为 Electron 5.0 做好准备,请为这些选项使用显式值。有关这些选项的详细信息,请参阅 BrowserWindow
文档。
webContents.findInPage(text[, options])
medialCapitalAsWordStart
和 wordStart
选项已被弃用,因为它们已在 upstream 中移除。
应用反馈计划
我们在开发 Electron 3.0 时推出的 App Feedback Program 非常成功,因此在开发 4.0 时也继续进行了。我们想向 Atlassian、Discord、MS Teams、OpenFin、Slack、Symphony、WhatsApp 以及其他参与该计划的成员在 4.0 beta 周期内的参与表示衷心感谢。要了解有关 App Feedback Program 的更多信息并参与未来的 beta 测试,请查看我们关于该计划的博客文章。
下一步计划
短期内,您可以期待团队继续专注于跟进构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。虽然我们不承诺具体的发布日期,但我们的计划是大约每季度发布一次新的 Electron 主要版本,其中包含这些组件的新版本。请参阅我们的版本说明文档,以获取有关 Electron 版本控制的更详细信息。
有关 Electron 未来版本中计划的重大变更信息,请参阅我们的“计划中的重大变更”文档。