跳到主要内容

Electron 7.0.0

·4 分钟阅读

Electron 7.0.0 已经发布!它包括对 Chromium 78、V8 7.8 和 Node.js 12.8.1 的升级。我们添加了 Arm 64 上的 Windows 版本、更快的 IPC 方法、新的 nativeTheme API,以及更多!


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

值得注意的更改

  • 堆栈升级

    堆栈Electron 6 中的版本Electron 7 中的版本新功能
    Chromium76.0.3809.14678.0.3905.177, 78
    V87.67.87.7, 7.8
    Node.js12.4.012.8.112.5, 12.6, 12.7, 12.8, 12.8.1
  • 添加了 Arm (64 位) 上的 Windows 版本。#18591, #20112

  • 添加了 ipcRenderer.invoke()ipcMain.handle() 用于异步请求/响应式 IPC。强烈建议使用这些功能,而不是 remote 模块。有关更多信息,请参阅这篇 "Electron 的“remote”模块被认为有害" 博客文章。#18449

  • 添加了 nativeTheme API 来读取和响应操作系统主题和配色方案的更改。#19758, #20486

  • 切换到新的 TypeScript 定义生成器。生成的定义更加精确;因此,如果您的 TypeScript 构建失败,这可能是原因。#18103

请参阅7.0.0 发布说明以获取更长的更改列表。

重大更改

有关这些和未来更改的更多信息,请访问计划重大更改页面。

  • 删除了已弃用的 API
    • 现在使用 Promise 的函数的基于回调的版本。#17907
    • Tray.setHighlightMode() (macOS)。#18981
    • app.enableMixedSandbox() #17894
    • app.getApplicationMenu(),
    • app.setApplicationMenu(),
    • powerMonitor.querySystemIdleState(),
    • powerMonitor.querySystemIdleTime(),
    • webFrame.setIsolatedWorldContentSecurityPolicy(),
    • webFrame.setIsolatedWorldHumanReadableName(),
    • webFrame.setIsolatedWorldSecurityOrigin() #18159
  • Session.clearAuthCache() 不再允许过滤清除的缓存条目。#17970
  • macOS 上的原生界面(菜单、对话框等)现在会自动匹配用户机器上的深色模式设置。#19226
  • 更新了 electron 模块以使用 @electron/get。现在支持的最低节点版本是 Node 8。#18413
  • 文件 electron.asar 不再存在。任何依赖其存在的打包脚本都应更新。#18577

对 4.x.y 的支持结束

根据项目的支持策略,Electron 4.x.y 已达到支持结束状态。鼓励开发人员和应用程序升级到较新版本的 Electron。

应用反馈计划

我们继续使用我们的应用反馈计划进行测试。参与此计划的项目在其应用上测试 Electron 测试版;作为回报,他们发现的新错误将在稳定版本中优先处理。如果您想参与或了解更多信息,请查看我们关于该计划的博客文章

下一步是什么

在短期内,您可以期望该团队继续专注于跟上构成 Electron 的主要组件的开发,包括 Chromium、Node 和 V8。尽管我们小心不做出关于发布日期的承诺,但我们的计划是大约每季度发布带有这些组件的新版本的新 Electron 主要版本。 暂定的 8.0.0 时间表列出了 Electron 8 开发生命周期中的关键日期。此外,请参阅我们的版本控制文档以获取有关 Electron 版本控制的更详细信息。

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

Electron 6.0.0

·6 分钟阅读

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


新功能

今天标志着 Electron 项目的一个第一:这是我们第一次在与相应的 Chrome 稳定版发布同一天进行稳定的 Electron 发布!🎉

Electron 的大部分功能由 Chromium、Node.js 和 V8 的核心组件提供。 Electron 与这些项目保持同步,以便为我们的用户提供新的 JavaScript 功能、性能改进和安全修复。这些软件包中的每一个在 Electron 6 中都有一个主要版本更新

此版本还包括对 Electron API 的改进。发布说明包含更完整的列表,但以下是一些亮点

Promise 化

Electron 6.0 继续了 5.0 中启动的现代化计划,以改进 Promise 支持。

这些函数现在返回 Promises,并且仍然支持较旧的基于回调的调用

  • contentTracing.getCategories() #16583
  • contentTracing.getCategories() #16583
  • contentTracing.getTraceBufferUsage() #16600
  • contents.executeJavaScript() #17312
  • cookies.flushStore() #16464
  • cookies.get() #16464
  • cookies.remove() #16464
  • cookies.set() #16464
  • dialog.showCertificateTrustDialog() #17181
  • inAppPurchase.getProducts() #17355
  • inAppPurchase.purchaseProduct()#17355
  • netLog.stopLogging() #16862
  • session.clearAuthCache() #17259
  • session.clearCache() #17185
  • session.clearHostResolverCache() #17229
  • session.clearStorageData() #17249
  • session.getBlobData() #17303
  • session.getCacheSize() #17185
  • session.resolveProxy() #17222
  • session.setProxy() #17222
  • webContents.hasServiceWorker() #16535
  • webContents.printToPDF() #16795
  • webContents.savePage() #16742
  • webFrame.executeJavaScript() #17312
  • webFrame.executeJavaScriptInIsolatedWorld() #17312
  • webviewTag.executeJavaScript() #17312

