Electron 常見問題

2019-08-14 19:20 更新

Electron 會(huì)在什么時(shí)候升級(jí)到最新版本的 Chrome?

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

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

Electron 會(huì)在什么時(shí)候升級(jí)到最新版本的 Node.js?

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

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

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

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

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

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

為什么應(yīng)用的窗口、托盤在一段時(shí)間后不見了?

這通常是因?yàn)橛脕泶娣糯翱?、托盤的變量被垃圾收集了。

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

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

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?

因?yàn)?Electron 在運(yùn)行環(huán)境中引入了 Node.js,所以在 DOM 中有一些額外的變量,比如 module、exports和 require。這導(dǎo)致 了許多庫不能正常運(yùn)行,因?yàn)樗鼈円残枰獙⑼淖兞考尤脒\(yùn)行環(huán)境中。

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

// 在主進(jìn)程中
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 的提供的模塊時(shí),你可能會(huì)遇到和以下類似的錯(cuò)誤:

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

這是因?yàn)槟阍陧?xiàng)目中或者在全局中安裝了npm 上獲取的 electron 模塊,它把 Electron 的內(nèi)置模塊覆寫了。

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

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

確認(rèn)以下它是不是像下面這樣的:

"/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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)