跳至主要内容

带有“Release”标签的 41 篇帖子

关于新 Electron 版本的博客帖子

查看所有标签

Electron 5.0.0

·阅读时长 4 分钟

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


新功能?

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

Electron 5 还包含对 Electron 特定 API 的改进。以下是主要更改的摘要;有关更改的完整列表,请查看 Electron v5.0.0 发布说明

承诺化

Electron 5 继续 承诺化计划 计划,将 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 测试版,作为回报,他们发现的新错误将优先在稳定版中修复。如果您想参与或了解更多信息,请 查看我们关于该计划的博客文章

下一步

在短期内,您可以期待团队继续专注于跟进组成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。虽然我们谨慎地不承诺发布日期,但我们的计划是每季度发布新的主要版本 Electron,其中包含这些组件的新版本。 6.0.0 版本计划 概述了 Electron 6 开发周期中的关键日期。此外,请查看我们的版本控制文档,以获取有关 Electron 中版本控制的更详细的信息。

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

Node.js Native Addons and Electron 5.0

·阅读时间:2 分钟

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


告别 v8::Handle,拥抱 v8::Local

2014 年,V8 团队将 v8::Handle 弃用,转而使用 v8::Local 来处理本地句柄。Electron 5.0 包含一个最终完全删除了 v8::Handle 的 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 的原生插件,并且由于此问题导致原生插件无法构建,请与插件作者联系,查看他们是否发布了修复此问题的最新版本。如果没有,联系作者(或提交 Pull Request!)可能是您最好的选择。

Electron v5.0.0 Timeline

·阅读时间: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 版本计划。您可以在 此处 找到它。

为了帮助我们测试测试版发布和稳定,请考虑加入我们的 应用反馈计划

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 要求模块时,remote-require 事件将在 app 模块 上触发。您可以对事件(第一个参数)调用 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 的值,则为 nodeIntegration 的值,否则为 truefalse

