跳到主要内容

新的 Electron 发布节奏

·3 分钟阅读
⚡️ 更新 (2021-07-14): 我们正在更快地前进!

在 2021 年第三季度,Chrome 团队加快了他们的发布节奏,从每 6 周一次变为每 4 周一次。Electron 的发布也紧随其后。请阅读更新后的8 周节奏博客文章,以获取更多最新信息!

🎉 Electron 正在转向每 12 周发布一个新的主要稳定版本!🎉


⚡️ 哇,真快!但为什么?

简而言之,Chromium 不会停止发布,所以 Electron 也不会放慢速度。

Chromium 按照一致的 6 周时间表发布。为了在 Electron 中交付最新版本的 Chromium,我们的时间表需要跟踪他们的时间表。有关 Chromium 发布周期的更多信息,请参见此处

🚀 为什么是每 12 周?

每 6 周,都会发布一个新的 Chromium 版本,其中包含新功能、错误修复/安全修复和 V8 改进。Electron 的用户一直明确表示希望及时获得这些更改,因此我们调整了稳定发布日期,以匹配每隔一个 Chromium 稳定版本。首先,Electron v6.0.0 将包含 M76,并计划于 2019 年 7 月 30 日稳定发布,与 Chromium M76 的发布日相同。

🚧 这对我和我的 Electron 应用程序意味着什么?

您将比以前更快地访问新的 Chromium 和 V8 功能和修复。重要的是,您还将知道这些新更改何时到来,以便您能够比以前更好地进行计划。

Electron 团队将继续支持最新的三个主要版本。例如,当v6.0.0 于 2019 年 7 月 30 日稳定发布时,我们将支持 v6.x、v5.x 和 v4.x,而 v3.x 将达到生命周期结束。

💬 应用反馈计划

请考虑加入我们的应用反馈计划,以帮助我们测试 beta 版本和稳定化。参与此计划的项目在其应用程序上测试 Electron beta 版本;作为回报,他们发现的新错误将在稳定版本中优先处理。

📝 Electron 版本发布的简要历史

在 v3.0.0 之前的稳定版本决策没有遵循时间表。我们在 v3.0.0 和 v4.0.0 中为项目添加了内部时间表。今年早些时候,我们决定首次公开 Electron v5.0.0 的稳定发布日期。宣布我们的稳定发布日期总体上受到了积极的欢迎,我们很高兴在未来的版本中继续这样做。

为了更好地简化这些与升级相关的工作,我们的升级发布工作组在我们治理系统中创建。它们使我们能够更好地优先处理和委派这项工作,我们希望随着每个后续版本的发布,这一点将变得更加明显。

以下是我们的新节奏与 Chromium 节奏的比较

line graph comparing Electron versus Chromium versions

📨 如果您有任何问题,请发送邮件至 info@electronjs.org

Electron 5.0.0

·4 分钟阅读

Electron 团队很高兴地宣布 Electron 5.0.0 发布!您可以通过 npm 使用 npm install electron@latest 安装它,或从我们的发布页面下载 tarball。该版本包含升级、修复和新功能。我们迫不及待想看看您用它们构建什么!继续阅读以了解有关此版本的详细信息,并请分享您的任何反馈!


新功能?

Electron 的大部分功能由 Chromium、Node.js 和 V8 的核心组件提供。Electron 与这些项目保持同步更新,以便为我们的用户提供新的 JavaScript 功能、性能改进和安全修复。这些软件包在 Electron 5 中都有主要版本升级

Electron 5 还包括针对 Electron 特定 API 的改进。主要更改摘要如下;有关更改的完整列表,请查看 Electron v5.0.0 版本说明

Promise 化

Electron 5 继续 Promise 化倡议,将 Electron 基于回调的 API 转换为使用 Promise。这些 API 已为 Electron 5 转换

  • app.getFileIcon
  • contentTracing.getCategories
  • contentTracing.startRecording
  • contentTracing.stopRecording
  • debugger.sendCommand
  • Cookies API
  • shell.openExternal
  • webContents.loadFile
  • webContents.loadURL
  • webContents.zoomLevel
  • webContents.zoomFactor
  • win.capturePage

macOS 的系统颜色访问

这些函数已更改或添加到 systemPreferences 以访问 macOS 系统的颜色

  • systemPreferences.getAccentColor
  • systemPreferences.getColor
  • systemPreferences.getSystemColor

