跳至主要內容

Electron 29.0.0

·4 分鐘閱讀

Electron 29.0.0 已發布!它包含 Chromium 122.0.6261.39、V8 12.2 和 Node.js 20.9.0 的升級。


Electron 團隊很高興宣布發布 Electron 29.0.0!您可以使用 npm 透過 npm install electron@latest 安裝,或從我們的發行版本網站下載。繼續閱讀以了解有關此版本的詳細資訊。

如果您有任何意見回饋,請在 TwitterMastodon 上與我們分享,或加入我們的社群 Discord!錯誤和功能要求可以在 Electron 的問題追蹤器中回報。

重大變更

重點

  • 新增了新的頂層 webUtils 模組,這是一個渲染器程序模組,提供一個公用程式層來與 Web API 物件互動。模組中的第一個可用 API 是 webUtils.getPathForFile。Electron 之前的 File.path 增強功能偏離了 Web 標準;這個新的 API 更符合當前的 Web 標準行為。

堆疊變更

Electron 29 將 Chromium 從 120.0.6099.56 升級到 122.0.6261.39,將 Node 從 18.18.2 升級到 20.9.0,並將 V8 從 12.0 升級到 12.2

新功能

  • 新增了新的 webUtils 模組,這是一個與 Web API 物件互動的公用程式層,以取代 File.path 增強功能。#38776
  • net 模組新增至公用程式程序#40890
  • 新增了一個新的Electron FusegrantFileProtocolExtraPrivileges,它將 file:// 協定選擇加入更安全和限制性的行為,與 Chromium 相符。#40372
  • protocol.registerSchemesAsPrivileged 中新增了一個選項,允許在自訂協定中使用 V8 程式碼快取。#40544
  • app.{set|get}LoginItemSettings(settings) 遷移到在 macOS 13.0+ 上使用 Apple 新建議的底層框架。#37244

重大變更

行為已變更:ipcRenderer 無法再透過 contextBridge 傳送

嘗試將整個 ipcRenderer 模組作為物件透過 contextBridge 傳送,現在會在橋接的接收端產生一個空物件。進行此變更是為了移除/減輕安全漏洞。您不應透過橋接直接公開 ipcRenderer 或其方法。而是提供如下的安全包裝器

contextBridge.exposeInMainWorld('app', {
onEvent: (cb) => ipcRenderer.on('foo', (e, ...args) => cb(args)),
});

已移除:app 上的 renderer-process-crashed 事件

app 上的 renderer-process-crashed 事件已移除。請改用新的 render-process-gone 事件。

// Removed
app.on('renderer-process-crashed', (event, webContents, killed) => {
/* ... */
});

// Replace with
app.on('render-process-gone', (event, webContents, details) => {
/* ... */
});

已移除:WebContents<webview> 上的 crashed 事件

WebContents<webview> 上的 crashed 事件已移除。請改用新的 render-process-gone 事件。

// Removed
win.webContents.on('crashed', (event, killed) => {
/* ... */
});
webview.addEventListener('crashed', (event) => {
/* ... */
});

// Replace with
win.webContents.on('render-process-gone', (event, details) => {
/* ... */
});
webview.addEventListener('render-process-gone', (event) => {
/* ... */
});

已移除:app 上的 gpu-process-crashed 事件

app 上的 gpu-process-crashed 事件已移除。請改用新的 child-process-gone 事件。

// Removed
app.on('gpu-process-crashed', (event, killed) => {
/* ... */
});

// Replace with
app.on('child-process-gone', (event, details) => {
/* ... */
});

26.x.y 版本終止支援

根據專案的支援政策,Electron 26.x.y 版本已終止支援。建議開發者和應用程式升級至較新版本的 Electron。

