跳至主要内容

BrowserView window.open() 漏洞修复

·阅读时间:1 分钟

已发现一个代码漏洞,该漏洞允许在子窗口中重新启用 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 版本,则可以通过禁用所有子 webContents 来缓解此问题。

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

更多信息

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

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

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

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 的原生插件,并且由于此问题而无法构建原生插件,请与插件作者联系,查看他们是否发布了修复该问题的最新版本。如果没有,与作者联系(或创建 Pull Request!)可能是最好的选择。

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 的发布计划。您可以在这里找到它。

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

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 创建新 BrowserWindow 时,以下 webPreferences 选项默认值已弃用,取而代之的是下面列出的新默认值

属性已弃用的默认值新的默认值
contextIsolationfalsetrue
nodeIntegrationtruefalse
webviewTag如果设置了 nodeIntegration 的值,则为该值,否则为 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 测试版周期中的参与。要了解有关应用反馈计划的更多信息并参与未来的测试版,请查看我们有关该计划的博客文章

下一步

短期内,您可以预期该团队将继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。虽然我们谨慎地不承诺发布日期,但我们的计划是大约每季度发布一次包含新版本组件的新版本 Electron。请参阅我们的版本控制文档,以获取有关 Electron 中版本控制的更多详细信息。

有关计划在 Electron 的未来版本中进行的重大更改的信息,请参阅我们计划中的重大更改文档

SQLite 漏洞修复

·阅读时间:1 分钟

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


范围

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

缓解措施

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

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

目前还没有关于此漏洞在野外被利用的报道;但是,鼓励受影响的应用程序采取缓解措施。

更多信息

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

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

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

Electron 应用程序反馈计划

·阅读时长:3 分钟

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

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


谁可以加入?

我们加入该计划的应用程序的标准和期望包括以下项目

  • 在测试版期间测试您的应用程序,时长超过 10,000 个用户小时
  • 指定一名联络人,每周与我们联系,讨论您应用程序的 Electron 错误和应用程序阻断因素
  • 您同意遵守 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 版本的反馈进度来更客观地定义稳定版本标准。v3.0.0 的完成离不开我们应用程序反馈计划合作伙伴的支持,他们在 beta 周期中提供了早期测试和反馈。感谢 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: 使用 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 到屏幕坐标和屏幕坐标到 DIP 的转换

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

错误修复

  • [#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: 重新使用触控栏项目时事件泄漏
  • [#12352] fix: 托盘标题崩溃
  • [#12327] fix: 不可拖动区域
  • [#12809] fix: 为了防止菜单在打开时更新
  • [#13162] fix: 托盘图标边界不允许负值
  • [#13085] fix: 托盘标题在突出显示时没有反转
  • [#12196] fix: 当 enable_run_as_node==false 时,Mac 构建
  • [#12157] fix: 无边框窗口上出现活力时出现其他问题
  • [#13326] fix: 在调用 app.removeAsDefaultProtocolClient 后将 mac 协议设置为无
  • [#13530] fix: MAS 构建中私有 API 的不正确使用
  • [#13517] fix: tray.setContextMenu 崩溃
  • [#14205] fix: 即使设置了 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(Electron 中包装 Chromium 的“content”子模块的部分)分开。Electron 继续使用 GYP,而 libchromiumcontent 作为 Chromium 的子集,在 Chromium 迁移到 GN 时也随之迁移。

就像齿轮不能完全啮合一样,使用这两种构建系统之间存在摩擦。从编译器标志和 #defines 开始,保持兼容性容易出错,这些标志和 #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 版本,您可以通过对所有 webContents' 的 new-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 AustinContrast Security 的成员)发现并负责任地报告给 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 项目的功能

API 文档

有时您知道做什么,但您不知道如何做。Electron 拥有超过 750 种 API 方法、事件和属性。没有人能轻松记住所有这些,但计算机擅长这些。使用 Electron 的 JSON API 文档,我们在 Algolia 中索引了所有这些数据,现在您可以轻松找到您要查找的确切 API。

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

教程

Electron 拥有一个不断增长的教程库,以补充其 API 文档。现在您可以更容易地找到特定主题的教程,这些教程与相关的 API 文档并列。

想了解安全最佳实践吗?搜索 security

npm 包

npm 注册表现在拥有超过 700,000 个包,找到您需要的那个包并不总是那么容易。为了更容易发现这些模块,我们创建了 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 聚焦搜索输入并清除它
  • down 移动到下一个结果
  • up 移动到上一个结果,或搜索输入
  • enter 打开结果

我们还开源了 模块,它使这种键盘交互成为可能。 它旨在与 Algolia InstantSearch 结合使用,但已泛化以支持与不同搜索实现的兼容性。

我们希望得到您的反馈

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

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

感谢

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