请注意:目前存在已知错误(#9736),如果 contextIsolation 处于打开状态,则会阻止 webview 标签正常工作。 请密切关注 GitHub 问题以获取最新信息!

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

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

webContents.findInPage(text[, options])

medialCapitalAsWordStartwordStart 选项已弃用,因为它们已在 upstream 中删除。

应用反馈计划

我们在 Electron 3.0 开发期间实施的应用程序反馈计划取得了成功,因此我们在 4.0 的开发过程中也继续实施它。 我们要感谢 Atlassian、Discord、MS Teams、OpenFin、Slack、Symphony、WhatsApp 和其他计划成员在 4.0 测试版周期中的参与。 要详细了解应用程序反馈计划并参与未来的测试版,请查看我们关于该计划的博客文章

下一步

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

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

Electron 3.0.0

·阅读时长 4 分钟

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


发布流程

当我们开始开发 v3.0.0 时,我们试图通过正式化逐步测试版发布的反馈进度,更经验地定义稳定版本的标准。 v3.0.0 的成功离不开我们的应用程序反馈计划合作伙伴,他们在测试版周期中提供了早期测试和反馈。 感谢 Atlassian、Atom、Microsoft Teams、Oculus、OpenFin、Slack、Symphony、VS Code 和其他计划成员的贡献。 如果您想参与未来的测试版,请发送邮件至 [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: 需要使用 electron npm 模块的 Node v4.x 或更高版本
  • [#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"))获取用户数据目录,或查看docs获取更多详细信息。

错误修复

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

MacOS

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

Linux

  • [#12507] 修复:针对屏幕外窗口的BrowserWindow.focus()

其他说明

  • PDF 阅读器目前无法使用,但正在开发中,并将很快恢复正常使用
  • TextFieldButton API 处于实验阶段,因此默认情况下处于关闭状态
    • 它们可以使用enable_view_api 构建标志启用

下一步

Electron 团队将继续努力定义我们更快速、更平稳升级的流程,因为我们最终希望与 Chromium、Node 和 V8 的开发节奏保持一致。

Electron 2.0.0

·阅读时间:5 分钟

经过四个多月的开发、八个测试版发布以及来自众多应用的阶段性推广,Electron 2.0.0 版本现已在electronjs.org上发布。


发布流程

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

Electron 2.0.0 还代表了 Electron 在重大版本发布之前稳定性的改进。几个大型 Electron 应用已在阶段性推广中包含 2.0.0 测试版,为 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
  • 添加用于将多个 BrowserWindows 收集到单个进程中的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

错误修复

  • 更改为确保始终可以使用webContents.isOffscreen()#12531
  • 修复了 DevTools 处于分离状态且已获得焦点时BrowserWindow.getFocusedWindow() 的问题。 #12554
  • 修复了在沙盒化渲染中未加载预加载的问题,如果预加载路径包含特殊字符。 #12643
  • 根据文档更正了 allowRunningInsecureContent 的默认值。 #12629
  • 修复了 nativeImage 上的透明度问题。 #12683
  • 修复了Menu.buildFromTemplate 的问题。 #12703
  • 确认 menu.popup 选项是对象。 #12330
  • 删除了新进程创建和上下文释放之间的竞争条件。 #12361
  • 更改 BrowserView 时更新可拖动区域。 #12370
  • 修复了菜单栏切换 alt 键检测在获得焦点时的检测问题。 #12235
  • 修复了 webview 中的错误警告。 #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
  • 修复了透明窗口在开发者工具分离时失去透明度的问题。 #11956
  • 修复了 Electron 应用程序取消重启或关闭的问题。 #11625

macOS

  • 修复了在重复使用触控栏项目时发生的事件泄漏。 #12624
  • 修复了暗模式下托盘高亮显示的问题。 #12398
  • 修复了异步对话框阻塞主进程的问题。 #12407
  • 修复了 setTitle 托盘崩溃问题。 #12356
  • 修复了设置码头菜单时的崩溃问题。 #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 and Beyond - Semantic Versioning

·阅读时间:1 分钟

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


此更改意味着您将更频繁地看到主版本号的提升,它通常代表 Chromium 的重大更新。 修补程序版本也将更加稳定,因为它们现在只包含错误修复,不包含新功能。

主版本号提升

  • Chromium 版本更新
  • Node.js 主版本更新
  • Electron 突破性 API 更改

次要版本号提升

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

修补程序版本号提升

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

由于 Electron 的语义化版本号范围现在更有意义,我们建议您使用 npm 的默认 --save-dev 标志安装 Electron,该标志会在您的版本号前加上 ^,使您能够安全地更新次要版本号和修补程序版本号。

npm install --save-dev electron

对于只对错误修复感兴趣的开发者,您应该使用波浪号语义化版本号前缀,例如 ~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 分析工具BT 客户端机器人 的各种应用程序。

在过去的两年里,我们看到公司和开源项目都选择了 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 上,例如窗口、应用程序和进程
  • 应用程序 Lint 工具,检查您的应用程序是否存在常见错误和缺失功能

Spectron

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

Spectron

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

社区

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

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

Electron 新手? 查看 Electron 1.0 简介视频

What's new in 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');

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

CSS properties in Styles tab

KeyboardEvent.code 属性

Chrome 48 添加了新的 code 属性,该属性在 KeyboardEvent 事件中可用,该属性将是独立于操作系统键盘布局的实际按下的键。

这应该使您在 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 现在需要更简洁、更紧凑的分配

浏览器进程需要
const { app, BrowserWindow, Menu } = require('electron');
渲染器进程需要
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 上的 app 上的 platform-theme-changed

当系统 暗黑模式 主题切换时,会触发此事件。

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

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

OS X 上的 app.isDarkMode()

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

OS X 上的 BrowserWindowscroll-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');
});

API Changes Coming in Electron 1.0

·阅读时长 4 分钟

从 Electron 的诞生开始,从它被称为 Atom-Shell 的时候起,我们就一直在尝试为 Chromium 的内容模块和原生 GUI 组件提供一个不错的跨平台 JavaScript API。这些 API 最初是自然而然地出现的,随着时间的推移,我们进行了多次更改来改进最初的设计。


现在,随着 Electron 准备发布 1.0 版本,我们希望借此机会进行更改,解决最后一些棘手的 API 细节。下面描述的更改包含在 **0.35.x** 中,旧 API 报告弃用警告,以便您能够及时更新到未来的 1.0 版本。Electron 1.0 将在几个月内发布,因此您有时间在这些更改成为破坏性更改之前进行更新。

弃用警告

默认情况下,如果您使用的是弃用的 API,则会显示警告。要关闭它们,您可以将 process.noDeprecation 设置为 true。要跟踪弃用 API 使用来源,您可以将 process.throwDeprecation 设置为 true 以抛出异常而不是打印警告,或者将 process.traceDeprecation 设置为 true 以打印弃用的跟踪信息。

使用内置模块的新方法

内置模块现在被分组到一个模块中,而不是被分成独立的模块,因此您可以避免与其他模块发生冲突来使用它们

var app = require('electron').app;
var BrowserWindow = require('electron').BrowserWindow;

旧的 require('app') 方式仍然为了向后兼容而得到支持,但您也可以将其关闭

require('electron').hideInternalModules();
require('app'); // throws error.

使用 remote 模块的更简单方法

由于使用内置模块的方式已更改,因此我们使用主进程端模块在渲染器进程中变得更加容易。您现在只需访问 remote 的属性即可使用它们

// New way.
var app = require('electron').remote.app;
var BrowserWindow = require('electron').remote.BrowserWindow;

无需使用很长的 require 链

// Old way.
var app = require('electron').remote.require('app');
var BrowserWindow = require('electron').remote.require('BrowserWindow');

拆分 ipc 模块

ipc 模块同时存在于主进程和渲染器进程中,并且每个进程上的 API 都不相同,这对于新用户来说非常令人困惑。我们在主进程中将模块重命名为 ipcMain,在渲染器进程中重命名为 ipcRenderer,以避免混淆

// In main process.
var ipcMain = require('electron').ipcMain;
// In renderer process.
var ipcRenderer = require('electron').ipcRenderer;

对于 ipcRenderer 模块,在接收消息时添加了一个额外的 event 对象,以匹配 ipcMain 模块中处理消息的方式

ipcRenderer.on('message', function (event) {
console.log(event);
});

标准化 BrowserWindow 选项

BrowserWindow 选项根据其他 API 的选项具有不同的样式,并且由于名称中的 -,在 JavaScript 中使用起来有点困难。现在它们被标准化为传统的 JavaScript 名称

new BrowserWindow({ minWidth: 800, minHeight: 600 });

遵循 DOM 的 API 名称约定

Electron 中的 API 名称以前更喜欢对所有 API 名称使用 camelCase,例如 UrlURL,但 DOM 有自己的约定,它们更喜欢 URLUrl,同时使用 Id 而不是 ID。我们对以下 API 重命名以匹配 DOM 的样式

  • Url 重命名为 URL
  • Csp 重命名为 CSP

在使用 Electron v0.35.0 运行您的应用程序时,您会注意到许多弃用警告,因为发生了这些更改。修复它们的一个简单方法是将所有 Url 实例替换为 URL

Tray 的事件名称的更改

Tray 事件名称的样式与其他模块略有不同,因此已进行重命名以使其与其他模块相匹配。

  • clicked 重命名为 click
  • double-clicked 重命名为 double-click
  • right-clicked 重命名为 right-click