E29 (2 月 '24)E30 (4 月 '24)E31 (6 月 '24)
29.x.y30.x.y31.x.y
28.x.y29.x.y30.x.y
27.x.y28.x.y29.x.y

下一步

您知道 Electron 最近新增了社群「徵求意見 (RFC)」流程嗎?如果您想為框架新增功能,RFC 可以作為與維護者討論設計的起點。您也可以在 Pull Requests 中查看即將討論的變更。若要了解更多資訊,請查看我們的Introducing electron/rfcs 部落格文章,或直接查看 electron/rfcs 儲存庫的 README。

短期內,您可以預期團隊會繼續專注於跟上組成 Electron 的主要元件(包括 Chromium、Node 和 V8)的開發進度。

您可以在這裡找到 Electron 的公開時程表

有關未來變更的更多資訊,請參閱計畫中的重大變更頁面。

electron/rfcs 介紹

·3 分鐘閱讀

Electron 的API 工作組正在採用開放的徵求意見 (RFC) 流程,以協助引導 Electron 核心的重大變更。

為什麼要使用 RFC?

簡而言之,我們希望簡化將重大變更導入 Electron 核心的流程。

目前,新的程式碼變更主要透過 GitHub 上的 issue 和 pull request 進行討論。對於 Electron 的大多數變更而言,這是一個不錯的系統。許多錯誤修復、文件變更,甚至是新功能都非常簡單,可以透過標準的 GitHub 流程以非同步方式審查和合併。

對於更重要的變更(例如,大型 API 介面或會影響大多數 Electron 應用程式的重大變更),在編寫大部分程式碼之前,在概念階段進行審查是合理的。

此流程旨在對外公開,這也將使更廣泛的開放原始碼社群更容易在潛在變更導入 Electron 之前提供回饋意見。

運作方式為何?

整個 RFC 流程都在 GitHub 上的 electron/rfcs 儲存庫中進行。儲存庫的README 詳細說明了這些步驟。

簡而言之,一旦在 electron/rfcs 儲存庫中建立 PR,RFC 就會被提議。當 PR 合併到儲存庫的 main 分支時,提議的 RFC 會變成

  • 作用中,這表示 Electron 維護者可以接受在 electron/electron 中實作,或者
  • 如果 PR 最終被拒絕,則為已拒絕
資訊

為了使 RFC 變成作用中,PR 必須至少獲得 2 位 API 工作組成員的批准。在合併之前,RFC 應同步提出,並經由至少三分之二的工作組成員達到法定人數一致接受。如果達成共識,將會觸發為期一個月的最終意見回饋期,之後 PR 將會合併。

如果實作已合併到 electron/electron 中,則作用中的 RFC 會變成已完成

誰可以參與?

Electron 社群中的任何人都可以提交 RFC 或在 electron/rfcs 儲存庫上留下意見回饋!

我們希望使此流程成為雙向對話,並鼓勵社群參與,從未來可能會使用這些 API 的 Electron 應用程式中獲得多元的意見。如果您有興趣對目前提議的 RFC 留下意見回饋,Electron 維護者已經建立了一些

致謝

Electron 的 RFC 流程是以許多已建立的開放原始碼 RFC 流程為範本。許多想法和主要文案部分的靈感來自

關於「runAsNode」CVE 的聲明

·4 分鐘閱讀

今天稍早,Electron 團隊接獲通知,有數個針對數個知名 Electron 應用程式提出的公開 CVE。這些 CVE 與 Electron 的兩個熔斷器 - runAsNodeenableNodeCliInspectArguments 相關,並錯誤地聲稱,如果沒有主動停用這些元件,遠端攻擊者就能夠透過這些元件執行任意程式碼。

我們認為這些 CVE 並非善意提出。首先,聲明是不正確的 - 該組態不會啟用遠端程式碼執行。其次,這些 CVE 中提及的公司尚未收到通知,儘管他們有錯誤賞金計畫。最後,雖然我們確實認為停用相關元件可增強應用程式安全性,但我們認為這些 CVE 並非以正確的嚴重性等級提出。「嚴重」保留給最高危險性的問題,而這裡的情況絕對不是這樣。

任何人都可以要求 CVE。雖然這對軟體產業的整體健康狀況有益,但「濫發 CVE」以提升單一安全研究人員的聲譽並無助益。

也就是說,我們理解僅存在具有可怕的「嚴重」等級的 CVE 可能會導致終端使用者混淆,因此作為一個專案,我們希望提供指導和協助來處理此問題。

這可能會對我造成什麼影響?

在審查這些 CVE 後,Electron 團隊認為這些 CVE 並非嚴重。

攻擊者需要能夠在機器上執行任意命令,無論是透過實際存取硬體,還是透過達成完全的遠端程式碼執行。這一點必須重申:所描述的漏洞需要攻擊者已經可以存取受攻擊的系統

例如,Chrome 不會在其威脅模型中考慮實體本地攻擊

我們認為這些攻擊超出 Chrome 的威脅模型範圍,因為 Chrome(或任何應用程式)無法防禦惡意使用者以您的身分登入您的裝置,或以您的作業系統使用者帳戶的權限執行軟體。這樣的攻擊者可以修改可執行檔和 DLL、變更環境變數(例如 PATH)、變更組態檔案、讀取您使用者帳戶擁有的任何資料、將其透過電子郵件傳送給自己等等。這樣的攻擊者完全控制您的裝置,而 Chrome 無法提供嚴格的防禦保證。此問題並非 Chrome 特有的 — 所有應用程式都必須信任實體本地使用者。

CVE 中描述的漏洞允許攻擊者將受影響的應用程式用作具有繼承 TCC 權限的通用 Node.js 處理序。因此,如果應用程式(例如)已獲准存取通訊錄,則攻擊者可以將應用程式作為 Node.js 執行,並執行將繼承該通訊錄存取權的任意程式碼。這通常稱為「利用地產」攻擊。攻擊者通常使用 PowerShell、Bash 或類似工具來執行任意程式碼。

我是否受到影響?

根據預設,所有發布的 Electron 版本都啟用了 runAsNodeenableNodeCliInspectArguments 功能。如果您沒有按照Electron 熔斷器文件中的說明將它們關閉,則您的應用程式同樣容易被用作「利用地產」攻擊。再次強調,我們需要強調攻擊者必須能夠在受害者的機器上執行程式碼和程式。

緩解措施

緩解此問題最簡單的方法是在您的 Electron 應用程式中停用 runAsNode 熔斷器。runAsNode 熔斷器會切換是否遵守 ELECTRON_RUN_AS_NODE 環境變數。請參閱Electron 熔斷器文件,以取得有關如何切換這些熔斷器的資訊。

請注意,如果停用此熔斷機制,則主進程中的 process.fork 將無法如預期運作,因為它依賴此環境變數才能正常運作。相反地,我們建議您使用 Utility Processes,它適用於許多需要獨立 Node.js 進程的用例(例如 Sqlite 伺服器進程或類似情境)。

您可以在我們的 安全檢查清單中找到更多關於我們建議用於 Electron 應用程式的安全最佳實務的資訊。

Electron 28.0.0

·3 分鐘閱讀

Electron 28.0.0 已發布!它包含 Chromium 120.0.6099.56、V8 12.0 和 Node.js 18.18.2 的升級。


Electron 團隊很高興宣布 Electron 28.0.0 的發布!您可以透過 npm 使用 npm install electron@latest 安裝它,或從我們的 發布網站下載。繼續閱讀以了解有關此版本的詳細資訊。

如果您有任何意見回饋,請在 TwitterMastodon 上與我們分享,或加入我們的社群 Discord!錯誤和功能要求可以在 Electron 的問題追蹤器中回報。

重大變更

重點

  • 實作了對 ECMAScript 模組或 ESM 的支援(什麼是 ECMAScript 模組?在此處了解更多)。這包括對 Electron 本身以及 UtilityProcess API 進入點等區域的 ESM 支援。請參閱我們的 ESM 文件以取得更多詳細資訊。
  • 除了在 Electron 本身啟用 ESM 支援之外,Electron Forge 也支援使用 ESM 來封裝、建置和開發 Electron 應用程式。您可以在 Forge v7.0.0 或更高版本中找到此支援。

堆疊變更

新功能

  • 已啟用 ESM 支援。#37535
    • 如需更多詳細資訊,請參閱 ESM 文件
  • 將 ESM 進入點新增至 UtilityProcess API。#40047
  • display 物件中新增了數個屬性,包括 detectedmaximumCursorSizenativeOrigin#40554
  • 新增了在 Linux 上對 ELECTRON_OZONE_PLATFORM_HINT 環境變數的支援。#39792

重大變更

行為變更:將 WebContents.backgroundThrottling 設定為 false 會影響主機 BrowserWindow 中的所有 WebContents

WebContents.backgroundThrottling 設定為 false 將會停用 BrowserWindow 中顯示的所有 WebContents 的畫面節流。

已移除:BrowserWindow.setTrafficLightPosition(position)

已移除 BrowserWindow.setTrafficLightPosition(position),應改用 BrowserWindow.setWindowButtonPosition(position) API,該 API 接受 null 而非 { x: 0, y: 0 } 以將位置重設為系統預設值。

// Removed in Electron 28
win.setTrafficLightPosition({ x: 10, y: 10 });
win.setTrafficLightPosition({ x: 0, y: 0 });

// Replace with
win.setWindowButtonPosition({ x: 10, y: 10 });
win.setWindowButtonPosition(null);

已移除:BrowserWindow.getTrafficLightPosition()

已移除 BrowserWindow.getTrafficLightPosition(),應改用 BrowserWindow.getWindowButtonPosition() API,該 API 在沒有自訂位置時會傳回 null 而非 { x: 0, y: 0 }

// Removed in Electron 28
const pos = win.getTrafficLightPosition();
if (pos.x === 0 && pos.y === 0) {
// No custom position.
}

// Replace with
const ret = win.getWindowButtonPosition();
if (ret === null) {
// No custom position.
}

已移除:ipcRenderer.sendTo()

已移除 ipcRenderer.sendTo() API。應透過在渲染器之間設定 MessageChannel 來取代它。

也已移除 IpcRendererEventsenderIdsenderIsMainFrame 屬性。

已移除:app.runningUnderRosettaTranslation

已移除 app.runningUnderRosettaTranslation 屬性。請改用 app.runningUnderARM64Translation

// Removed
console.log(app.runningUnderRosettaTranslation);
// Replace with
console.log(app.runningUnderARM64Translation);

25.x.y 終止支援

根據專案的支援原則,Electron 25.x.y 已達到終止支援。建議開發人員和應用程式升級到較新版本的 Electron。

E28 (23 年 12 月)E29 (2 月 '24)E30 (4 月 '24)
28.x.y29.x.y30.x.y
27.x.y28.x.y29.x.y
26.x.y27.x.y28.x.y

下一步

短期內,您可以預期團隊會繼續專注於跟上組成 Electron 的主要元件(包括 Chromium、Node 和 V8)的開發進度。

您可以在這裡找到 Electron 的公開時程表

有關未來變更的更多資訊,請參閱計畫中的重大變更頁面。

2023 年生態系統回顧

·5 分鐘閱讀

回顧 2023 年 Electron 開發人員生態系統的改進和變更。


在過去的幾個月中,我們一直在 Electron 生態系統中進行一些變更,以提升 Electron 應用程式的開發人員體驗!以下是直接來自 Electron 總部的最新新增功能的快速概述。

Electron Forge 7 及更高版本

Electron Forge 7 — 我們用於封裝和發佈 Electron 應用程式的一體式工具的最新主要版本 — 現在已推出。

雖然 Forge 6 是從 v5 完全重寫的,但 v7 的範圍較小,但仍然包含一些重大變更。未來,我們將在需要進行重大變更時繼續發布主要版本的 Forge。

如需更多詳細資訊,請參閱 GitHub 上的完整 Forge v7.0.0 變更日誌

重大變更

  • 切換為使用 notarytool 進行 macOS 公證:截至 2023 年 11 月 1 日,Apple 已停用用於 macOS 公證的舊版 altool,此版本已將其從 Electron Forge 中完全移除。
  • 最低 Node.js 版本提高到 v16.4.0:在此版本中,我們已將最低要求的 Node.js 版本設定為 16.4.0。
  • 已停止支援 electron-prebuiltelectron-prebuilt-compileelectron-prebuilt 是 Electron npm 模組的原始名稱,但在 v1.3.1 中被 electron 取代。electron-prebuilt-compile 是該二進位檔案的替代方案,它帶有增強的 DX 功能,但最終被放棄作為一個專案。

重點

  • Google Cloud Storage 發佈者為了更好地支援靜態自動更新,Electron Forge 現在支援直接發佈到 Google Cloud Storage!
  • ESM forge.config.js 支援Electron Forge 現在支援 ESM forge.config.js 檔案。(附註:期待 Electron 28 中的 ESM 進入點支援。)
  • 製作器現在並行執行在 Electron Forge 6 中,製作器由於 ✨ 舊版 ✨ 原因而循序執行。從那時起,我們測試了 Make 步驟的平行化,沒有產生不利的副作用,因此您應該可以在為同一平台建置多個目標時看到速度加快!
謝謝!

🙇 非常感謝 mahnunchik 為 Forge 組態中的 GCS 發佈者和 ESM 支援所做的貢獻!

更好的靜態儲存自動更新

Squirrel.Windows 和 Squirrel.Mac 是特定於平台的更新程式技術,為 Electron 的內建 autoUpdater 模組提供支援。這兩個專案都支援透過兩種方法進行自動更新

  • 與 Squirrel 相容的更新伺服器
  • 託管在靜態儲存提供者(例如 AWS、Google Cloud Platform、Microsoft Azure 等)上的資訊清單 URL

更新伺服器方法傳統上是 Electron 應用程式的建議方法(並提供更新邏輯的其他自訂),但它有一個主要的缺點 — 如果應用程式是封閉原始碼,則需要應用程式維護自己的伺服器實例。

另一方面,靜態儲存方法一直都是可行的,但在 Electron 內未記載,並且在 Electron 工具套件中支援不足。

@MarshallOfSound 的出色工作下,無伺服器自動應用程式更新的更新故事已大幅簡化

  • 現在可以將 Electron Forge 的 Zip 和 Squirrel.Windows 製作器設定為輸出與 autoUpdater 相容的更新資訊清單。
  • update-electron-app 的新主要版本(v2.0.0)現在可以讀取這些產生的資訊清單,作為 update.electronjs.org 伺服器的替代方案。

一旦您的製作器和發佈者設定為將更新資訊清單上傳到雲端檔案儲存,您只需幾行設定即可啟用自動更新

const { updateElectronApp, UpdateSourceType } = require('update-electron-app');

updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://my-manifest.url/${process.platform}/${process.arch}`,
},
});
進一步閱讀

