Electron 常見問題

2019-08-14 19:20 更新

Electron 會在什么時候升級到最新版本的 Chrome?

通常來說,在穩(wěn)定版的 Chrome 發(fā)布后兩周內(nèi),我們會更新 Electron 內(nèi)的 Chrome 版本。

我們只會使用 stable 版本的 Chrome。但如果在 beta 或 dev 版本中有一個重要的更新,我們會把補丁應用到現(xiàn)版本的 Chrome 上。

Electron 會在什么時候升級到最新版本的 Node.js?

我們通常會在最新版的 Node.js 發(fā)布后一個月左右將 Electron 更新到這個版本的 Node.js。我們通過這種方式來避免新版本的 Node.js 帶來的 bug(這種 bug 太常見了)。

Node.js 的新特性通常是由新版本的 V8 帶來的。由于 Electron 使用的是 Chrome 瀏覽器中附帶的 V8 引擎,所以 Electron 內(nèi)往往已經(jīng) 有了部分新版本 Node.js 才有的嶄新特性。

如何在兩個網(wǎng)頁間共享數(shù)據(jù)?

在兩個網(wǎng)頁(渲染進程)間共享數(shù)據(jù)最簡單的方法是使用瀏覽器中已經(jīng)實現(xiàn)的 HTML5 API,比較好的方案是用 Storage API, localStorage,sessionStorage 或者 IndexedDB

你還可以用 Electron 內(nèi)的 IPC 機制實現(xiàn)。將數(shù)據(jù)存在主進程的某個全局變量中,然后在多個渲染進程中使用 remote 模塊來訪問它。

// 在主進程中
global.sharedObject = {
  someProperty: 'default value'
};
// 在第一個頁面中
require('remote').getGlobal('sharedObject').someProperty = 'new value';
// 在第二個頁面中
console.log(require('remote').getGlobal('sharedObject').someProperty);

為什么應用的窗口、托盤在一段時間后不見了?

這通常是因為用來存放窗口、托盤的變量被垃圾收集了。

你可以參考以下兩篇文章來了解為什么會遇到這個問題。

如果你只是要一個快速的修復方案,你可以用下面的方式改變變量的作用域,防止這個變量被垃圾收集。

app.on('ready', function() {
  var tray = new Tray('/path/to/icon.png');
})

改為

var tray = null;
app.on('ready', function() {
  tray = new Tray('/path/to/icon.png');
})

在 Electron 中,我為什么不能用 jQuery、RequireJS、Meteor、AngularJS?

因為 Electron 在運行環(huán)境中引入了 Node.js,所以在 DOM 中有一些額外的變量,比如 moduleexports和 require。這導致 了許多庫不能正常運行,因為它們也需要將同名的變量加入運行環(huán)境中。

我們可以通過禁用 Node.js 來解決這個問題,用如下的方式:

// 在主進程中
var mainWindow = new BrowserWindow({
  webPreferences: {
    nodeIntegration: false
  }
});

假如你依然需要使用 Node.js 和 Electron 提供的 API,你需要在引入那些庫之前將這些變量重命名,比如:

<head>
<script>
// 重命名 Electron 提供的 require
window.nodeRequire = require;
delete window.require;
delete window.exports;
delete window.module;
</script>
<script type="text/javascript" src="jquery.js"></script>
</head>

為什么 require('electron').xxx 的結(jié)果是 undefined?

在使用 Electron 的提供的模塊時,你可能會遇到和以下類似的錯誤:

> require('electron').webFrame.setZoomFactor(1.0);
Uncaught TypeError: Cannot read property 'setZoomLevel' of undefined

這是因為你在項目中或者在全局中安裝了npm 上獲取的 electron 模塊,它把 Electron 的內(nèi)置模塊覆寫了。

你可以通過以下方式輸出 electron 模塊的路徑來確認你是否使用了正確的模塊。

console.log(require.resolve('electron'));

確認以下它是不是像下面這樣的:

"/path/to/Electron.app/Contents/Resources/atom.asar/renderer/api/lib/exports/electron.js"

假如輸出的路徑類似于 node_modules/electron/index.js,那么你需要移除或者重命名 npm 上的 electron 模塊。

npm uninstall electron
npm uninstall -g electron

如果你依然遇到了這個問題,你可能需要檢查一下拼寫或者是否在錯誤的進程中調(diào)用了這個模塊。比如,require('electron').app 只能在主進程中使用, 然而 require('electron').webFrame 只能在渲染進程中使用。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號