跳到主要内容

42 篇标记为“发布”的文章

关于新的 Electron 版本的博客文章

查看所有标签

新的 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

📨 如果您有任何疑问,请发送邮件至 [email protected]

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 隔离世界 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 即将发布的版本中计划的重大更改的信息,请参阅我们的计划的重大更改文档

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 版本并使其稳定,请考虑加入我们的 App 反馈计划

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() 来阻止加载该模块。发生 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(这是默认值)。如果不存在此钩子,则本机模块将无法在 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
webviewTag如果设置了 nodeIntegration,则为该值,否则为 truefalse

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

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

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

webContents.findInPage(text[, options])

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

应用程序反馈计划

我们在 Electron 3.0 开发期间建立的 App 反馈计划 非常成功,因此我们在 4.0 的开发期间也继续沿用了该计划。我们非常感谢 Atlassian、Discord、MS Teams、OpenFin、Slack、Symphony、WhatsApp 以及其他项目成员在 4.0 beta 测试周期中的参与。要了解有关 App 反馈计划的更多信息并参与未来的 beta 测试,请查看我们关于该计划的博客文章

下一步是什么

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

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

Electron 3.0.0

·4 分钟阅读

Electron 团队很高兴地宣布,Electron 3 的第一个稳定版本现在可以从 electronjs.org 以及通过 npm install electron@latest 获取!它包含了大量的升级、修复和新功能,我们迫不及待地想看看您用它们构建什么。以下是关于此版本的详细信息,我们欢迎您在探索时提供反馈。


发布过程

在进行 v3.0.0 的开发时,我们试图通过正式化渐进式 beta 版本的反馈进度,更经验性地定义稳定版本的标准。如果没有我们的 App 反馈计划合作伙伴在 beta 测试周期中提供的早期测试和反馈,v3.0.0 将不可能实现。感谢 Atlassian、Atom、Microsoft Teams、Oculus、OpenFin、Slack、Symphony、VS Code 和其他项目成员的工作。如果您想参与未来的 beta 测试,请发送邮件至 [email protected]

更改 / 新功能