📦 想了解更多嗎?如需詳細指南,請參閱 Forge 的自動更新文件

@electron/ 擴展宇宙

在 Electron 剛起步時,社群發布了許多套件,以增強開發、封裝和發布 Electron 應用程式的體驗。隨著時間的推移,這些套件中有許多被納入 Electron 的 GitHub 組織,並由核心團隊承擔維護的責任。

在 2022 年,我們開始將所有這些第一方工具統一在 npm 上的 @electron/ 命名空間下。這項變更意味著,以前名為 electron-foo 的套件現在在 npm 上是 @electron/foo,而以前名為 electron/electron-foo 的儲存庫現在在 GitHub 上是 electron/foo。這些變更清楚地劃分了第一方專案和使用者專案。這包括許多常用的套件,例如:

  • @electron/asar
  • @electron/fuses
  • @electron/get
  • @electron/notarize
  • @electron/osx-sign
  • @electron/packager
  • @electron/rebuild
  • @electron/remote
  • @electron/symbolicate-mac
  • @electron/universal

未來,我們發布的所有第一方套件也將在 @electron/ 命名空間中。此規則有兩個例外:

  • Electron 核心將繼續以 electron 套件發布。
  • Electron Forge 將繼續在其 @electron-forge/ 命名空間下發布所有單一儲存庫套件。
