跳至主要内容

Electron 4.0.0

·阅读 6 分钟

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 模块。可以为 BrowserWindowwebview 标签禁用该模块。

// BrowserWindow
new BrowserWindow({
webPreferences: {
enableRemoteModule: false
}
})

// webview tag
<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() 以阻止加载模块。发生 require 的 WebContents 实例 作为第二个参数传递,模块名称作为第三个参数传递。相同的事件也会在 WebContents 实例上发出,但在这种情况下,唯一的参数是事件和模块名称。在这两种情况下,您可以通过设置 event.returnValue 的值来返回自定义值。

// Control `remote.require` from all WebContents:
app.on('remote-require', function (event, webContents, requestedModuleName) {
// ...
});

// Control `remote.require` from a specific WebContents instance:
browserWin.webContents.on(
'remote-require',
function (event, requestedModuleName) {
// ...
}
);

类似地,当调用 remote.getGlobal(name) 时,会引发 remote-get-global 事件。这与 remote-require 事件的工作方式相同:调用 preventDefault() 以阻止返回全局变量,并设置 event.returnValue 以返回自定义值。

// Control `remote.getGlobal` from all WebContents:
app.on(
'remote-get-global',
function (event, webContents, requrestedGlobalName) {
// ...
}
);

// Control `remote.getGlobal` from a specific WebContents instance:
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(默认为 true)。如果缺少此钩子,则原生模块将无法在 Windows 上加载,并显示类似于无法找到模块的错误消息。请参阅原生模块指南了解更多信息。

弃用

以下重大更改计划在 Electron 5.0 中进行,因此在 Electron 4.0 中已弃用。

为使用nativeWindowOpen打开的窗口禁用 Node.js 集成

从 Electron 5.0 开始,使用nativeWindowOpen选项打开的子窗口将始终禁用 Node.js 集成。

webPreferences 默认值

使用webPreferences选项创建新的BrowserWindow时,以下webPreferences选项的默认值已弃用,取而代之的是下面列出的新默认值。

属性已弃用的默认值新的默认值
contextIsolationfalsetrue
nodeIntegrationtruefalse
webviewTag如果设置了nodeIntegration,则为其值,否则为truefalse

请注意:目前存在一个已知的错误(#9736),如果启用了contextIsolation,则会阻止webview标签工作。请关注 GitHub 问题以获取最新信息!

Electron 安全文档中了解有关上下文隔离、Node 集成和webview标签的更多信息。

Electron 4.0 仍将使用当前默认值,但如果您不为其传递显式值,则会看到弃用警告。要为 Electron 5.0 准备您的应用程序,请为这些选项使用显式值。请参阅BrowserWindow文档以了解每个选项的详细信息。

webContents.findInPage(text[, options])

medialCapitalAsWordStartwordStart选项已弃用,因为它们已在上游移除。

应用程序反馈计划

我们在 Electron 3.0 开发期间启动的应用程序反馈计划取得了成功,因此我们在 4.0 的开发期间也继续进行。我们要感谢 Atlassian、Discord、MS Teams、OpenFin、Slack、Symphony、WhatsApp 和其他计划成员在 4.0 测试版周期中的参与。要了解有关应用程序反馈计划的更多信息并参与未来的测试版,请查看我们关于该计划的博文

接下来是什么

在短期内,您可以预期团队将继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。虽然我们谨慎地不对发布日期做出承诺,但我们的计划是大约每季度发布 Electron 的新主要版本,其中包含这些组件的新版本。请参阅我们的版本控制文档,以获取有关 Electron 版本控制的更多详细信息。

有关 Electron 未来版本中计划的重大更改的信息,请参阅我们计划的重大更改文档