这些函数现在有两种形式,同步和基于 Promise 的异步

  • dialog.showMessageBox()/dialog.showMessageBoxSync() #17298
  • dialog.showOpenDialog()/dialog.showOpenDialogSync() #16973
  • dialog.showSaveDialog()/dialog.showSaveDialogSync() #17054

这些函数现在返回 Promises

Electron Helper (Renderer).appElectron Helper (GPU).appElectron Helper (Plugin).app

为了启用强化运行时,它限制了诸如可写可执行内存和加载由不同团队 ID 签名的代码等行为,需要向 Helper 授予特殊的代码签名权利。

为了将这些权利限制在需要它们的进程类型中,Chromium 添加了 Helper 应用的三个新变体:一个用于渲染器 (Electron Helper (Renderer).app),一个用于 GPU 进程 (Electron Helper (GPU).app),一个用于插件 (Electron Helper (Plugin).app)。

使用 electron-osx-sign 对 Electron 应用进行代码签名的人员无需对其构建逻辑进行任何更改。 如果您使用自定义脚本对应用进行代码签名,则应确保这三个新的 Helper 应用程序已正确签名。

为了使用这些新的 helpers 正确打包您的应用程序,您需要使用 electron-packager@14.0.4 或更高版本。 如果您正在使用 electron-builder,则应关注此问题,以跟踪对这些新 helpers 的支持。

重大更改

  • 此版本开始为未来的要求奠定基础,即渲染器进程中加载的本机 Node 模块必须是 N-APIContext Aware。 此更改的原因是更快的性能、更强的安全性以及减少的维护工作量。 阅读 此问题 中的完整详细信息,包括拟议的时间表。预计此更改将在 Electron v11 中完成。

  • net.IncomingMessage headers 已略有更改,以更紧密地匹配 Node.js 行为,尤其是在 set-cookie 的值以及如何处理重复 headers 方面。 #17517

  • shell.showItemInFolder() 现在返回 void 并且是一个异步调用。 #17121

  • 应用现在必须通过调用新函数 app.setAppLogPath() 显式设置日志路径,然后才能使用 app.getPath('log')#17841

停止对 3.x.y 的支持

根据我们的支持策略,3.x.y 已达到使用寿命。 鼓励开发人员和应用程序升级到较新版本的 Electron。

应用反馈计划

我们继续使用我们的应用反馈计划进行测试。参与此计划的项目在其应用上测试 Electron 测试版;作为回报,他们发现的新错误将在稳定版本中优先处理。如果您想参与或了解更多信息,请查看我们关于该计划的博客文章

下一步是什么

在短期内,您可以期望团队继续专注于跟上构成 Electron 的主要组件(包括 Chromium、Node 和 V8)的开发。 尽管我们谨慎地不对发布日期做出承诺,但我们的计划是大约每季度发布具有这些组件新版本的 Electron 的新主要版本。暂定的 7.0.0 计划 规划了 Electron 7 开发生命周期中的关键日期。 此外,请参阅我们的版本控制文档,以获取有关 Electron 中版本控制的更详细信息。

有关 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 版; 作为回报,他们发现的新 bug 会被优先用于稳定版本。

📝 Electron 版本发布的简要历史

v3.0.0 之前的稳定版本发布的决策没有遵循时间表。 我们在 v3.0.0 和 v4.0.0 中向该项目添加了内部时间表。 今年早些时候,我们决定首次发布 Electron v5.0.0 的稳定版本发布日期。 宣布我们的稳定版本发布日期总体上受到了积极的评价,我们很高兴继续为将来的版本这样做。

为了更好地简化这些与升级相关的工作,我们的升级发布工作组是在我们的治理系统中创建的。 它们使我们能够更好地确定此工作的优先级并进行委派,我们希望随着每个后续版本的发布,这一点将变得更加明显。

这是我们的新节奏与 Chromium 的节奏相比的位置

line graph comparing Electron versus Chromium versions

📨 如果您有任何疑问,请发送邮件至 info@electronjs.org

Electron 5.0.0

·5 分钟阅读

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 继续 Promisification 倡议,该倡议旨在转换 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,以提高安全性。

拼写检查器现在是异步的

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

从原生到 JavaScript,尽在 Electron

·4 分钟阅读