尋求星標

⭐ 在此過程中,我們還意外地將 electron/packager 儲存庫設為私有,這帶來了不幸的副作用,就是抹去了我們的 GitHub 星標數量(在抹除之前超過 9000 個)。如果您是 Packager 的活躍使用者,我們會很感激您給予 ⭐ 星標 ⭐!

介紹 @electron/windows-sign

從 2023 年 6 月 1 日起,業界標準開始要求將 Windows 程式碼簽署憑證的金鑰儲存在符合 FIPS 規範的硬體上。

實際上,這意味著在 CI 環境中建置和簽署的應用程式,其程式碼簽署變得更加困難,因為許多 Electron 工具會將憑證檔案和密碼作為組態參數,並嘗試使用硬編碼的邏輯從那裡進行簽署。

這種情況一直是 Electron 開發人員的痛點,這也是我們一直在努力尋求更好解決方案的原因,該解決方案將 Windows 程式碼簽署隔離到其自己的獨立步驟中,類似於 @electron/osx-sign 在 macOS 上的做法。

未來,我們計劃將此套件完全整合到 Electron Forge 工具鏈中,但它目前是獨立存在的。該套件目前可透過 npm install --save-dev @electron/windows-sign 安裝,並且可以透過程式設計或 CLI 使用。

請嘗試使用並在該儲存庫的問題追蹤器中給予我們您的回饋!

