# 附 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.无边框窗口