以 C++ 或 Objective-C 编写的 Electron 功能如何进入 JavaScript,以便最终用户可以使用它们?


背景

Electron 是一个 JavaScript 平台,其主要目的是降低开发人员构建强大的桌面应用程序的门槛,而无需担心特定于平台的实现。 但是,在其核心,Electron 本身仍然需要用给定的系统语言编写特定于平台的功能。

实际上,Electron 会为您处理本机代码,以便您可以专注于单个 JavaScript API。

但是,它是如何工作的呢? 以 C++ 或 Objective-C 编写的 Electron 功能如何进入 JavaScript,以便最终用户可以使用它们?

为了追踪此路径,让我们从 app 模块开始。

通过打开我们 lib/ 目录中的 app.ts 文件,您将在顶部附近找到以下代码行

const binding = process.electronBinding('app');

该行直接指向 Electron 的机制,用于将其 C++/Objective-C 模块绑定到 JavaScript,以供开发人员使用。 此函数由 ElectronBindings 类的 header 和 实现文件 创建。

process.electronBinding

这些文件添加了 process.electronBinding 函数,其行为类似于 Node.js 的 process.bindingprocess.binding 是 Node.js 的 require() 方法的较低级别实现,只不过它允许用户 require 本机代码,而不是用 JS 编写的其他代码。 此自定义 process.electronBinding 函数授予了从 Electron 加载本机代码的能力。

当顶级 JavaScript 模块(例如 app)需要此本机代码时,该本机代码的状态如何确定和设置? 方法(暴露给 JavaScript)和属性在哪里?

native_mate

目前,此问题的答案可以在 native_mate 中找到:它是 Chromium 的 gin 的一个分支,它使在 C++ 和 JavaScript 之间封送类型变得更容易。

native_mate/native_mate 中,有一个 object_template_builder 的 header 和实现文件。 这就是允许我们在本机代码中形成模块,其形状符合 JavaScript 开发人员的预期。

mate::ObjectTemplateBuilder

如果我们将每个 Electron 模块都视为一个 object,那么更容易理解为什么我们要使用 object_template_builder 来构造它们。 此类构建在 V8 公开的类的顶层,V8 是 Google 的开源高性能 JavaScript 和 WebAssembly 引擎,以 C++ 编写。 V8 实现了 JavaScript (ECMAScript) 规范,因此它的本机功能实现可以直接与 JavaScript 中的实现相关联。 例如,v8::ObjectTemplate 为我们提供了没有专用构造函数和原型的 JavaScript 对象。 它使用 Object[.prototype],并且在 JavaScript 中等同于 Object.create()

要查看实际效果,请查看 app 模块的实现文件 atom_api_app.cc。 底部是以下内容

mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.SetMethod("getGPUInfo", &App::GetGPUInfo)

在上面的行中,.SetMethodmate::ObjectTemplateBuilder 上调用。 可以对 ObjectTemplateBuilder 类的任何实例调用 .SetMethod 以在 JavaScript 中设置 Object prototype 上的方法,其语法如下

.SetMethod("method_name", &function_to_bind)

这是 JavaScript 等效项

function App{}
App.prototype.getGPUInfo = function () {
// implementation here
}

此类还包含用于在模块上设置属性的函数

.SetProperty("property_name", &getter_function_to_bind)

.SetProperty("property_name", &getter_function_to_bind, &setter_function_to_bind)

这些反过来将是 Object.defineProperty 的 JavaScript 实现

function App {}
Object.defineProperty(App.prototype, 'myProperty', {
get() {
return _myProperty
}
})

function App {}
Object.defineProperty(App.prototype, 'myProperty', {
get() {
return _myProperty
}
set(newPropertyValue) {
_myProperty = newPropertyValue
}
})

可以创建使用原型和属性形成的 JavaScript 对象,正如开发人员所期望的那样,并且可以更清楚地推断在此较低系统级别实现的功能和属性!

关于在何处实现任何给定的模块方法的决定本身就是一个复杂且通常是不确定的决定,我们将在以后的文章中介绍。

Electron 治理

·3 分钟阅读

随着 Electron 在桌面应用程序中越来越受欢迎,致力于该团队的团队也在不断壮大:我们有更多为不同公司工作的全职维护人员,他们居住在不同的时区,并且有不同的兴趣。 我们正在引入治理结构,以便我们可以保持平稳增长。


为什么要进行更改?

Electron 项目中的人员与志愿者、全职维护人员以及所有依赖 Electron 的几家公司在全球范围内的时区进行协调。 到目前为止,我们通过非正式协调取得了成功; 但是随着团队的发展,我们发现该方法无法扩展。 我们还希望使新贡献者更容易在项目中找到一个称之为家的地方。

工作组