接下來是什麼?

我們將在下個月進入一年一度的 12 月休靜期。在此期間,我們將思考如何在 2024 年讓 Electron 開發體驗變得更好。

您希望我們接下來處理什麼?請告訴我們!

十二月靜默期 (2023 年 12 月)

·2 分鐘閱讀

Electron 專案將在 2023 年 12 月暫停,然後在 2024 年 1 月恢復全速運轉。

透過 GIPHY


12 月將保持不變的事項

  1. 零日漏洞和其他主要安全性相關版本將在必要時發布。安全性事件應透過 SECURITY.md 回報。
  2. 行為準則報告和審核將繼續進行。

12 月將會改變的事項

  1. Electron 28.0.0 將於 12 月 5 日發布。在 Electron 28 之後,12 月將不會有新的穩定版本發布。
  2. 12 月最後兩週不會有 Nightly 和 Alpha 版本發布。
  3. 除了少數例外,不會有提取請求審查或合併。
  4. 不會有任何儲存庫的問題追蹤器更新。
  5. 維護人員不會在 Discord 上提供除錯協助。
  6. 不會有社交媒體內容更新。

展望未來

這是我們連續第三年進行休靜期實驗,到目前為止,我們在平衡一個月的休息時間與之後維持正常發布週期方面取得了很大的成功。因此,我們已決定將其作為我們未來發布日曆的常規部分。我們仍會在每個曆年的最後一個穩定版本中加入提醒。

2024 年見!

Electron 27.0.0

·3 分鐘閱讀

Electron 27.0.0 已發布!它包括 Chromium 118.0.5993.32、V8 11.8 和 Node.js 18.17.1 的升級。


Electron 團隊很高興宣布 Electron 27.0.0 的發布!您可以使用 npm 透過 npm install electron@latest 安裝它,或從我們的發布網站下載。繼續閱讀以了解有關此版本的詳細資訊。

如果您有任何意見回饋,請在 TwitterMastodon 上與我們分享,或加入我們的社群 Discord!錯誤和功能要求可以在 Electron 的問題追蹤器中回報。

重大變更

堆疊變更

重大變更

已移除:macOS 10.13 / 10.14 支援

macOS 10.13 (High Sierra) 和 macOS 10.14 (Mojave) 已不再受 Chromium 支援。

較舊版本的 Electron 將繼續在這些作業系統上執行,但執行 Electron v27.0.0 及更高版本將需要 macOS 10.15 (Catalina) 或更高版本。

已棄用:ipcRenderer.sendTo()

ipcRenderer.sendTo() API 已被棄用。應透過在渲染器之間設定 MessageChannel 來取代它。

IpcRendererEventsenderIdsenderIsMainFrame 屬性也已被棄用。

已移除:systemPreferences 中的色彩配置事件

已移除下列 systemPreferences 事件:

  • inverted-color-scheme-changed
  • high-contrast-color-scheme-changed

請改為使用 nativeTheme 模組上的新 updated 事件。

// Removed
systemPreferences.on('inverted-color-scheme-changed', () => {
/* ... */
});
systemPreferences.on('high-contrast-color-scheme-changed', () => {
/* ... */
});

// Replace with
nativeTheme.on('updated', () => {
/* ... */
});

已移除:webContents.getPrinters

已移除 webContents.getPrinters 方法。請改用 webContents.getPrintersAsync

const w = new BrowserWindow({ show: false });

// Removed
console.log(w.webContents.getPrinters());
// Replace with
w.webContents.getPrintersAsync().then((printers) => {
console.log(printers);
});

已移除:systemPreferences.{get,set}AppLevelAppearancesystemPreferences.appLevelAppearance

已移除 systemPreferences.getAppLevelAppearancesystemPreferences.setAppLevelAppearance 方法,以及 systemPreferences.appLevelAppearance 屬性。請改為使用 nativeTheme 模組。

// Removed
systemPreferences.getAppLevelAppearance();
// Replace with
nativeTheme.shouldUseDarkColors;

// Removed
systemPreferences.appLevelAppearance;
// Replace with
nativeTheme.shouldUseDarkColors;

// Removed
systemPreferences.setAppLevelAppearance('dark');
// Replace with
nativeTheme.themeSource = 'dark';

已移除:systemPreferences.getColoralternate-selected-control-text

