跳至主要內容

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 時,以下 webPreferences 選項的預設值將被棄用,並改用下面列出的新預設值

屬性已棄用的預設值新預設值
contextIsolationfalsetrue
nodeIntegrationtruefalse
webviewTag如果設定了 nodeIntegration,則為其值,否則為 truefalse

請注意:目前存在已知錯誤 (#9736),如果啟用 contextIsolation,將會阻止 webview 標籤正常運作。請密切關注 GitHub 議題以獲取最新資訊!

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 版本中進行重大變更的資訊,請參閱我們的計劃重大變更文檔