Electron 4.0.0
Electron 团队很高兴地宣布 Electron 4 稳定版现已发布!您可以从 electronjs.org 或通过 npm 安装:npm install electron@latest
。 此版本包含大量升级、修复和新功能,我们迫不及待地想看到您用它们构建什么。 阅读更多内容了解此版本的详细信息,并在探索时分享您的任何反馈!
新特性
Electron 的很大一部分功能由组成 Electron 的核心组件 Chromium、Node.js 和 V8 提供。 因此,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
标签禁用
// BrowserWindow
new BrowserWindow({
webPreferences: {
enableRemoteModule: false
}
})
// webview tag
<webview src="http://www.google.com/" enableremotemodule="false"></webview>
有关更多信息,请参阅 BrowserWindow 和 <webview>
Tag 文档。
过滤 remote.require()
/ remote.getGlobal()
请求
如果您不想在渲染进程或 webview
中完全禁用 remote
模块,但希望对哪些模块可以通过 remote.require
加载进行额外控制,此功能非常有用。
当在渲染进程中通过 remote.require
加载模块时,会在 app
module 上触发一个 remote-require
事件。 您可以在事件(第一个参数)上调用 event.preventDefault()
来阻止模块加载。 触发加载的 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(这是默认值)。 如果不存在此 hook,则原生模块将在 Windows 上加载失败,并显示类似“Cannot find module”的错误消息。 有关更多信息,请参阅原生模块指南。
废弃
以下重大变更计划在 Electron 5.0 中实现,因此在 Electron 4.0 中已被废弃。
对使用 nativeWindowOpen
打开的窗口禁用 Node.js 集成
从 Electron 5.0 开始,使用 nativeWindowOpen
选项打开的子窗口将始终禁用 Node.js 集成。
webPreferences
默认值
当创建新的 BrowserWindow
并设置了 webPreferences
选项时,以下 webPreferences
选项默认值已被废弃,转而使用下方列出的新默认值
属性 | 废弃的默认值 | 新的默认值 |
---|---|---|
contextIsolation | false | true |
nodeIntegration | true | false |
webviewTag | 如果设置了 nodeIntegration 的值,否则为 true | false |
请注意:目前存在一个已知 Bug (#9736),该 Bug 会导致在 contextIsolation
开启时 webview
标签无法工作。 请持续关注此 GitHub Issue 以获取最新信息!
在Electron 安全文档中了解更多关于上下文隔离、Node 集成和 webview
标签的信息。
Electron 4.0 仍将使用当前的默认值,但如果您没有为它们传递显式值,您将看到废弃警告。 为了您的应用为 Electron 5.0 做好准备,请为这些选项使用显式值。 有关这些选项的详细信息,请参阅BrowserWindow
文档。
webContents.findInPage(text[, options])
medialCapitalAsWordStart
和 wordStart
选项已被废弃,因为它们已在上游移除。
应用反馈计划
我们在 Electron 3.0 开发期间设立的应用反馈计划很成功,因此我们在 4.0 的开发过程中也继续实施了该计划。 我们非常感谢 Atlassian、Discord、MS Teams、OpenFin、Slack、Symphony、WhatsApp 以及其他计划成员在 4.0 Beta 周期中的参与。 要了解更多关于应用反馈计划的信息并参与未来的 Beta 版本,请查看我们关于该计划的博客文章。
下一步计划
短期内,您可以期望团队继续专注于跟进构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。 尽管我们不会对发布日期做出承诺,但我们的计划是大约每季度发布 Electron 的新主要版本,其中包含这些组件的新版本。 有关 Electron 版本控制的详细信息,请参阅我们的版本控制文档。
有关 Electron 未来版本中计划的重大变更的信息,请参阅我们的计划重大变更文档。