Electron 工具链的几个重要部分进行了重大升级,包括 Chrome v66.0.3359.181、Node v10.2.0 和 V8 v6.6.346.23

  • [#12656] feat: app.isPackaged
  • [#12652] feat: app.whenReady()
  • [#13183] feat: process.getHeapStatistics()
  • [#12485] feat: win.moveTop() 将窗口 z 轴顺序移动到顶部
  • [#13110] feat: TextField 和 Button API
  • [#13068] feat: 用于动态日志控制的 netLog API
  • [#13539] feat: 在沙盒渲染器中启用 webview
  • [#14118] feat: fs.readSync 现在可以处理大型文件
  • [#14031] feat: node fs 包装器,使 fs.realpathSync.nativefs.realpath.native 可用

破坏性 API 更改

  • [#12362] feat: 更新菜单项顺序控制
  • [#13050] refactor: 移除已记录的已弃用 API
    • 有关更多详细信息,请参阅 文档
  • [#12477] refactor: 移除 did-get-response-detailsdid-get-redirect-request 事件
  • [#12655] feat: 默认禁用拖放导航
  • [#12993] feat: 要求 Node v4.x 或更高版本才能使用 electron npm 模块
  • [#12008 #12140 #12503 #12514 #12584 #12596 #12637 #12660 #12696 #12716 #12750 #12787 #12858] refactor: NativeWindow
  • [#11968] refactor: menu.popup()
  • [#8953] feat: 不再使用 JSON 发送 ipcRenderer.sendSync 的结果
  • [#13039] feat: 默认忽略 URL 后面的命令行参数
  • [#12004] refactor: 将 api::Window 重命名为 api::BrowserWindow
  • [#12679] feat: 视觉缩放现在默认关闭
  • [#12408] refactor: 将应用命令 media-play_pause 重命名为 media-play-pause

macOS

  • [#12093] feat: 工作区通知支持
  • [#12496] feat: tray.setIgnoreDoubleClickEvents(ignore) 忽略托盘双击事件。
  • [#12281] feat: macOS 上的鼠标前进功能
  • [#12714] feat: 屏幕锁定/解锁事件

Windows

  • [#12879] feat: 添加了 DIP 到/从屏幕坐标的转换

请注意: 在运行此版本后切换到旧版本的 Electron 将需要您清除用户数据目录,以避免旧版本崩溃。您可以通过运行 console.log(app.getPath("userData")) 获取用户数据目录,或者查看文档了解更多详细信息。

Bug 修复

  • [#13397] fix: fs.statSyncNoException 抛出异常的问题
  • [#13476, #13452] fix: 加载带有 jquery 的站点时崩溃
  • [#14092] fix: net::ClientSocketHandle 析构函数中的崩溃
  • [#14453] fix: 立即通知焦点更改,而不是在下一个 tick 时

MacOS

  • [#13220] fix: 允许在 <input file="type"> 打开文件对话框中选择捆绑包的问题
  • [#12404] fix: 使用异步对话框时阻止主进程的问题
  • [#12043] fix: 上下文菜单点击回调
  • [#12527] fix: 重复使用 touchbar 项目时的事件泄漏
  • [#12352] fix: 托盘标题崩溃
  • [#12327] fix: 不可拖动区域
  • [#12809] fix: 防止菜单在打开时更新
  • [#13162] fix: 托盘图标边界不允许负值
  • [#13085] fix: 高亮显示时托盘标题未反转
  • [#12196] 修复:当 enable_run_as_node==false 时,Mac 构建失败的问题
  • [#12157] 修复:具有活力效果的无边框窗口的其他问题
  • [#13326] 修复:在调用 app.removeAsDefaultProtocolClient 后,将 mac 协议设置为 none
  • [#13530] 修复:在 MAS 构建中不正确地使用私有 API
  • [#13517] 修复:tray.setContextMenu 崩溃的问题
  • [#14205] 修复:即使设置了 defaultId,在对话框上按 Esc 键现在也会关闭对话框

Linux

  • [#12507] 修复:离屏窗口的 BrowserWindow.focus()

其他说明

  • PDF 查看器目前无法工作,但正在进行修复,很快将再次可用
  • TextFieldButton API 是实验性的,因此默认关闭
    • 可以使用 enable_view_api 构建标志启用它们

下一步

Electron 团队将继续致力于定义我们的流程,以便更快速、更平稳地进行升级,同时我们也在寻求最终与 Chromium、Node 和 V8 的开发节奏保持一致。

Electron 2.0.0

·5 分钟阅读

经过四个多月的开发、八个 beta 版本发布以及来自许多应用程序的分阶段推出的全球测试,Electron 2.0.0 版本现在已在 electronjs.org 上可用。


发布过程

从 2.0.0 开始,Electron 的发布将遵循语义化版本控制。这意味着主版本将更频繁地更新,通常是对 Chromium 的重大更新。补丁版本应该更稳定,因为它们将只包含高优先级的错误修复。

Electron 2.0.0 也代表了 Electron 在主版本发布之前稳定性的改进。一些大型的 Electron 应用程序已在其分阶段推出中包含了 2.0.0 beta 版本,为 beta 系列提供了 Electron 有史以来最好的反馈循环。

更改 / 新功能

  • 对 Electron 工具链的几个重要部分进行了重大升级,包括 Chrome 61、Node 8.9.3、V8 6.1.534.41、Linux 上的 GTK+ 3、更新的拼写检查器和 Squirrel。
  • 现在在 MacOS 上支持应用内购买#11292
  • 用于加载文件的新 API。 #11565
  • 用于启用/禁用窗口的新 API。 #11832
  • 新 API app.setLocale()。 #11469
  • 新支持记录 IPC 消息。 #11880
  • 新的菜单事件。 #11754
  • 向 powerMonitor 添加 shutdown 事件。 #11417
  • 为将多个 BrowserWindow 聚集到单个进程中添加 affinity 选项。 #11501
  • 添加 saveDialog 以列出可用扩展名的功能。 #11873
  • 支持其他通知操作 #11647
  • 能够设置 macOS 通知关闭按钮标题。 #11654
  • 为 menu.popup(window, callback) 添加条件
  • 触控栏项目中的内存改进。 #12527
  • 改进的安全建议清单。
  • 添加应用范围的安全作用域书签。 #11711
  • 添加在渲染器进程中设置任意参数的功能。 #11850
  • 为格式选择器添加辅助视图。 #11873
  • 修复网络委托中的竞争条件。 #12053
  • 放弃对 Linux 上 mips64el 架构的支持。Electron 需要 C++14 工具链,该工具链在发布时对于该架构不可用。我们希望将来重新添加支持。

破坏性 API 更改

  • 删除了 已弃用的 API,包括
    • 更改了 menu.popup 签名。 #11968
    • 删除了已弃用的 crashReporter.setExtraParameter #11972
    • 删除了已弃用的 webContents.setZoomLevelLimitswebFrame.setZoomLevelLimits#11974
    • 删除了已弃用的 clipboard 方法。 #11973
    • 删除了对 tray.setHighlightMode 的布尔参数的支持。 #11981

Bug 修复

  • 进行更改以确保 webContents.isOffscreen() 始终可用。 #12531
  • 修复了当 DevTools 取消停靠并处于焦点时 BrowserWindow.getFocusedWindow() 的问题。 #12554
  • 修复了如果预加载路径包含特殊字符,则沙盒渲染中未加载预加载的问题。 #12643
  • 根据文档修正了 allowRunningInsecureContent 的默认值。 #12629
  • 修复了 nativeImage 的透明度问题。 #12683
  • 修复了 Menu.buildFromTemplate 的问题。 #12703
  • 确认了 menu.popup 选项是对象。 #12330
  • 消除了新进程创建和上下文释放之间的竞争条件。 #12361
  • 在更改 BrowserView 时更新可拖动区域。 #12370
  • 修复了焦点上菜单栏切换 alt 键的检测。 #12235
  • 修复了 webviews 中不正确的警告。 #12236
  • 修复了从父窗口继承 'show' 选项的问题。 #122444
  • 确保 getLastCrashReport() 实际上是最后一次崩溃报告。 #12255
  • 修复了网络共享路径上的 require。 #12287
  • 修复了上下文菜单单击回调。 #12170
  • 修复了弹出菜单位置。 #12181
  • 改进了 libuv 循环清理。 #11465
  • 修复了透明颜色的 hexColorDWORDToRGBA#11557
  • 修复了 getWebPreferences api 中的空指针解引用。 #12245
  • 修复了菜单委托中的循环引用。 #11967
  • 修复了 net.request 的协议过滤。 #11657
  • WebFrame.setVisualZoomLevelLimits 现在设置用户代理缩放约束 #12510
  • 为 webview 选项设置适当的默认值。 #12292
  • 改进了活力效果支持。 #12157 #12171 #11886
  • 修复了单例夹具中的定时问题。
  • 修复了 NotifierSupportsActions() 中损坏的生产缓存
  • 使 MenuItem 角色与 camelCase 兼容。 #11532
  • 改进了触摸栏更新。 #11812#11761
  • 删除了多余的菜单分隔符。 #11827
  • 修复了蓝牙选择器错误。关闭 #11399
  • 修复了 macos 全屏切换菜单项标签。 #11633
  • 改进了窗口停用时工具提示的隐藏。 #11644
  • 迁移了已弃用的 web-view 方法。 #11798
  • 修复了从 browserview 打开的窗口的关闭问题。 #11799
  • 修复了蓝牙选择器错误。 #11492
  • 更新为使用任务计划程序进行 app.getFileIcon API。 #11595
  • 更改为即使在离屏渲染时也触发 console-message 事件。 #11921
  • 修复了使用 WebContents.downloadURL 从自定义协议下载的问题。 #11804
  • 修复了当 devtools 分离时透明窗口失去透明度的问题。 #11956
  • 修复了 Electron 应用取消重启或关机的问题。 #11625

macOS

  • 修复了重复使用触控栏项目时的事件泄漏。 #12624
  • 修复了暗模式下的托盘高亮显示。 #12398
  • 修复了异步对话框阻塞主进程的问题。 #12407
  • 修复了 setTitle 托盘崩溃的问题。 #12356
  • 修复了设置 Dock 菜单时崩溃的问题。 #12087

Linux

  • 改进了 Linux 桌面通知功能。 #12229 #12216 #11965 #11980
  • 改进了对菜单的 GTK+ 主题支持。 #12331
  • 在 Linux 上优雅退出。 #12139
  • 使用应用程序的名称作为托盘图标的默认工具提示。 #12393

Windows

  • 增加了对 Visual Studio 2017 的支持。 #11656
  • 修复了将异常传递给系统崩溃处理程序的问题。 #12259
  • 修复了从最小化窗口隐藏工具提示的问题。 #11644
  • 修复了 desktopCapturer 以捕获正确的屏幕。 #11664
  • 修复了带有透明度的 disableHardwareAcceleration#11704

下一步

Electron 团队正在努力支持较新版本的 Chromium、Node 和 v8。预计 3.0.0-beta.1 即将推出!

Electron 2.0 及更高版本 - 语义版本控制

·一分钟阅读

Electron 的一个新主要版本正在开发中,随之而来的是我们版本控制策略的一些变化。 从 2.0.0 版本开始,Electron 将严格遵守语义化版本控制。


此更改意味着您将更频繁地看到主版本号的提升,并且通常是 Chromium 的重大更新。补丁版本也将更加稳定,因为它们现在只会包含错误修复,而没有新功能。

主版本号递增

  • Chromium 版本更新
  • Node.js 主要版本更新
  • Electron 破坏性的 API 更改

次版本号递增

  • Node.js 次要版本更新
  • Electron 非破坏性的 API 更改

补丁版本号递增

  • Node.js 补丁版本更新
  • 修复相关的 Chromium 补丁
  • Electron 错误修复

由于 Electron 的 semver 范围现在将更有意义,我们建议使用 npm 的默认 --save-dev 标志安装 Electron,该标志将在您的版本前加上 ^,使您安全地保持最新的次要版本和补丁更新。

npm install --save-dev electron

对于只对错误修复感兴趣的开发人员,您应该使用波浪号 semver 前缀,例如 ~2.0.0,它永远不会引入新功能,只会进行修复以提高稳定性。

有关更多详细信息,请参阅 electronjs.org/docs/tutorial/electron-versioning

Electron 1.0

·4 分钟阅读

在过去的两年里,Electron 帮助开发人员使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用程序。 现在,我们很高兴与大家分享我们框架和创建它的社区的一个重要里程碑。 Electron 1.0 的发布现在可从 electronjs.org 获取。


Electron 1.0

Electron 1.0 代表了 API 稳定性和成熟度的重要里程碑。 此版本允许您构建在 Windows、Mac 和 Linux 上真正具有原生外观和感觉的应用程序。 使用新的文档、新的工具和一个引导您了解 Electron API 的新应用程序,构建 Electron 应用程序比以往任何时候都更加容易。

如果您准备好构建您的第一个 Electron 应用程序,这里有一个快速入门指南,可以帮助您入门。

我们很高兴看到您接下来使用 Electron 构建的内容。

Electron 的路径

我们在推出 Atom 时发布了 Electron,当时是两年前。 Electron,当时被称为 Atom Shell,是我们构建 Atom 的框架。 在那些日子里,Atom 是 Electron 提供的特性和功能背后的驱动力,因为我们努力推出最初的 Atom 版本。

现在驱动 Electron 的是一个不断壮大的开发人员和公司社区,他们构建了从 电子邮件聊天Git 应用程序SQL 分析工具种子客户端机器人 的各种应用程序。

在过去的两年里,我们看到公司和开源项目都选择 Electron 作为其应用程序的基础。 仅在过去一年中,Electron 的下载量就超过 120 万次。 参观一些令人惊叹的 Electron 应用程序,如果您的应用程序尚未在那里,请添加您自己的应用程序。

Electron downloads

Electron API 演示

在 1.0 版本发布的同时,我们发布了一个新的应用程序来帮助您探索 Electron API 并了解更多关于如何让您的 Electron 应用程序感觉像原生应用程序的信息。 Electron API 演示应用程序包含代码片段,可帮助您启动应用程序并提供有效使用 Electron API 的技巧。

Electron API Demos

Devtron

我们还添加了一个新的扩展来帮助您调试 Electron 应用程序。 DevtronChrome 开发人员工具 的一个开源扩展,旨在帮助您检查、调试和排除 Electron 应用程序的故障。

Devtron

功能

  • 依赖关系图,可帮助您可视化应用程序的主进程和渲染器进程中的内部和外部库依赖项
  • IPC 监视器,可跟踪和显示应用程序中进程之间发送和接收的消息
  • 事件检查器,可显示在您的应用程序中在窗口、应用程序和进程等核心 Electron API 上注册的事件和侦听器
  • 应用程序 Linter,可检查您的应用程序是否存在常见错误和缺少的功能

Spectron

最后,我们发布了 Spectron 的新版本,它是 Electron 应用程序的集成测试框架。

Spectron

Spectron 3.0 全面支持整个 Electron API,使您可以更快地编写测试,以验证您的应用程序在各种场景和环境中的行为。 Spectron 基于 ChromeDriverWebDriverIO,因此它还具有用于页面导航、用户输入和 JavaScript 执行的完整 API。

社区

Electron 1.0 是数百名开发人员共同努力的结果。 在核心框架之外,已经发布了数百个库和工具,以使构建、打包和部署 Electron 应用程序更容易。

现在有一个新的社区页面,其中列出了正在开发的许多很棒的 Electron 工具、应用程序、库和框架。 您还可以查看 ElectronElectron Userland 组织,以查看其中一些出色的项目。

不熟悉 Electron?观看 Electron 1.0 介绍视频

Electron 0.37 中的新功能

·4 分钟阅读

Electron 0.37 最近 发布,其中包含从 Chrome 47 到 Chrome 49 的重大升级以及几个新的核心 API。 此最新版本引入了 Chrome 48Chrome 49 中发布的所有新功能。 这包括 CSS 自定义属性、增加的 ES6 支持、KeyboardEvent 改进、Promise 改进以及许多其他现在在您的 Electron 应用程序中可用的新功能。


新功能

CSS 自定义属性

如果您使用过像 Sass 和 Less 这样的预处理语言,您可能熟悉变量,它允许您为颜色方案和布局等内容定义可重用的值。变量有助于保持您的样式表 DRY 且更易于维护。

CSS 自定义属性类似于预处理变量,因为它们是可重用的,但它们也具有一个独特的品质,使其更加强大和灵活:可以使用 JavaScript 对其进行操作。 这个微妙但强大的功能允许动态更改视觉界面,同时仍然受益于 CSS 的硬件加速,并减少前端代码和样式表之间的代码重复。

有关 CSS 自定义属性的更多信息,请参阅 MDN 文章Google Chrome 演示

CSS 变量的应用

让我们来看一个简单的变量示例,该示例可以在您的应用程序中实时调整。

:root {
--awesome-color: #a5ecfa;
}

body {
background-color: var(--awesome-color);
}

可以在 JavaScript 中直接获取和更改变量值

// Get the variable value ' #A5ECFA'
let color = window
.getComputedStyle(document.body)
.getPropertyValue('--awesome-color');

// Set the variable value to 'orange'
document.body.style.setProperty('--awesome-color', 'orange');

也可以在开发工具的 Styles 部分编辑变量值,以便快速反馈和调整

CSS properties in Styles tab

KeyboardEvent.code 属性

Chrome 48 在 KeyboardEvent 事件中新增了 code 属性,该属性表示按下的物理按键,不受操作系统键盘布局的影响。

这应该可以使您在 Electron 应用程序中实现自定义键盘快捷键时,在不同的机器和配置上更加准确和一致。

window.addEventListener('keydown', function (event) {
console.log(`${event.code} was pressed.`);
});

请查看此示例以查看其运行情况。

Promise 拒绝事件

Chrome 49 新增了两个 window 事件,使您可以在未处理的被拒绝的 Promise 时收到通知。

window.addEventListener('unhandledrejection', function (event) {
console.log('A rejected promise was unhandled', event.promise, event.reason);
});

window.addEventListener('rejectionhandled', function (event) {
console.log('A rejected promise was handled', event.promise, event.reason);
});

请查看此示例以查看其运行情况。

V8 中的 ES2015 更新

Electron 中使用的 V8 版本现在包含 91% 的 ES2015。以下是一些可以直接使用而无需标志或预编译器的有趣新增功能:

默认参数

function multiply(x, y = 1) {
return x * y;
}

multiply(5); // 5

解构赋值

Chrome 49 添加了解构赋值,使变量和函数参数的赋值更加容易。

这使得 Electron 的赋值现在更简洁和紧凑

浏览器进程 Require
const { app, BrowserWindow, Menu } = require('electron');
渲染器进程 Require
const { dialog, Tray } = require('electron').remote;
其他示例
// Destructuring an array and skipping the second element
const [first, , last] = findAll();

// Destructuring function parameters
function whois({ displayName: displayName, fullName: { firstName: name } }) {
console.log(`${displayName} is ${name}`);
}

let user = {
displayName: 'jdoe',
fullName: {
firstName: 'John',
lastName: 'Doe',
},
};
whois(user); // "jdoe is John"

// Destructuring an object
let { name, avatar } = getUser();

新的 Electron API

以下是一些新的 Electron API,您可以在 Electron 发布说明中查看每个新的 API。

BrowserWindow 上的 showhide 事件

当窗口显示或隐藏时,将发出这些事件。

const { BrowserWindow } = require('electron');

let window = new BrowserWindow({ width: 500, height: 500 });
window.on('show', function () {
console.log('Window was shown');
});
window.on('hide', function () {
console.log('Window was hidden');
});

OS X 上的 appplatform-theme-changed 事件

当系统 深色模式主题切换时,将发出此事件。

const { app } = require('electron');

app.on('platform-theme-changed', function () {
console.log(`Platform theme changed. In dark mode? ${app.isDarkMode()}`);
});

OS Xapp.isDarkMode() 方法

如果系统处于深色模式,则此方法返回 true,否则返回 false

OS XBrowserWindowscroll-touch-beginscroll-touch-end 事件

当滚轮事件阶段开始或结束时,将发出这些事件。

const { BrowserWindow } = require('electron');

let window = new BrowserWindow({ width: 500, height: 500 });
window.on('scroll-touch-begin', function () {
console.log('Scroll touch started');
});
window.on('scroll-touch-end', function () {
console.log('Scroll touch ended');
});