进程内存信息

已添加函数 process.getProcessMemoryInfo 以获取有关当前进程的内存使用情况统计信息。

远程 API 的其他过滤

为了提高 remote API 的安全性,添加了新的远程事件,以便可以过滤 remote.getBuiltinremote.getCurrentWindowremote.getCurrentWebContents<webview>.getWebContents

BrowserWindow 上的多个 BrowserView

BrowserWindow 现在支持在同一个 BrowserWindow 中管理多个 BrowserView。

重大变更

打包应用的默认值

打包的应用现在的行为将与默认应用相同:除非应用有一个默认应用程序菜单,否则将创建一个默认应用程序菜单,并且除非应用处理 window-all-closed 事件,否则将自动处理该事件。

混合沙盒

混合沙盒模式现在默认启用。以 sandbox: true 启动的渲染器现在将真正被沙盒化,而以前只有在也启用了混合沙盒模式时才会被沙盒化。

安全改进

为了提高安全性,nodeIntegrationwebviewTag 的默认值现在为 false

拼写检查器现在是异步的

SpellCheck API 已更改为提供异步结果

弃用

以下 API 在 Electron 5.0.0 中新弃用,并计划在 6.0.0 中删除

arm 和 arm64 的 Mksnapshot 二进制文件

arm 和 arm64 的 mksnapshot 本机二进制文件已弃用,将在 6.0.0 中删除。可以使用 x64 二进制文件为 arm 和 arm64 创建快照。

WebContents 上的 ServiceWorker API

已弃用 WebContents 上的 ServiceWorker API,为删除它们做准备。

  • webContents.hasServiceWorker
  • webContents.unregisterServiceWorker

带有沙盒 webContents 的自动模块

为了提高安全性,以下模块已被弃用,不能直接通过 require 使用,而是需要在沙盒 webcontents 中通过 remote.require 包含

  • electron.screen
  • child_process
  • fs
  • os
  • path

webFrame Isolated World API

webFrame.setIsolatedWorldContentSecurityPolicywebFrame.setIsolatedWorldHumanReadableNamewebFrame.setIsolatedWorldSecurityOrigin 已弃用,取而代之的是 webFrame.setIsolatedWorldInfo

混合沙盒

enableMixedSandbox--enable-mixed-sandbox 命令行开关仍然存在以实现兼容性,但已弃用且无效。

停止支持 2.0.x

根据我们的支持版本策略,2.0.x 已达到生命周期结束。

应用反馈计划

我们继续使用我们的 应用反馈计划进行测试。参与此计划的项目在其应用程序上测试 Electron beta 版本;作为回报,他们发现的新错误将在稳定版本中优先处理。如果您想参与或了解更多信息,请查看我们关于该计划的博客文章

下一步是什么?

在短期内,您可以期望团队继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。尽管我们谨慎地不承诺发布日期,但我们的计划是大约每季度发布带有这些组件新版本的 Electron 主要版本。暂定的 6.0.0 时间表 概述了 Electron 6 开发生命周期中的关键日期。此外,请参阅我们的版本控制文档,以获取有关 Electron 中版本控制的更多详细信息。

有关即将发布的 Electron 版本中计划的重大变更的信息,请参阅我们的计划重大变更文档

从原生到 Electron 中的 JavaScript

·4 分钟阅读

Electron 用 C++ 或 Objective-C 编写的功能如何到达 JavaScript,以便最终用户可以使用它们?


背景

Electron 是一个 JavaScript 平台,其主要目的是降低开发人员构建健壮的桌面应用程序的门槛,而无需担心特定于平台的实现。但是,就其核心而言,Electron 本身仍然需要用给定的系统语言编写特定于平台的功能。

实际上,Electron 为您处理本机代码,以便您可以专注于单个 JavaScript API。

但这如何工作呢?Electron 用 C++ 或 Objective-C 编写的功能如何到达 JavaScript,以便最终用户可以使用它们?

为了追溯这条路径,让我们从app 模块开始。

通过打开我们 lib/ 目录中的 app.ts 文件,您会在顶部附近找到以下代码行

const binding = process.electronBinding('app');

此行直接指向 Electron 将其 C++/Objective-C 模块绑定到 JavaScript 以供开发人员使用的机制。此函数由 ElectronBindings 类的标头和实现文件创建。

process.electronBinding