已移除 systemPreferences.getColoralternate-selected-control-text 值。請改用 selected-content-background

// Removed
systemPreferences.getColor('alternate-selected-control-text');
// Replace with
systemPreferences.getColor('selected-content-background');

新功能

  • 新增應用程式協助工具透明度設定 API #39631
  • 新增對 chrome.scripting 擴充功能 API 的支援 #39675
  • 預設啟用 WaylandWindowDecorations #39644

24.x.y 的支援終止

根據專案的支援政策,Electron 24.x.y 已達到支援終止。建議開發人員和應用程式升級到較新版本的 Electron。

E27 (2023 年 10 月)E28 (23 年 12 月)E29 (2 月 '24)
27.x.y28.x.y29.x.y
26.x.y27.x.y28.x.y
25.x.y26.x.y27.x.y

22.x.y 的擴展支援終止

今年稍早,Electron 團隊將 Electron 22 的原定終止日期從 2023 年 5 月 30 日延長至 2023 年 10 月 10 日,以便與 Chrome 對 Windows 7/8/8.1 的擴展支援相符(如需更多詳細資訊,請參閱告別 Windows 7/8/8.1)。

根據專案的支援政策和此支援延長,Electron 22.x.y 已達到支援終止。這會將支援降回最新的三個穩定主要版本,並結束對 Windows 7/8/8.1 的官方支援。

下一步

短期內,您可以預期團隊會繼續專注於跟上組成 Electron 的主要元件(包括 Chromium、Node 和 V8)的開發進度。

您可以在這裡找到 Electron 的公開時程表

有關未來變更的更多資訊,請參閱計畫中的重大變更頁面。

突破障礙:使用沙箱加強應用程式

·4 分鐘閱讀

CVE-2023-4863:WebP 中的堆積緩衝區溢位公開以來已經過了一週多,這導致軟體渲染 webp 影像的新版本湧現:macOS、iOS、Chrome、Firefox 和各種 Linux 發行版都收到了更新。此前,公民實驗室進行了調查,發現一個「位於華盛頓特區的公民社會組織」使用的 iPhone 在 iMessage 中使用了零點擊漏洞進行攻擊。

Electron 也立即採取行動,並在同一天發布了新版本:如果您的應用程式渲染任何使用者提供的內容,您應該更新您的 Electron 版本 - v27.0.0-beta.2、v26.2.1、v25.8.1、v24.8.3 和 v22.3.24 都包含固定版本的 libwebp,這是負責渲染 webp 影像的程式庫。

既然我們都清楚地意識到「渲染影像」這種看似無害的互動可能是一種危險活動,我們希望藉此機會提醒大家,Electron 附帶一個程序沙箱,它可以限制下一次重大攻擊的影響範圍 — 無論它可能是什麼。

沙盒機制自 Electron v1 版本就已存在,並在 v20 版本預設啟用。但我們知道許多應用程式(尤其是一些存在已久的應用程式)可能在其程式碼中某處設定了 sandbox: false,或者設定了 nodeIntegration: true,這兩種情況在沒有明確設定 sandbox 時,都會禁用沙盒。這可以理解:如果您長期使用 Electron,您可能習慣於直接在執行 HTML/CSS 的程式碼中使用 require("child_process")require("fs") 等功能。

在討論如何遷移到沙盒機制之前,我們先來討論一下為什麼您需要它。

沙盒機制會在所有渲染器進程周圍設置一個嚴格的隔離區,確保無論內部發生什麼,程式碼都會在受限制的環境中執行。作為一個概念,它比 Chromium 早得多,並且是所有主要作業系統都提供的功能。Electron 和 Chromium 的沙盒機制是建立在這些系統功能之上的。即使您從不顯示使用者產生的內容,您也應該考慮渲染器可能被入侵的可能性:供應鏈攻擊等複雜的情境,以及小錯誤等簡單情境都可能導致渲染器執行您不完全預期的操作。

沙盒機制可以大幅降低這種情境的風險:在沙盒中的進程可以自由使用 CPU 週期和記憶體,僅此而已。進程無法寫入磁碟或顯示自己的視窗。在我們的 libwep 漏洞案例中,沙盒機制確保攻擊者無法安裝或執行惡意軟體。事實上,在最初針對員工 iPhone 的飛馬間諜軟體攻擊中,攻擊者專門針對一個未沙盒化的影像處理程序來獲取手機的存取權限,首先突破了正常沙盒化的 iMessage 的邊界。當發布像此範例中的 CVE 時,您仍然需要將您的 Electron 應用程式升級到安全版本,但在此期間,攻擊者可以造成的損害將大幅減少。

將一個普通的 Electron 應用程式從 sandbox: false 遷移到 sandbox: true 是一項艱鉅的任務。我知道,因為即使我親自撰寫了Electron 安全指南的初稿,我仍然沒有將我自己的應用程式遷移到使用它。這個情況在上週末改變了,我也建議您也更改它。

Don’t be scared by the number of line changes, most of it is in package-lock.json

您需要處理兩件事:

  1. 如果您在 preload 腳本或實際的 WebContents 中使用 Node.js 程式碼,您需要將所有這些 Node.js 互動移至主進程(或者,如果您想更進階一點,可以使用工具進程)。鑑於渲染器變得如此強大,您的程式碼很可能絕大多數都不需要重構。

    請參考我們關於進程間通訊的文件。就我而言,我移動了大量的程式碼,並將其包裝在 ipcRenderer.invoke()ipcMain.handle() 中,但整個過程很直接且快速完成。請留意您的 API 設計 — 如果您建立一個名為 executeCodeAsRoot(code) 的 API,沙盒機制就無法為您的使用者提供太多保護。

  2. 由於啟用沙盒會禁用預載入腳本中的 Node.js 整合,因此您無法再使用 require("../my-script")。換句話說,您的預載入腳本需要是一個單一檔案。

    有很多方法可以做到這一點:Webpack、esbuild、parcel 和 rollup 都可以完成這項工作。我使用了Electron Forge 的優秀 Webpack 外掛程式,同樣廣受歡迎的 electron-builder 的使用者可以使用electron-webpack

總而言之,整個過程花了我大約四天的時間 — 這還包括我絞盡腦汁思考如何駕馭 Webpack 的強大功能,因為我決定藉此機會以許多其他方式重構我的程式碼。

Electron 26.0.0

·2 分鐘閱讀

Electron 26.0.0 已發布!它包含了 Chromium 116.0.5845.62、V8 11.2 和 Node.js 18.16.1 的升級。請閱讀以下內容以了解更多詳情!


Electron 團隊很高興宣布 Electron 26.0.0 的發布!您可以使用 npm 安裝它,指令為 npm install electron@latest,或者從我們的發布網站下載。請繼續閱讀以了解有關此版本的詳細資訊。

如果您有任何意見回饋,請在 Twitter 上與我們分享,或加入我們的社群Discord!錯誤和功能請求可以在 Electron 的問題追蹤器中報告。

重大變更

堆疊變更

重大變更

已棄用:webContents.getPrinters

webContents.getPrinters 方法已被棄用。請改用 webContents.getPrintersAsync

const w = new BrowserWindow({ show: false });

// Deprecated
console.log(w.webContents.getPrinters());
// Replace with
w.webContents.getPrintersAsync().then((printers) => {
console.log(printers);
});

已棄用:systemPreferences.{get,set}AppLevelAppearancesystemPreferences.appLevelAppearance

systemPreferences.getAppLevelAppearancesystemPreferences.setAppLevelAppearance 方法已被棄用,systemPreferences.appLevelAppearance 屬性也已被棄用。請改用 nativeTheme 模組。

// Deprecated
systemPreferences.getAppLevelAppearance();
// Replace with
nativeTheme.shouldUseDarkColors;

// Deprecated
systemPreferences.appLevelAppearance;
// Replace with
nativeTheme.shouldUseDarkColors;

// Deprecated
systemPreferences.setAppLevelAppearance('dark');
// Replace with
nativeTheme.themeSource = 'dark';

已棄用:systemPreferences.getColoralternate-selected-control-text

systemPreferences.getColoralternate-selected-control-text 值已被棄用。請改用 selected-content-background

// Deprecated
systemPreferences.getColor('alternate-selected-control-text');
// Replace with
systemPreferences.getColor('selected-content-background');

新功能

  • 新增 safeStorage.setUsePlainTextEncryptionsafeStorage.getSelectedStorageBackend API。#39107
  • 新增 safeStorage.setUsePlainTextEncryptionsafeStorage.getSelectedStorageBackend API。#39155
  • senderIsMainFrame 新增至透過 ipcRenderer.sendTo() 發送的訊息。#39206
  • 新增對將選單標記為鍵盤啟動的支援。#38954

終止對 23.x.y 的支援

根據專案的支援政策,Electron 23.x.y 已達到支援終止。建議開發人員和應用程式升級到較新版本的 Electron。

E26(2023 年 8 月)E27 (2023 年 10 月)E28(2024 年 1 月)
26.x.y27.x.y28.x.y
25.x.y26.x.y27.x.y
24.x.y25.x.y26.x.y
22.x.y

下一步

短期內,您可以預期團隊會繼續專注於跟上組成 Electron 的主要元件(包括 Chromium、Node 和 V8)的開發進度。

您可以在這裡找到 Electron 的公開時程表

有關未來變更的更多資訊,請參閱計畫中的重大變更頁面。

Electron 25.0.0

·5 分鐘閱讀

Electron 25.0.0 已發布!它包含了 Chromium 114、V8 11.4 和 Node.js 18.15.0 的升級。請閱讀以下內容以了解更多詳情!


Electron 團隊很高興宣布 Electron 25.0.0 的發布!您可以使用 npm 安裝它,指令為 npm install electron@latest,或者從我們的發布網站下載。請繼續閱讀以了解有關此版本的詳細資訊。

如果您有任何意見回饋,請在 Twitter 上與我們分享,或加入我們的社群Discord!錯誤和功能請求可以在 Electron 的問題追蹤器中報告。

重大變更

重點

  • 在 Electron 的 net 模組中實作了 net.fetch,使用 Chromium 的網路堆疊。這與 Node 的 fetch() 不同,後者使用 Node.js 的 HTTP 堆疊。請參閱#36733#36606
  • 新增 protocol.handle,它取代並棄用了 protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol#36674
  • 為了符合 Chromium 和 Microsoft 的 Windows 7/8/8.1 棄用計畫,擴展了對 Electron 22 的支援。請參閱此部落格文章末尾的更多詳細資訊。

堆疊變更

重大變更

已棄用:protocol.{register,intercept}{Buffer,String,Stream,File,Http}Protocol

protocol.register*Protocolprotocol.intercept*Protocol 方法已被protocol.handle取代。

新的方法可以註冊新的協定或攔截現有的協定,而且回應可以是任何類型。

// Deprecated in Electron 25
protocol.registerBufferProtocol('some-protocol', () => {
callback({ mimeType: 'text/html', data: Buffer.from('<h5>Response</h5>') });
});

// Replace with
protocol.handle('some-protocol', () => {
return new Response(
Buffer.from('<h5>Response</h5>'), // Could also be a string or ReadableStream.
{ headers: { 'content-type': 'text/html' } },
);
});
// Deprecated in Electron 25
protocol.registerHttpProtocol('some-protocol', () => {
callback({ url: 'https://electron.dev.org.tw' });
});

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('https://electron.dev.org.tw');
});
// Deprecated in Electron 25
protocol.registerFileProtocol('some-protocol', () => {
callback({ filePath: '/path/to/my/file' });
});

