跳到主要内容

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 测试,请发送邮件至 [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] 功能:macOS 上的鼠标前进功能
  • [#12714] 功能:屏幕锁定/解锁事件

Windows

  • [#12879] 功能:添加了 DIP 与屏幕坐标之间的转换

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

Bug 修复

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

MacOS

  • [#13220] 修复:允许在 <input file="type"> 打开文件对话框中选择捆绑包的问题
  • [#12404] 修复:使用异步对话框时阻塞主进程的问题
  • [#12043] 修复:上下文菜单点击回调
  • [#12527] 修复:重复使用 touchbar 项目时发生的事件泄漏
  • [#12352] 修复:托盘标题崩溃
  • [#12327] 修复:不可拖动的区域
  • [#12809] 修复:防止菜单在打开时更新
  • [#13162] 修复:托盘图标边界不允许负值
  • [#13085] 修复:突出显示时托盘标题不反转
  • [#12196] 修复:当 enable_run_as_node==false 时 Mac 构建失败
  • [#12157] 修复:带有 vibrance 的无边框窗口上的其他问题
  • [#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 的开发节奏保持一致。

使用 GN 构建 Electron

·2 分钟阅读

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


GYP 和 GN

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

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

Electron 历来在主要的 Electron 代码libchromiumcontent 之间保持分离,libchromiumcontent 是 Electron 中包装 Chromium 的 'content' 子模块的部分。Electron 一直继续使用 GYP,而 libchromiumcontent(作为 Chromium 的子集)在 Chromium 进行切换时切换到了 GN。

就像不太啮合的齿轮一样,使用这两个构建系统之间存在摩擦。维护兼容性容易出错,例如编译器标志和 #defines,需要在 Chromium、Node、V8 和 Electron 之间进行细致地同步。

为了解决这个问题,Electron 团队一直在努力将所有内容迁移到 GN。今天,从 Electron 中删除最后一个 GYP 代码的 commit 已在 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 手动应用于所有无限深度的子窗口。

更多信息

此漏洞是由 Contrast SecurityMatt Austin 发现并负责任地报告给 Electron 项目的。

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

如果您想报告 Electron 中的漏洞,请发送电子邮件至 [email protected]

搜索

·5 分钟阅读

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

Electron Search Screenshot


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

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

搜索引擎

当我们最初着手为网站添加搜索功能时,我们使用 GraphQL 作为后端,构建了自己的搜索引擎。GraphQL 用起来很有趣,搜索引擎的性能也很好,但我们很快意识到,构建搜索引擎并非易事。诸如多词搜索和错别字检测等功能需要大量工作才能做好。我们决定使用现有的搜索解决方案:Algolia,而不是重新发明轮子。

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

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

  • InstantSearch.js 可在你输入时提供结果,通常在 1 毫秒左右。
  • 容错意味着即使你输入 widnow,你仍然可以获得结果。
  • 高级查询语法支持 "精确引号匹配"-排除
  • API 客户端是开源的,并且有详细的文档。
  • 分析会告诉我们人们搜索最多的是什么,以及他们搜索但找不到的是什么。这将为我们提供关于如何改进 Electron 文档的有价值的见解。
  • Algolia 对开源项目是免费的

API 文档

有时你知道你想要完成什么,但你不知道具体如何去做。Electron 有 750 多个 API 方法、事件和属性。没有人能轻易记住所有这些,但计算机很擅长做这些事情。使用 Electron 的JSON API 文档,我们将所有这些数据编入了 Algolia 索引,现在你可以轻松找到你正在寻找的确切 API。

尝试调整窗口大小?搜索 resize 并直接跳转到你所需的方法。

教程

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

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

npm 包

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

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

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

Electron 应用

使用 Algolia 索引数据很容易,所以我们从 electron/apps 中添加了现有的应用程序列表。

尝试搜索 musichomebrew

过滤结果

如果你之前使用过 GitHub 的 代码搜索,你可能知道它的冒号分隔的键值过滤器,如 extension:jsuser:defunkt。我们认为这种过滤技术非常强大,所以我们在 Electron 的搜索中添加了一个 is: 关键字,让你只显示一种类型的结果。

键盘导航

人们喜欢键盘快捷键!新的搜索可以在不将手指从键盘上移开的情况下使用

  • / 将焦点置于搜索输入框
  • esc 将焦点置于搜索输入框并清除它
  • 向下 移动到下一个结果
  • 向上 移动到上一个结果,或搜索输入框
  • 回车 打开一个结果

我们还开源了模块,该模块实现了这种键盘交互。它专为与 Algolia InstantSearch 一起使用而设计,但已通用化以实现与不同搜索实现的兼容性。

我们希望收到你的反馈

如果你在使用新的搜索工具时遇到任何问题,我们希望听到你的反馈!

提交反馈的最佳方式是在 GitHub 上的适当存储库中提交问题

感谢

特别感谢 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
  • 添加了 affinity 选项,用于将多个 BrowserWindow 聚集到一个进程中。 #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
  • 修复了 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
  • 改进了 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

  • 修复了重复使用触摸栏项目时的事件泄漏问题。 #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 分钟阅读

今天,我们发布了一个免费的、开源的、托管的 更新 Web 服务 以及配套的 npm 包,以便为开源 Electron 应用程序轻松实现自动更新。这是朝着使应用程序开发人员减少对部署的考虑,而更多地考虑为其用户开发高质量体验迈出的一步。


The new updater module in action

让生活更轻松

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

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

今天,我们宣布了一种用于自动应用程序更新的新的即插即用解决方案。如果你的 Electron 应用程序位于公共 GitHub 存储库中,并且你正在使用 GitHub Releases 发布构建,则可以使用此服务向你的用户交付持续的应用程序更新。

使用新模块

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

安装模块

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 应用程序拥有常青的未来!

Electron 2 中的新功能:应用内购买

·2 分钟阅读

新的 Electron 2.0 版本系列包含了新功能和修复。这个新主要版本中的亮点之一是用于 Apple 的 Mac App Store 的新的 inAppPurchase API


应用内购买使可以直接从应用程序内购买内容或订阅。这为开发人员提供了一种简单的方式来采用 免费增值商业模式,即用户无需付费即可下载应用程序,并可以有选择地为高级功能、其他内容或订阅提供应用内购买。

这个新的 API 是由社区贡献者 Adrien Fery 添加到 Electron 的,以便在 Amanote 中启用应用内购买,Amanote 是一款用于讲座和会议的 Electron 笔记应用程序。Amanote 可以免费下载,允许将清晰且结构化的笔记添加到 PDF 中,其中包含数学公式、绘图、录音等功能。

自将应用内购买支持添加到 Mac 版本的 Amanote 以来,Adrien 指出销售额增长了 40%

入门

新的 inAppPurchase API 已经登陆最新的 Electron Beta 版本

npm i -D electron@beta

该 API 的文档可以在 GitHub 上找到,并且 Adrien 非常好心地编写了一个关于如何使用该 API 的教程。要开始向你的应用程序添加应用内购买,请参阅该教程

正在进行更多对该 API 的改进,并且很快将在即将发布的 Electron Beta 版本中登陆。

Windows 可能紧随其后

接下来,Adrien 希望通过在 Electron 中添加对 Microsoft Store 应用内购买的支持,为 Amanote 开辟新的收入渠道。 请继续关注这方面的进展!

Webview 漏洞修复

·2 分钟阅读

发现了一个漏洞,该漏洞允许在某些禁用 Node.js 集成的 Electron 应用程序中重新启用它。此漏洞已被分配 CVE 标识符 CVE-2018-1000136


受影响的应用程序

如果以下所有条件均为真,则应用程序会受到影响

  1. 在 Electron 1.7、1.8 或 2.0.0-beta 上运行
  2. 允许执行任意远程代码
  3. 禁用 Node.js 集成
  4. 在其 webPreferences 中没有明确声明 webviewTag: false
  5. 没有启用 nativeWindowOption 选项
  6. 不会拦截 new-window 事件,并且在不使用提供的 options 标签的情况下手动覆盖 event.newGuest

虽然这似乎只影响少数 Electron 应用程序,但我们鼓励所有应用程序升级以进行预防。

缓解措施

此漏洞在今天的 1.7.131.8.42.0.0-beta.5 版本中得到修复。

无法升级其应用程序 Electron 版本的开发人员可以使用以下代码来缓解此漏洞

app.on('web-contents-created', (event, win) => {
win.on(
'new-window',
(event, newURL, frameName, disposition, options, additionalFeatures) => {
if (!options.webPreferences) options.webPreferences = {};
options.webPreferences.nodeIntegration = false;
options.webPreferences.nodeIntegrationInWorker = false;
options.webPreferences.webviewTag = false;
delete options.webPreferences.preload;
},
);
});

// and *IF* you don't use WebViews at all,
// you might also want
app.on('web-contents-created', (event, win) => {
win.on('will-attach-webview', (event, webPreferences, params) => {
event.preventDefault();
});
});

更多信息

此漏洞是由 Trustwave SpiderLabs 的 Brendan Scarvell 负责地发现并报告给 Electron 项目的。

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

要在 Electron 中报告漏洞,请发送电子邮件至 [email protected]

请加入我们的 邮件列表 以接收有关版本和安全更新的通知。

网站小故障

·2 分钟阅读

上周,electronjs.org 站点宕机了几分钟。 如果你受到了这些短暂中断的影响,我们对由此造成的不便表示歉意。 在今天进行了一些调查之后,我们诊断出了根本原因,并部署了修复程序


为了防止将来发生此类停机,我们在我们的应用程序上启用了 Heroku 阈值警报。 每当我们的 Web 服务器积累的失败请求或响应速度超过特定阈值时,我们的团队将收到通知,以便我们可以快速解决问题。

每种语言的离线文档

下次你在飞机上或地下咖啡馆开发 Electron 应用程序时,你可能需要一份文档副本以供离线参考。 幸运的是,Electron 的文档以 Markdown 文件的形式提供,有 20 多种语言版本。

git clone https://github.com/electron/electron-i18n
ls electron-i18n/content

带有 GUI 的离线文档

devdocs.io/electron 是一个方便的网站,可存储文档以供离线使用,不仅适用于 Electron,还适用于许多其他项目,如 JavaScript、TypeScript、Node.js、React、Angular 等。 当然,还有一个 Electron 应用程序也可以使用。 在 Electron 站点上查看 devdocs-app

devdocs-app

如果你喜欢在不使用鼠标或触控板的情况下安装应用程序,请尝试 Electron Forgeinstall 命令

npx electron-forge install egoist/devdocs-app