这些文件添加了 process.electronBinding 函数,其行为类似于 Node.js 的 process.bindingprocess.binding 是 Node.js 的 require() 方法的较低级别实现,只是它允许用户 require 本机代码而不是用 JS 编写的其他代码。此自定义 process.electronBinding 函数赋予了从 Electron 加载本机代码的能力。

当顶层 JavaScript 模块(如 app)需要此本机代码时,该本机代码的状态是如何确定的和设置的?暴露给 JavaScript 的方法在哪里?属性呢?

native_mate

目前,此问题的答案可以在 native_mate 中找到:它是 Chromium 的 gin的一个分支,它使在 C++ 和 JavaScript 之间编组类型变得更容易。

native_mate/native_mate 内部,有一个 object_template_builder 的标头和实现文件。这使我们能够在本机代码中形成模块,其形状符合 JavaScript 开发人员的期望。

mate::ObjectTemplateBuilder

如果我们将每个 Electron 模块都视为一个 object,那么就更容易理解为什么我们要使用 object_template_builder 来构建它们。此类构建在 V8 公开的类之上,V8 是 Google 的开源高性能 JavaScript 和 WebAssembly 引擎,用 C++ 编写。V8 实现了 JavaScript (ECMAScript) 规范,因此其本机功能实现可以直接与 JavaScript 中的实现相关联。例如,v8::ObjectTemplate 为我们提供了没有专用构造函数和原型的 JavaScript 对象。它使用 Object[.prototype],在 JavaScript 中等效于 Object.create()

要查看实际效果,请查看 app 模块的实现文件 atom_api_app.cc。底部是以下内容

mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.SetMethod("getGPUInfo", &App::GetGPUInfo)

在上面的行中,在 mate::ObjectTemplateBuilder 上调用了 .SetMethod。可以在 ObjectTemplateBuilder 类的任何实例上调用 .SetMethod,以在 JavaScript 中的 Object 原型上设置方法,语法如下

.SetMethod("method_name", &function_to_bind)

这是 JavaScript 等效于

function App{}
App.prototype.getGPUInfo = function () {
// implementation here
}

此类还包含在模块上设置属性的函数

.SetProperty("property_name", &getter_function_to_bind)

或者

.SetProperty("property_name", &getter_function_to_bind, &setter_function_to_bind)

这些反过来将是 Object.defineProperty 的 JavaScript 实现

function App {}
Object.defineProperty(App.prototype, 'myProperty', {
get() {
return _myProperty
}
})

function App {}
Object.defineProperty(App.prototype, 'myProperty', {
get() {
return _myProperty
}
set(newPropertyValue) {
_myProperty = newPropertyValue
}
})

可以创建用原型和属性形成的 JavaScript 对象,就像开发人员期望的那样,并且更清楚地推理在这个较低系统级别实现的功能和属性!

在何处实现任何给定的模块方法的决定本身是一个复杂且经常不确定的决定,我们将在以后的文章中介绍。

Electron 治理

·2 分钟阅读

随着 Electron 在桌面应用程序中越来越受欢迎,致力于它的团队也在壮大:我们有更多为不同公司工作的全职维护人员,他们生活在不同的时区,并且有不同的兴趣。我们正在引入治理结构,以便我们可以保持平稳增长。


为什么事情在变化?

Electron 项目中的人们与志愿者、全职维护人员以及依赖 Electron 的多家公司在世界各地的时区进行协调。到目前为止,我们通过非正式协调取得了成功;但随着团队的壮大,我们发现这种方法无法扩展。我们还希望让新的贡献者更容易在项目中找到一个可以称之为家的地方。

工作组

Electron 治理包括负责项目不同部分的工作组。我们从七个小组开始

  • 社区与安全:处理 行为准则 问题。
  • 文档与工具:监督以外部为中心的工具(例如 FiddleForge)和 Electron 文档
  • 外展:帮助发展 Electron 社区。
  • 发布:确保发布稳定且按计划进行。
  • 安全:执行安全测试并响应安全问题。
  • 升级:集成上游升级,例如 V8、Chromium 和 Node 的新版本。
  • 网站:维护和改进 Electron 网站

这些小组将相互协调,但每个小组都有自己的会议时间表和议程,以便各自高效工作。有关这些小组的更多详细信息,请访问治理存储库

这会改变 Electron 项目的方向吗?