Electron 治理包括负责项目不同部分的工作组。 我们从七个小组开始

  • 社区与安全:处理 行为准则 问题。
  • 文档和工具:负责外部工具(例如 FiddleForge)和 Electron 文档
  • 推广:帮助壮大 Electron 社区。
  • 发布:确保发布版本稳定并按计划进行。
  • 安全:执行安全测试并响应安全问题。
  • 升级:集成上游升级,例如新版本的 V8、Chromium 和 Node。
  • 网站:维护和改进 Electron 网站

这些小组将相互协调,但每个小组都有自己的会议安排和议程,以便高效地独立工作。 有关这些小组的更多详细信息,请访问治理仓库

这是否会改变 Electron 项目的方向?

这不应该对 Electron 的方向产生任何直接影响。 如果我们的策略成功,工作组将使新的贡献者更容易找到他们感兴趣的主题,并通过将与其日常工作无关的讨论转移到其他组来简化维护人员的生活。 如果发生这种情况,它可能会通过让更多畅通无阻的人一起工作而间接影响事情。

在哪里可以了解更多信息?

Chromium FileReader 漏洞修复

·2 分钟阅读

Chrome 中发现了一个高危漏洞,它会影响所有基于 Chromium 的软件,包括 Electron。

此漏洞已被分配 CVE-2019-5786。 您可以在 Chrome 博客文章中阅读有关此漏洞的更多信息。

请注意,Chrome 报告称此漏洞已被在野利用,因此强烈建议您尽快升级 Electron。


范围

这会影响任何可能运行第三方或不受信任的 JavaScript 的 Electron 应用程序。

缓解措施

受影响的应用程序应升级到 Electron 的修补版本。

我们发布了新版本的 Electron,其中包括此漏洞的修复程序

Electron 5 的最新测试版正在跟踪 Chromium 73,因此已经过修补

更多信息

此漏洞由 Google 的威胁分析小组的 Clement Lecigne 发现并报告给 Chrome 团队。 Chrome 博客文章可以在此处找到。

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

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

停止支持 32 位 Linux

·3 分钟阅读

从 Electron v4.0 开始,Electron 团队将停止支持 32 位 Linux(ia32 / i386)。 支持基于 Linux 的 32 位安装的最后一个 Electron 版本是 Electron v3.1,它将收到支持版本,直到 Electron v6 发布。 对基于 64 位 Linux 和 armv7l 的支持将保持不变。


Electron 到底不再支持什么?

您可能已经在您的计算机上看到“64 位”和“32 位”的描述,或者作为下载软件的选项。 该术语用于描述特定的计算机架构。 1990 年代和 2000 年代初期制造的大多数计算机都配备了基于 32 位架构的 CPU,而之后制造的大多数计算机都基于更新且更强大的 64 位架构。 Nintendo 64(明白了吗?)和 PlayStation 2 是首批广泛使用新架构的消费设备,2010 年之后销售的计算机几乎完全包含 64 位处理器。 因此,支持一直在萎缩:Google 于 2016 年 3 月停止发布适用于 32 位 Linux 的 Chrome,Canonical 于 2017 年停止提供 32 位桌面映像,并在 Ubuntu 18.10 中完全放弃了对 32 位的支持。 Arch Linux、elementary OS 和其他著名的 Linux 发行版已经放弃了对老化的处理器架构的支持。

到目前为止,Electron 已经提供并支持在旧的 32 位架构上运行的构建。 从版本 v4.0 开始,Electron 团队将不再能够提供 32 位 Linux 的二进制文件或支持。

Electron 一直是一个充满活力的开源项目,我们将继续支持和鼓励有兴趣为异构架构构建 Electron 的开发人员。

这对开发人员意味着什么?

如果您当前没有为 Linux 提供应用程序的 32 位版本,则无需执行任何操作。

发布 32 位 Linux Electron 应用程序的项目需要决定如何进行。 在 Electron 6 发布之前,Electron 3 将支持 32 位 Linux,这为做出决策和计划提供了一些时间。

这对用户意味着什么?

如果您是 Linux 用户,并且不确定您是否正在运行基于 64 位的系统,那么您很可能正在运行基于 64 位的架构。 为了确保这一点,您可以在终端中运行 lscpuuname -m 命令。 无论哪个命令都会打印您当前的架构。

如果您在 32 位处理器上使用 Linux,那么您可能已经遇到难以找到适用于您的操作系统的最新发布软件的问题。 Electron 团队加入了 Linux 社区的其他杰出成员的行列,建议您升级到基于 64 位的架构。

BrowserView window.open() 漏洞修复

·2 分钟阅读

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

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

更多信息

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

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

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

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 的原生插件,并且由于此问题导致原生插件无法构建,请咨询该插件的作者,看看他们是否发布了修复该问题的新版本。 如果没有,联系作者(或 打开拉取请求!)可能是您的最佳选择。