Electron 团队很高兴地宣布,Electron 4 的稳定版现已发布!您可以从 electronjs.org 或通过 npm (npm install electron@latest
) 安装它。该版本包含大量升级、修复和新功能,我们迫不及待地想看看您将使用它们构建什么。请阅读更多信息,了解有关此版本的详细信息,并在您探索时分享您的任何反馈!
新增功能?
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
创建新 BrowserWindow
时,以下 webPreferences
选项默认值已弃用,取而代之的是下面列出的新默认值
属性 | 已弃用的默认值 | 新的默认值 |
---|
contextIsolation | false | true |
nodeIntegration | true | false |
webviewTag | 如果设置了 nodeIntegration 的值,则为该值,否则为 true | false |
请注意:目前存在 一个已知错误(#9736),如果 contextIsolation
处于开启状态,则会阻止 webview
标签正常工作。请关注 GitHub 问题以获取最新信息!
在 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 测试版周期中的参与。要了解有关应用反馈计划的更多信息并参与未来的测试版,请查看我们有关该计划的博客文章。
下一步
短期内,您可以预期该团队将继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。虽然我们谨慎地不承诺发布日期,但我们的计划是大约每季度发布一次包含新版本组件的新版本 Electron。请参阅我们的版本控制文档,以获取有关 Electron 中版本控制的更多详细信息。
有关计划在 Electron 的未来版本中进行的重大更改的信息,请参阅我们计划中的重大更改文档。