这不应对 Electron 的方向产生任何直接影响。如果我们的策略成功,工作组将使新的贡献者更容易找到他们感兴趣的主题,并通过将与其日常工作无关的讨论转移到其他小组来简化维护人员的生活。如果发生这种情况,它可能会通过让更多畅通无阻的人员一起工作来间接影响事物。

在哪里可以了解更多信息?

Chromium FileReader 漏洞修复

·一分钟阅读

在 Chrome 中发现了一个高危漏洞,该漏洞影响所有基于 Chromium 的软件,包括 Electron。

此漏洞已分配为 CVE-2019-5786。您可以在Chrome 博客文章中阅读更多相关信息。

请注意,Chrome 有关于此漏洞在野外被利用的报告,因此强烈建议您尽快升级 Electron。


范围

这会影响任何可能运行第三方或不受信任的 JavaScript 的 Electron 应用程序。

缓解措施

受影响的应用程序应升级到已修补版本的 Electron。

我们发布了新版本的 Electron,其中包含此漏洞的修复程序

最新的 Electron 5 beta 版本正在跟踪 Chromium 73,因此已经修补

更多信息

此漏洞由 Google 威胁分析小组的 Clement Lecigne 发现并报告给 Chrome 团队。Chrome 博客文章可以在此处找到。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至 security@electronjs.org

停止支持 32 位 Linux

·3 分钟阅读

Electron 团队将从 Electron v4.0 开始停止支持 32 位 Linux (ia32 / i386)。最后一个支持基于 32 位安装的 Linux 的 Electron 版本是 Electron v3.1,该版本将获得支持版本,直到 Electron v6 发布。对基于 64 位的 Linux 和 armv7l 的支持将继续保持不变。


Electron 究竟不再支持什么?

您可能在电脑上或作为下载软件的选项中看到过“64 位”和“32 位”的描述标签。该术语用于描述特定的计算机架构。20 世纪 90 年代和 21 世纪初制造的大多数计算机都使用基于 32 位架构的 CPU,而之后制造的大多数计算机都基于更新、更强大的 64 位架构。任天堂 64(明白了吗?)和 PlayStation 2 是首批广泛使用新架构的消费设备,2010 年之后销售的计算机几乎完全包含 64 位处理器。因此,支持一直在萎缩:谷歌在 2016 年 3 月停止发布适用于 32 位 Linux 的 Chrome 浏览器,Canonical 在 2017 年停止提供 32 位桌面镜像,并在 Ubuntu 18.10 中完全放弃了对 32 位的支持。Arch Linux、elementary OS 和其他著名的 Linux 发行版已经放弃了对老旧处理器架构的支持。

到目前为止,Electron 已经提供并支持在旧的 32 位架构上运行的构建版本。从 v4.0 版本开始,Electron 团队将不再能够为 32 位 Linux 提供二进制文件或支持。

Electron 一直是一个充满活力的开源项目,我们将继续支持和鼓励有兴趣为特殊架构构建 Electron 的开发者。

这对开发者意味着什么?

如果您当前没有为 Linux 提供 32 位版本的应用程序,则无需采取任何操作。

发布 32 位 Linux Electron 应用程序的项目将需要决定如何进行。32 位 Linux 将在 Electron 3 上获得支持,直到 Electron 6 发布,这为您制定决策和计划提供了一些时间。

这对用户意味着什么?

如果您是 Linux 用户,并且不确定您是否正在运行基于 64 位的系统,那么您很可能正在运行基于 64 位的架构。为了确保这一点,您可以在终端中运行 lscpuuname -m 命令。这两个命令中的任何一个都会打印出您当前的架构。

如果您在 32 位处理器上使用 Linux,您可能已经遇到了难以找到最近发布的适用于您的操作系统的软件的问题。Electron 团队与 Linux 社区的其他重要成员一起,建议您升级到基于 64 位的架构。

BrowserView window.open() 漏洞修复

·一分钟阅读

已发现一个代码漏洞,该漏洞允许在子窗口中重新启用 Node。


使用 sandbox: truenativeWindowOpen: truenodeIntegration: false 打开 BrowserView 会导致 webContents 在其中可以调用 window.open,并且新打开的子窗口将启用 nodeIntegration。此漏洞会影响所有受支持的 Electron 版本。

缓解措施

我们发布了新版本的 Electron,其中包含此漏洞的修复程序:2.0.173.0.153.1.34.0.45.0.0-beta.2。我们鼓励所有 Electron 开发者立即将他们的应用程序更新到最新的稳定版本。

