跳到主要内容

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 进行 require 有更多的控制,此功能将非常有用。

当在渲染进程中通过 remote.require 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(这是默认值)。如果不存在此 hook,则原生模块在 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

请注意:当前存在一个已知错误 (#9736),如果在启用 contextIsolation 时会导致 webview 标签无法工作。请密切关注此 GitHub issue 以获取最新信息!

Electron 安全文档中了解更多关于 context isolation、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 未来版本中计划的重大更改的信息,请参见我们的计划的重大更改文档

SQLite 漏洞修复

·1 分钟阅读

已发现一个远程代码执行漏洞,“Magellan”,它影响基于 SQLite 或 Chromium 的软件,包括所有版本的 Electron。


范围

使用 Web SQL 的 Electron 应用程序受到影响。

缓解措施

受影响的应用应停止使用 Web SQL 或升级到 Electron 的已修补版本。

我们已发布包含此漏洞修复的新版本 Electron

目前没有关于此漏洞在实际应用中被利用的报告;然而,我们敦促受影响的应用采取缓解措施。

更多信息

此漏洞由腾讯 Blade 团队发现,他们已发布一篇讨论此漏洞的博客文章

要了解有关确保 Electron 应用安全的最佳实践的更多信息,请参见我们的安全教程

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

Electron 应用反馈计划

·3 分钟阅读

Electron 正在努力使其发布周期更快、更稳定。为了实现这一点,我们启动了“大型 Electron 应用的应用反馈计划”,以测试我们的 beta 版本,并向我们报告应用特有的问题。这有助于我们优先处理能够更快地将应用升级到下一个稳定版本的工作。

编辑 (2020-05-21):此计划已停止。


谁可以加入?

我们对于加入此计划的应用的标准和期望包括以下各项

  • 在 beta 期间测试您的应用,达到 10,000+ 用户小时
  • 有一个单点联系人,每周汇报讨论您的应用在 Electron 中遇到的 bug 和阻碍应用升级的问题
  • 您同意遵守 Electron 的行为准则
  • 您愿意分享下一个问题中列出的以下信息

我的 Electron 应用需要分享哪些信息?

  • 您的应用在任何 beta 版本上运行的总用户小时数
  • 您的应用正在测试的 Electron 版本(例如,4.0.0-beta.3)
  • 任何阻止您的应用升级到正在 beta 测试的发布线版本的 bug

用户小时

我们理解并非所有人都能分享确切的用户数量,但更好的数据有助于我们决定特定版本的稳定性。我们要求应用承诺在 beta 周期内至少测试 10,000 用户小时。

  • 10 用户小时可以是 10 个人测试一小时,或一个人测试 10 小时
  • 您可以在不同的 beta 版本之间分配测试时间,例如,在 3.0.0-beta.2 上测试 5,000 用户小时,然后在 3.0.0-beta.5 上测试 5,000 用户小时。测试越多越好,但我们理解有些应用无法测试每个 beta 版本
  • CI 或 QA 测试时间不计入总数;然而,内部发布版本的时间会计入

我的 Electron 应用为何应该加入?

您应用的 bug 将被跟踪并纳入 Electron 核心团队的关注范围。您的反馈有助于 Electron 团队了解新 beta 版本的表现以及需要完成的工作。

我的应用信息会公开分享吗?谁可以看到这些信息?

不会,您的应用信息不会与公众分享。信息保存在一个私有的 GitHub 仓库中,只有应用反馈计划成员和Electron 治理委员会成员可见。所有成员都同意遵守 Electron 的行为准则

注册

我们目前正在接受有限数量的注册。如果您有兴趣并能够满足上述要求,请填写此表单

Electron 3.0.0

·4 分钟阅读

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


发布流程

在我们进行 v3.0.0 的开发时,我们试图通过规范化渐进式 beta 版本的反馈过程,更经验性地定义稳定版本的标准。没有我们的应用反馈计划合作伙伴在 beta 周期中提供的早期测试和反馈,v3.0.0 是不可能实现的。感谢 Atlassian、Atom、Microsoft Teams、Oculus、OpenFin、Slack、Symphony、VS Code 以及其他计划成员所做的工作。如果您想参与未来的 beta 版测试,请发送邮件至info@electronjs.org

更改 / 新功能

对 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: 将 app-command 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"> 打开文件对话框中选择 bundle 的问题
  • [#12404] fix: 修复在使用异步对话框时阻塞主进程的问题
  • [#12043] fix: 修复上下文菜单点击回调
  • [#12527] fix: 修复重复使用触控条项目时事件泄露的问题
  • [#12352] fix: 修复托盘标题崩溃
  • [#12327] fix: 修复不可拖动区域
  • [#12809] fix: 修复在菜单打开时阻止其更新的问题
  • [#13162] fix: 修复托盘图标边界不允许负值的问题
  • [#13085] fix: 修复托盘标题在突出显示时不会反转的问题
  • [#12196] fix: 修复当 enable_run_as_node==false 时 Mac 构建的问题
  • [#12157] fix: 修复无边框窗口启用 vibrancy 时的其他问题
  • [#13326] fix: 修复调用 app.removeAsDefaultProtocolClient 后未将 mac 协议设置为 none 的问题
  • [#13530] fix: 修复 MAS 构建中私有 API 使用不正确的问题
  • [#13517] fix: 修复 tray.setContextMenu 崩溃的问题
  • [#14205] fix: 修复在对话框上按 Esc 键现在会关闭它,即使设置了 defaultId

Linux

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

其他说明

  • PDF 阅读器目前无法工作,但正在修复中,很快将恢复正常功能
  • TextFieldButton API 是实验性的,因此默认关闭
    • 它们可以通过 enable_view_api 构建标志启用

接下来

Electron 团队将继续努力,定义我们的流程,以实现更快速、更顺畅的升级,最终与 Chromium、Node 和 V8 的开发节奏保持一致。

使用 GN 构建 Electron

·2 分钟阅读

Electron 现在使用 GN 来构建自身。以下是关于原因的讨论。


GYP 和 GN

Electron 于 2013 年首次发布时,Chromium 的构建配置是使用GYP编写的,GYP 是 "Generate Your Projects" 的缩写。

2014 年,Chromium 项目引入了一个新的构建配置工具,称为GN(“Generate Ninja”的缩写)。Chromium 的构建文件被迁移到 GN,GYP 从源代码中移除。

Electron 历史上一直将其核心代码与包裹 Chromium 的 'content' 子模块的libchromiumcontent分离开来。Electron 一直沿用 GYP,而 libchromiumcontent 作为 Chromium 的子集,则在 Chromium 切换到 GN 时也切换到了 GN。

就像齿轮未能完全啮合一样,使用这两个构建系统会产生摩擦。从需要仔细同步的编译器标志和#defines,到 Chromium、Node、V8 和 Electron 之间维护兼容性容易出错。

为了解决这个问题,Electron 团队一直致力于将所有内容迁移到 GN。今天,删除 Electron 中最后一批 GYP 代码的提交已合入 master 分支。

这对您意味着什么

如果您正在为 Electron 本身做贡献,那么从master或 4.0.0 分支检出和构建 Electron 的过程与 3.0.0 及更早版本非常不同。有关详细信息,请参阅GN 构建说明

如果您正在使用 Electron 开发应用程序,您可能会在新版 Electron 4.0.0-nightly 中注意到一些微小变化;但更有可能的是,Electron 构建系统的改变对您来说将完全透明。

这对 Electron 意味着什么

GN 比 GYP 更快,其文件更易读且更易维护。此外,我们希望使用单一构建配置系统可以减少将 Electron 升级到新版 Chromium 所需的工作量。

  • 这已经大大帮助了 Electron 4.0.0 的开发,因为 Chromium 67 移除了对 MSVC 的支持,并在 Windows 上切换到了使用 Clang 构建。使用 GN 构建,我们直接继承了 Chromium 的所有编译器命令,因此在 Windows 上免费获得了 Clang 构建!

  • 这也使得 Electron 在 Electron、Chromium 和 Node 的统一构建中更容易使用BoringSSL——这在之前曾是问题

WebPreferences 漏洞修复

·2 分钟阅读

在 Electron 版本 (3.0.0-beta.6, 2.0.7, 1.8.7, 和 1.7.15) 中,发现了一个影响具有打开嵌套子窗口能力的应用程序的远程代码执行漏洞。此漏洞已被分配 CVE 标识符CVE-2018-15685


受影响的平台

如果您符合以下条件,则会受到影响

  1. 您嵌入了任何远程用户内容,即使是在沙盒中
  2. 您接受带有任何 XSS 漏洞的用户输入

详情

如果任何用户代码在iframe内部运行或可以创建iframe,则会受到影响。考虑到存在 XSS 漏洞的可能性,可以认为大多数应用程序都容易受到此情况的影响。

如果您打开任何窗口时使用了nativeWindowOpen: truesandbox: true选项,您也会受到影响。尽管此漏洞也需要您的应用程序中存在 XSS 漏洞,但如果您使用了其中任何一个选项,仍然应该应用下面的一种缓解措施。

缓解措施

我们已经发布了包含此漏洞修复的新版本 Electron:3.0.0-beta.72.0.81.8.81.7.16。我们强烈建议所有 Electron 开发者立即将其应用程序更新到最新的稳定版本。

如果由于某些原因您无法升级 Electron 版本,您可以通过对所有webContentsnew-window事件进行全面的event.preventDefault()调用来保护您的应用程序。如果您根本不使用window.open或任何子窗口,那么这对您的应用程序来说也是一种有效的缓解措施。

mainWindow.webContents.on('new-window', (e) => e.preventDefault());

如果您依赖于子窗口创建孙子窗口的能力,那么第三种缓解策略是在您的顶级窗口上使用以下代码

const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on(
'new-window',
(event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {};
}
Object.assign(
options.webPreferences,
topWebContents.getLastWebPreferences(),
);
if (options.webContents) {
handle(options.webContents);
}
},
);
};
handle(topWebContents);
};

enforceInheritance(mainWindow.webContents);

此代码将手动强制将顶级窗口的webPreferences应用于无限深度的所有子窗口。

更多信息

此漏洞由 Matt Austin 代表 Contrast Security 负责任地发现并报告给 Electron 项目。

要了解有关确保 Electron 应用安全的最佳实践的更多信息,请参见我们的安全教程

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

搜索

·阅读时长 5 分钟

Electron 网站拥有了一个新的搜索引擎,可以为 API 文档、教程、Electron 相关的 npm 软件包等提供即时结果。

Electron Search Screenshot


学习像 Electron 这样的新技术或框架可能令人望而却步。一旦您通过了快速入门阶段,就很难学习最佳实践、找到正确的 API 或发现能帮助您构建梦想应用程序的工具。我们希望 Electron 网站成为一个更好的工具,帮助您更快、更轻松地找到构建应用程序所需的资源。

访问 electronjs.org 上的任何页面,您会在页面顶部找到新的搜索输入框。

搜索引擎

当我们最初着手为网站添加搜索功能时,我们使用 GraphQL 作为后端,构建了自己的搜索引擎。GraphQL 使用起来很有趣,搜索引擎性能也不错,但我们很快意识到构建一个搜索引擎不是一件简单的事。多词搜索和拼写错误检测等功能需要大量工作才能做好。我们决定不再重复造轮子,而是使用现有的搜索解决方案:Algolia

Algolia 是一家托管搜索服务提供商,已迅速成为 React、Vue、Bootstrap、Yarn 和许多其他流行开源项目首选的搜索引擎。

以下是一些使 Algolia 非常适合 Electron 项目的功能

API 文档

有时您知道自己想要完成什么,但不知道确切的方法。Electron 有超过 750 个 API 方法、事件和属性。没有人能轻易记住所有这些,但计算机擅长处理这些。使用 Electron 的JSON API 文档,我们将所有这些数据索引到 Algolia 中,现在您可以轻松找到您正在寻找的确切 API。

想调整窗口大小?搜索resize,直接跳转到您需要的方法。

教程

Electron 有一个不断增长的教程集,作为其 API 文档的补充。现在,您可以更轻松地找到关于特定主题的教程,就在相关的 API 文档旁边。

正在寻找安全最佳实践?搜索security

npm 软件包

npm 注册表中现有超过 70 万个软件包,找到您需要的那个并不总是容易。为了更容易发现这些模块,我们创建了electron-npm-packages,这是一个注册表中专门为与 Electron 一起使用而构建的 3400 多个模块的集合。

Libraries.io 的伙伴们创建了SourceRank,这是一个根据代码、社区、文档和使用情况等指标组合为软件项目评分的系统。我们创建了一个sourceranks模块,其中包含 npm 注册表中每个模块的评分,我们使用这些评分来对软件包结果进行排序。

想寻找 Electron 内置 IPC 模块的替代方案?搜索is:package ipc

Electron 应用程序

使用 Algolia 索引数据很容易,因此我们添加了来自electron/apps的现有应用程序列表。

尝试搜索musichomebrew

筛选结果

如果您之前使用过 GitHub 的代码搜索,您可能熟悉其冒号分隔的键值过滤器,例如extension:jsuser:defunkt。我们认为这种筛选技术非常强大,因此我们在 Electron 的搜索中添加了一个is:关键字,允许您将结果筛选为仅显示单一类型

键盘导航

人们喜欢键盘快捷键!新的搜索功能无需将手指离开键盘即可使用

  • / 聚焦搜索输入框
  • esc 聚焦搜索输入框并清除内容
  • down 移动到下一个结果
  • up 移动到上一个结果,或搜索输入框
  • enter 打开结果

我们还开源了实现此键盘交互的模块。它设计用于 Algolia InstantSearch,但也通用化以兼容不同的搜索实现。

我们期待您的反馈

如果您在使用新的搜索工具时遇到任何问题,请告诉我们!

提交反馈的最佳方式是在 GitHub 上相应仓库中提交一个 issue

致谢

特别感谢 Emily JordanVanessa Yuen 构建了这些新的搜索功能,感谢 Libraries.io 提供了SourceRank评分,以及 Algolia 团队帮助我们入门。🍹

国际化更新

·3 分钟阅读

自新的国际化 Electron 网站上线以来,我们一直努力使非英语世界的开发者更容易获得 Electron 开发体验。

因此,我们在这里带来了一些令人兴奋的 i18n 更新!


🌐 语言切换

您知道吗,许多阅读翻译文档的人经常与原始英文文档进行交叉引用?他们这样做是为了熟悉英文文档,并避免过时或不准确的翻译,这是国际化文档的一个缺点。

Language toggle on Electron documentation

为了更轻松地与英文文档交叉引用,我们最近发布了一个功能,允许您在 Electron 文档的某个部分在英语和您正在浏览的网站语言之间无缝切换。只要您在网站上选择了非英语区域设置,语言切换就会显示出来。

⚡️ 快速访问翻译页面

New Electron documentation footer in Japanese

阅读文档时注意到拼写错误或不正确的翻译?您不再需要登录 Crowdin、选择您的区域设置、找到需要修复的文件等等。相反,您可以直接向下滚动到该文档的底部,点击“翻译此文档”(或您语言中的对应文本)。瞧!您会直接跳转到 Crowdin 翻译页面。现在就施展您的翻译魔法吧!

📈 一些统计数据

自从我们公开 Electron 文档 i18n 工作以来,我们看到来自世界各地的 Electron 社区成员在翻译贡献方面取得了巨大增长。截至目前,我们已有1,719,029 条字符串被翻译,来自 1,066 位社区译者,共计 25 种语言

Translation Forecast provided by Crowdin

这里有一个有趣的图表,显示了如果保持现有速度(根据撰写本文时前 14 天的项目活动情况),将项目翻译成每种语言所需的大致时间。

📃 译者调查

我们想向所有为改进 Electron 贡献时间的伙伴们表达衷心的感谢❤️!为了正式认可我们译者社区的辛勤工作,我们创建了一项调查,收集一些关于我们译者的信息(主要是他们的 Crowdin 用户名和 Github 用户名的映射关系)。

如果您是我们杰出的译者之一,请花几分钟填写此表单:https://goo.gl/forms/b46sjdcHmlpV0GKT2

🙌 Node 的国际化努力

由于 Electron 的 i18n 倡议取得了成功,Node.js 决定仿照我们使用的模式重塑他们的 i18n 工作!🎉Node.js i18n 倡议现已启动并取得了很大进展,但您仍然可以在这里阅读关于早期提案及其理由的内容。

🔦 贡献指南

如果您有兴趣加入我们,让 Electron 更友好地支持国际化,我们为您准备了一份方便的贡献指南,帮助您入门。国际化愉快!📚

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 版本,为 Electron 的 beta 系列提供了前所未有的最佳反馈循环。

更改 / 新功能

  • 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) 添加条件判断
  • touchbar 项目的内存改进。#12527
  • 改进了安全建议清单。
  • 添加了 App-Scoped Security 范围书签。#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
  • 修复了如果 preload 路径包含特殊字符,则在沙盒渲染中 preload 不加载的问题。#12643
  • 根据文档修正了 allowRunningInsecureContent 的默认值。#12629
  • 修复了 nativeImage 的透明度问题。#12683
  • 修复了Menu.buildFromTemplate的问题。#12703
  • 确认 menu.popup 选项为对象。#12330
  • 移除了新进程创建和上下文释放之间的竞态条件。#12361
  • 更改 BrowserView 时更新可拖动区域。#12370
  • 修复了聚焦时 menubar 切换 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
  • 改进了 vibrancy 支持。#12157 #12171 #11886
  • 修复了单例 fixture 中的计时问题。
  • 修复了 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

  • 修复了 touchbar 项目重用时的事件泄漏问题。#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!

更易于开源应用的自动更新

·3 分钟阅读

今天,我们发布了一个免费、开源、托管的更新网络服务和一个配套的npm 软件包,以方便开源 Electron 应用程序进行自动更新。这是朝着赋能应用程序开发者迈出的一步,让他们可以少考虑部署,多关注为用户开发高质量的体验。


The new updater module in action

让生活更轻松

Electron 有一个autoUpdater API,使应用程序能够从远程端点获取元数据,检查更新、在后台下载并自动安装。

对于许多 Electron 应用程序开发者来说,启用这些更新一直是部署过程中繁琐的一步,因为它需要部署和维护一个 Web 服务器,仅仅是为了提供应用程序版本历史元数据。

今天,我们将宣布一种新的插入式(drop-in)自动应用更新解决方案。如果您的 Electron 应用托管在公共 GitHub 仓库中,并且您使用 GitHub Releases 发布构建版本,您可以使用此服务为您的用户提供持续的应用更新。

使用新模块

为了最大程度地减少您的配置工作,我们创建了 update-electron-app,这是一个与新的 update.electronjs.org Web 服务集成的 npm 模块。

安装模块

npm install update-electron-app

从您应用的主进程中调用它

require('update-electron-app')();

就是这样!该模块将在应用启动时检查更新,然后每十分钟检查一次。找到更新后,它将在后台自动下载,并在更新准备就绪时显示一个对话框。

迁移现有应用

已经使用 Electron 的 autoUpdater API 的应用也可以使用此服务。为此,您可以定制 update-electron-app 模块或直接与 update.electronjs.org 集成

替代方案

如果您使用 electron-builder 打包您的应用,您可以使用其内置的更新器。详情请参阅 electron.build/auto-update

如果您的应用是私有的,您可能需要运行自己的更新服务器。有许多开源工具可以用于此目的,包括 Zeit 的 Hazel 和 Atlassian 的 Nucleus。更多信息请参阅部署更新服务器教程。

致谢

感谢 Julian Gruber 帮助设计和构建了这个简单且可扩展的 Web 服务。感谢 Zeit 的团队提供了开源的 Hazel 服务,我们从中汲取了设计灵感。感谢 Samuel Attard 的代码评审。感谢 Electron 社区帮助测试这项服务。

🌲 祝愿 Electron 应用拥有常青的未来!