// Replace with
protocol.handle('some-protocol', () => {
return net.fetch('file:///path/to/my/file');
});

已棄用:BrowserWindow.setTrafficLightPosition(position)

BrowserWindow.setTrafficLightPosition(position) 已被棄用,應改用 BrowserWindow.setWindowButtonPosition(position) API,它接受 null 而不是 { x: 0, y: 0 },以將位置重設為系統預設值。

// Deprecated in Electron 25
win.setTrafficLightPosition({ x: 10, y: 10 });
win.setTrafficLightPosition({ x: 0, y: 0 });

// Replace with
win.setWindowButtonPosition({ x: 10, y: 10 });
win.setWindowButtonPosition(null);

已棄用:BrowserWindow.getTrafficLightPosition()

BrowserWindow.getTrafficLightPosition() 已被棄用,應改用 BrowserWindow.getWindowButtonPosition() API,當沒有自訂位置時,它會傳回 null 而不是 { x: 0, y: 0 }

// Deprecated in Electron 25
const pos = win.getTrafficLightPosition();
if (pos.x === 0 && pos.y === 0) {
// No custom position.
}

// Replace with
const ret = win.getWindowButtonPosition();
if (ret === null) {
// No custom position.
}

新功能

  • 新增 net.fetch()#36733
    • net.fetch 支援對 file: URL 和使用 protocol.register*Protocol 註冊的自訂協定發出請求。#36606
  • 新增 BrowserWindow.set/getWindowButtonPosition API。#37094
  • 新增 protocol.handle,取代並棄用 protocol.{register,intercept}{String,Buffer,Stream,Http,File}Protocol#36674
  • webContents<webview> 標籤新增了 will-frame-navigate 事件,每當框架階層中的任何框架嘗試導覽時都會觸發。#34418
  • 將啟動器資訊新增至導覽器事件。此資訊可以區分 window.open 與導致導覽的父框架,而不是由子項啟動的導覽。#37085
  • 新增 net.resolveHost,它使用 defaultSession 物件解析主機。#38152
  • 新增 app 的 'did-resign-active' 事件。#38018
  • webContents.print() 中新增了幾個標準頁面大小選項。#37159
  • enableLocalEcho 標誌新增至工作階段處理程式 ses.setDisplayMediaRequestHandler() 回呼,允許當 audioWebFrameMain 時,將遠端音訊輸入回音到本機輸出串流中。#37315
  • powerMonitor 中新增了散熱管理資訊。#38028
  • 允許將絕對路徑傳遞給 session.fromPath() API。#37604
  • webContents 上公開 audio-state-changed 事件。#37366

22.x.y 持續支援

告別 Windows 7/8/8.1 中所述,Electron 22 (Chromium 108) 原訂的終止生命週期日期將從 2023 年 5 月 30 日延長至 2023 年 10 月 10 日。Electron 團隊將會持續將此計畫中的任何安全修復程式回溯至 Electron 22,直到 2023 年 10 月 10 日。10 月的支援日期與 Chromium 和 Microsoft 的延長支援日期一致。在 10 月 11 日,Electron 團隊將會將支援降回最新的三個穩定主要版本,這些版本將不再支援 Windows 7/8/8.1。

E25 (2023 年 5 月)E26(2023 年 8 月)E27 (2023 年 10 月)
25.x.y26.x.y27.x.y
24.x.y25.x.y26.x.y
23.x.y24.x.y25.x.y
22.x.y22.x.y--

下一步

短期內,您可以預期團隊會繼續專注於跟上組成 Electron 的主要元件(包括 Chromium、Node 和 V8)的開發進度。

您可以在這裡找到 Electron 的公開時程表

有關未來變更的更多資訊,請參閱計畫中的重大變更頁面。