如果由于某种原因您无法升级您的 Electron 版本,您可以通过禁用所有子 web contents 来缓解此问题

view.webContents.on('-add-new-contents', (e) => e.preventDefault());

更多信息

此漏洞由 PalmerAL 发现并负责任地报告给 Electron 项目。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至 security@electronjs.org

Node.js 原生插件和 Electron 5.0

·2 分钟阅读

如果您在使用 Electron 5.0 的原生 Node.js 插件时遇到问题,则可能需要更新该插件才能与最新版本的 V8 配合使用。


再见 v8::Handle,你好 v8::Local

2014 年,V8 团队弃用了 v8::Handle,转而使用 v8::Local 作为本地句柄。Electron 5.0 包含一个版本的 V8,该版本最终完全移除了 v8::Handle,仍然使用它的原生 Node.js 插件将需要更新,然后才能与 Electron 5.0 一起使用。

所需的代码更改非常小,但是每个仍然使用 v8::Handle 的原生 Node 模块都将无法使用 Electron 5.0 构建,并且需要进行修改。好消息是 Node.js v12 也将包含此 V8 更改,因此任何使用 v8::Handle 的模块无论如何都需要更新才能与即将发布的 Node 版本一起使用。

我维护一个原生插件,我该如何帮助?

如果您维护一个 Node.js 的原生插件,请确保将所有出现的 v8::Handle 替换为 v8::Local。前者只是后者的别名,因此无需进行其他更改即可解决此特定问题。

您可能还有兴趣了解 N-API,它作为 Node.js 本身的一部分与 V8 分开维护,旨在将原生插件与底层 JavaScript 引擎中的更改隔离开来。您可以在 Node.js 网站上的 N-API 文档中找到更多信息。

救命!我在我的应用程序中使用原生插件,但它无法工作!

如果您在您的应用程序中使用 Node.js 的原生插件,并且由于此问题导致原生插件无法构建,请与插件的作者联系,看看他们是否发布了修复此问题的新版本。如果没有,联系作者(或打开一个拉取请求!)可能是您最好的选择。

Electron v5.0.0 时间线

·2 分钟阅读

Electron 首次公开宣布从 v5.0.0 开始的发布时间表,我们对此感到非常兴奋。这是我们拥有公开、长期时间表的第一步。


正如我们在 v4.0.0 稳定版本博客文章中提到的,我们计划大约每季度发布一次,以与 Chromium 版本保持更紧密的节奏。Chromium 版本发布非常快 —— 每 6 周一次。

请看 Electron 与 Chromium 并排的进展情况

line graph comparing Electron versus Chromium versions

在 2018 年下半年,我们的首要任务是更快地发布并更接近 Chromium。我们通过坚持预定的时间表取得了成功。Electron 3.0.0 和 4.0.0 在每个版本 2-3 个月的时间表内发布。我们对继续保持这种速度发布 5.0.0 及更高版本感到乐观。随着大约每季度发布一个主要的 Electron 版本,我们现在与 Chromium 的发布节奏保持同步。领先于 Chromium 稳定版本始终是我们的目标,我们正在朝着这个目标迈进。

我们很乐意像 Node.jsChromium 那样承诺未来的日期,但我们尚未达到那个阶段。我们乐观地认为,我们将在未来达到长期时间表。

考虑到这一点,我们正在采取第一步,公开发布我们的 v5.0.0 发布时间表。您可以在此处找到它。

为了帮助我们测试我们的 beta 版本和稳定性,请考虑加入我们的应用程序反馈计划

Electron 4.0.0

·6 分钟阅读

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 模块。可以为 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() 来阻止加载模块。发生请求的 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(这是默认值)。如果此钩子不存在,则原生模块将无法在 Windows 上加载,并显示类似 Cannot find module 的错误消息。请参阅原生模块指南了解更多信息。

弃用

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

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

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

webPreferences 默认值

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

属性已弃用的默认值新默认值
contextIsolationfalsetrue
nodeIntegrationtruefalse
webviewTagnodeIntegration 的值(如果已设置),否则为 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 beta 周期中的参与表示衷心的感谢。要了解有关应用程序反馈计划的更多信息并参与未来的 beta 测试,请查看我们关于该计划的博客文章

下一步是什么?

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

有关即将发布的 Electron 版本中计划的重大变更的信息,请参阅我们的计划重大变更文档