# 附 FAQ
## Electron 何時升級到最新的 Chrome
Electron 中 Chrome 的版本通常在一個新的穩定 Chrome 版本發布后的一到兩周進行更新。這個結論并不能被保證,這取決于升級牽涉到的工作量。
只使用穩定渠道的 Chrome 。如果一個重要的修復在 beta 或者 dev 頻道,我們將會移植它。
更多信息,可以查閱 【安全說明】。
## Electron 何時升級到最新的 Node.js
當有一個最新版本的 Node.js 發行版,我們通常在升級之前等待一個月。所以可以避免在新的 Node.js 中經常引入的 bug 的影響。
Node.js 的新特性通常由 V8 的升級帶來,由于 Electron 使用 Chrome 瀏覽器裝載的 V8,新 Node.js 版本中帶入的 JavaScript 新特性通常已經存在于 Electron 中。
## 如何在 web 頁面中共享數據
要在 web 頁面(渲染進程)之間共享數據,簡單的方式是使用瀏覽器中已經可用的 HTML5 APIs。不錯的選擇是
[Storage API][storage], [`localStorage`][local-storage],
[`sessionStorage`][session-storage],和 [IndexedDB][indexed-db]。
或者你可以使用針對 Electron 的 IPC 系統,在主進程中存儲對象為一個全局變量,然后在渲染進程通過 `electron` 模塊的 `remote` 屬性訪問它們:
```javascript
// 主進程中
global.sharedObject = {
someProperty: 'default value'
}
```
```javascript
// 頁面 1
require('electron').remote.getGlobal('sharedObject').someProperty = 'new value'
```
```javascript
// 頁面 2
console.log(require('electron').remote.getGlobal('sharedObject').someProperty)
```
## 我的應用的窗口/托盤在幾分鐘之后消失
當用來存儲窗口/托盤的變量被垃圾回收時發生。
如果你遇到這個問題,下面的文章可以提供幫助:
* [內存管理][memory-management]
* [變量作用域](https://msdn.microsoft.com/library/bzt2dkta\(v=vs.94\).aspx)
你可以通過這樣修改你的代碼,以使變量全局化來快速解決這個問題:
從:
```javascript
const {app, Tray} = require('electron')
app.on('ready', () => {
const tray = new Tray('/path/to/icon.png')
tray.setTitle('hello world')
})
```
修改為:
```javascript
const {app, Tray} = require('electron')
let tray = null
app.on('ready', () => {
tray = new Tray('/path/to/icon.png')
tray.setTitle('hello world')
})
```
## 在 Electron 中我不能使用 jQuery/RequireJS/Meteor/AngularJS
由于 Electron 集成了 Node.js,有一些額外的符號被插入到 DOM,比如 `module`, `exports`, `require`。這對于某些庫會引發問題,因為它們可能需要插入同名的符號。
要解決這個問題,可以在 Electron 中關閉 Node 集成:
```javascript
// In the main process.
const {BrowserWindow} = require('electron')
let win = new BrowserWindow({
webPreferences: {
nodeIntegration: false
}
})
win.show()
```
但是如果你希望保留使用 Node.js 和 Electron APIs 的能力,必須要在引用其它庫之前在頁面中重命名這些符號:
```html
<head>
<script>
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` 為 undefined.
使用 Electron 的內置模塊時你能遇到這樣的錯誤:
```
> require('electron').webFrame.setZoomFactor(1.0)
Uncaught TypeError: Cannot read property 'setZoomLevel' of undefined
```
這是因為你已經全局或者局部安裝了 [npm `electron` module][electron-module] ,它覆蓋了 Electron 的內置模塊。
要驗證你是否使用正確的內建模塊,可以打印 `electron` 模塊的路徑:
```javascript
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` 模塊,或者重命名它。
```bash
npm uninstall electron
npm uninstall -g electron
```
盡管如此,如果你使用內建模塊時仍然碰到這個問題,非常可能是因為在錯誤的進程中使用這個模塊。例如, `electron.app` 只能用于主進程中,而 `electron.webFrame` 只能用于渲染進程。
**一些參考:**
* [內存管理]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management
* [變量作用域]: https://msdn.microsoft.com/library/bzt2dkta\(v=vs.94\).aspx
* [electron-module]: https://www.npmjs.com/package/electron
* [storage]: https://developer.mozilla.org/en-US/docs/Web/API/Storage
* [local-storage]: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
* [session-storage]: https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage
* [indexed-db]: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API
- 索引
- 前言.關于Electron
- 第一部分 開發指南
- 第1章.平臺支持
- 第2章.安全、原生功能和你的責任
- 第3章.版本說明
- 第4章.發行應用
- 第5章.Mac App商店提交指南
- 第6章.Windows商店指南
- 第7章.應用打包
- 第8章.使用Node原生模塊
- 第9章.調試主進程
- 9.1.在VSCode中調試
- 9.2.在node-inspector中調試
- 第10章.使用Selenium和WebDriver
- 第11章.DevTools擴展
- 第12章.使用Pepper Flash插件
- 第13章.使用Widevine CDM插件
- 第14章.通過自動化持續集成系統進行測試
- 第15章.離屏渲染
- 第二部分 使用教程
- 第16章.快速入門
- 第17章.桌面環境集成
- 第18章.在線/離線事件探測
- 第19章.應答式編譯器(REPL)
- 第三部分 API參考
- 第20章.API簡介
- 第21章.進程對象
- 第22章.Chrome的命令行開關
- 第23章.環境變量
- 第24章.定制的DOM元素
- 24.1.File 對象
- 24.2.webview 標簽
- 第25章.主進程模塊
- 25.1.app
- 25.2.BrowserWindow
- 25.3.無框架窗口
- 第26章.渲染進程模塊
- 第27章.兩種進程可用的模塊
- 第四部分 高級主題
- 附 FAQ
- 附 文檔規范
- 附 示例用例
- 1.無邊框窗口