通常來說,在穩(wěn)定版的 Chrome 發(fā)布后兩周內(nèi),我們會更新 Electron 內(nèi)的 Chrome 版本。
我們只會使用 stable 版本的 Chrome。但如果在 beta 或 dev 版本中有一個重要的更新,我們會把補(bǔ)丁應(yīng)用到現(xiàn)版本的 Chrome 上。
我們通常會在最新版的 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)頁(渲染進(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)程的某個全局變量中,然后在多個渲染進(jìn)程中使用 remote
模塊來訪問它。
// 在主進(jìn)程中
global.sharedObject = {
someProperty: 'default value'
};
// 在第一個頁面中
require('remote').getGlobal('sharedObject').someProperty = 'new value';
// 在第二個頁面中
console.log(require('remote').getGlobal('sharedObject').someProperty);
這通常是因?yàn)橛脕泶娣糯翱?、托盤的變量被垃圾收集了。
你可以參考以下兩篇文章來了解為什么會遇到這個問題。
如果你只是要一個快速的修復(fù)方案,你可以用下面的方式改變變量的作用域,防止這個變量被垃圾收集。
從
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');
})
因?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 來解決這個問題,用如下的方式:
// 在主進(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 的提供的模塊時,你可能會遇到和以下類似的錯誤:
> 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
如果你依然遇到了這個問題,你可能需要檢查一下拼寫或者是否在錯誤的進(jìn)程中調(diào)用了這個模塊。比如,require('electron').app
只能在主進(jìn)程中使用, 然而 require('electron').webFrame
只能在渲染進(jìn)程中使用。
更多建議: